目前 jetcache 支持的本地缓存方案有两种,远程缓存支持两种,分别如下:
Tair
<dependency>
<groupId>com.alicp.jetcachegroupId>
<artifactId>jetcache-starter-redisartifactId>
<version>2.6.2version>
dependency>
远程方案基本配置,当前默认使用的远程方案是 redis
jetcache:
statIntervalMinutes: 1
local:
default:
type: linkedhashmap
keyConvertor: fastjson
remote:
default:
type: redis
host: localhost
port: 6379
keyConvertor: fastjson
valueEncode: java
valueDecode: java
poolConfig:
maxTotal: 50
localdemo: # 自定义本地文件夹内(area)
type: redis
host: localhost
port: 6379
keyConvertor: fastjson
valueEncode: java
valueDecode: java
poolConfig:
maxTotal: 50
remotedemo: # 自定义远程文件夹内(area)
type: redis
host: localhost
port: 6379
keyConvertor: fastjson
valueEncode: java
valueDecode: java
poolConfig:
maxTotal: 50
其中 poolConfig 是必配项,否则会报错
步骤③:启用缓存,在引导类上方标注注解 @EnableCreateCacheAnnotation 配置 springboot 程序中可以使用注解的形式创建缓存
@EnableCreateCacheAnnotation # 可以不要,属性缓存注解
@EnableMethodCache(basePackages = "com.example.demo")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
cacheType 控制当前缓存使用本地缓存还是远程缓存,配置 cacheType=CacheType.LOCAL 即使用本地缓存。
在创建缓存的时候,配置 cacheType 为 BOTH 即则本地缓存与远程缓存同时使用。
cacheType 如果不进行配置,默认值是 REMOTE,即仅使用远程缓存方案。关于 jetcache 的配置,参考以下信息
属性 | 默认值 | 说明 |
---|---|---|
jetcache.statIntervalMinutes | 0 | 统计间隔,0 表示不统计 |
jetcache.hiddenPackages | 无 | 自动生成 name 时,隐藏指定的包名前缀 |
jetcache.[local|remote].${area}.type | 无 | 缓存类型,本地支持 linkedhashmap、caffeine,远程支持 redis、tair |
jetcache.[local|remote].${area}.keyConvertor | 无 | key 转换器,当前仅支持 fastjson |
jetcache.[local|remote].${area}.valueEncoder | java | 仅 remote 类型的缓存需要指定,可选 java 和 kryo |
jetcache.[local|remote].${area}.valueDecoder | java | 仅 remote 类型的缓存需要指定,可选 java 和 kryo |
jetcache.[local|remote].${area}.limit | 100 | 仅 local 类型的缓存需要指定,缓存实例最大元素数 |
jetcache.[local|remote].${area}.expireAfterWriteInMillis | 无穷大 | 默认过期时间,毫秒单位 |
jetcache.local.${area}.expireAfterAccessInMillis | 0 | 仅 local 类型的缓存有效,毫秒单位,最大不活动间隔 |
以上方案仅支持手工控制缓存,但是 springcache 方案中的方法缓存特别好用,给一个方法添加一个注解,方法就会自动使用缓存。jetcache 也提供了对应的功能,即方法缓存。
package com.example.demo.controller;
import com.alicp.jetcache.anno.*;
import com.example.demo.entity.User;
import com.example.demo.service.IUserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;
/**
* @author 蔡定努
* @date 2023/10/05 14:41
*/
@RestController
public class CacheController {
@Resource
private IUserService userService;
/**
* 使用缓存
* @author 蔡定努
*/
@GetMapping("get")
@Cached(name = "user:", key = "#id", expire = 36000, cacheType = CacheType.BOTH)
@CacheRefresh(refresh = 5,timeUnit = TimeUnit.MINUTES) //定时刷新缓存
public User get(String id) {
return userService.getById(id);
}
@GetMapping("areaGet")
@Cached(area = "demo",name = "user:", key = "#id", expire = 36000, cacheType = CacheType.REMOTE)
public User areaGet(String id) {
return userService.getById(id);
}
/**
*
* 删除缓存
* @author 蔡定努
*/
@GetMapping("in")
@CacheInvalidate(name = "user:", key = "#id")
public void invaid(String id) {
// 数据处理逻辑
}
/**
* 更新缓存
* @author 蔡定努
*/
@PostMapping("upadte")
@CacheUpdate(name = "user:", key = "#id", value = "#user")
public void upadte(@RequestBody User user) {
// 跟新user
userService.updateById(user);
// int a=1/0; //缓存不一致
}
}
设置后,每 1 分钟在控制台输出缓存数据命中信息
2023-10-05 16:15:00.013 INFO 16027 --- [DefaultExecutor] c.alicp.jetcache.support.StatInfoLogger : jetcache stat from 2023-10-05 16:14:28,692 to 2023-10-05 16:15:00,003
cache | qps| rate| get| hit| fail| expire|avgLoadTime|maxLoadTime
----------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------
demo_user:| 0.08| 50.00%| 2| 1| 0| 0| 149.0| 149
----------+----------+-------+--------------+--------------+--------------+--------------+-----------+-----------
总结