JetCache
JetCache
JetCache是一个基于Java的缓存系统封装,提供统一的API和注解来简化缓存的使用。
JetCache提供了比SpringCache更加强大的注解,可以原生的支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操作。
当前有四个实现,RedisCache、TairCache(此部分未在github开源)、CaffeineCache(in memory)和一个简易的LinkedHashMapCache(in memory),要添加新的实现也是非常简单的。
全部特性
- 通过统一的API访问Cache系统
- 通过注解实现声明式的方法缓存,支持TTL和两级缓存
- 通过注解创建并配置Cache实例
- 针对所有Cache实例和方法缓存的自动统计
- Key的生成策略和Value的序列化策略是可以配置的
- 分布式缓存自动刷新,分布式锁 (2.2+)
- 异步Cache API (2.2+,使用Redis的lettuce客户端时)
- Spring Boot支持
使用
Maven
1
2
3
4
5
6
7
8
9
10<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
<version>2.5.11</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25jetcache:
statIntervalMinutes: 15
areaInCacheName: false
# 本地缓存
local:
default:
type: linkedhashmap
keyConvertor: fastjson
limit: 100
expireAfterWriteInMillis: 3600000
expireAfterAccessInMillis: 3600000
# 远程缓存
remote:
default:
type: redis
keyConvertor: fastjson
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: ${spring.redis.host}
port: ${spring.redis.port}
password: ${spring.redis.password}启动类开启缓存
1
2
3
4
5
6
7
8
9
10// 用于激活@Cached注解的使用
@EnableMethodCache(basePackages = "com.ilubov.cache")
// 用于激活@CreateCache注解的使用
@EnableCreateCacheAnnotation
@SpringBootApplication
public class IlubovApplication {
public static void main(String[] args) {
SpringApplication.run(IlubovApplication.class);
}
}自定义缓存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75import cn.hutool.core.collection.CollUtil;
import com.alicp.jetcache.Cache;
import com.alicp.jetcache.anno.CreateCache;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ilubov.entity.SysCode;
import com.ilubov.service.SysCodeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
/**
* 编码缓存
*
* @author ilubov
* @date 2021/01/18
*/
@Slf4j
@Component
public class CodeCacheUtil {
private static final String CODE_NAME_PREFIX = "CODE_NAME_";
private static CodeCacheUtils instance = null;
public CodeCacheUtils() {
instance = this;
}
@Autowired
private SysCodeService sysCodeService;
@CreateCache(name = CODE_NAME_PREFIX)
private Cache<String, String> codeNameCache;
/**
* 初始化
*/
@PostConstruct
public void init() {
log.info("===> code cache init");
List<SysCode> sysCodes = sysCodeService.list();
if (CollUtil.isNotEmpty(sysCodes)) {
sysCodes.forEach(CodeCacheUtils::set);
}
}
/**
* 获取编码名称
*
* @param code
* @return
*/
public static String get(String code) {
return instance.codeNameCache.computeIfAbsent(code, (o) -> {
SysCode sysCode = instance.sysCodeService.getOne(new QueryWrapper<SysCode>()
.eq("code", code).last("limit 1"));
if (sysCode != null) {
return sysCode.getCodeName();
}
return code;
});
}
/**
* 设置编码名称
*
* @param sysCode
*/
public static void set(SysCode sysCode) {
instance.codeNameCache.put(sysCode.getCode(), sysCode.getCodeName());
}
}方法缓存
1
2
3
4public interface TestService {
TestVO getById(Long id);
}