缓存是提升接口响应速度和降低数据库压力的重要手段。
redis | 通过socket访问到缓存服务,效率比encache低,对集群和分布式支持友好。 |
encache | 纯java的进程缓存,直接在jvm中进行缓存,速度快、效率高,但对分布式集群的支持不太好。 |
concurrenthashmap manager | spring boot 默认提供的缓存管理器,线程安全,官方明确不建议在生产环境使用。 |
表 java缓存方案对比
1 缓存注解
spring boot 提供了缓存抽象层,并结合jsr-107标准,提供了多个缓存注解。
@cacheable | 查询缓存。 |
@cacheput | 更新缓存。 |
@cacheevict | 删除缓存。 |
表 常用的缓存注解
这些注解作用于方法级别,在不侵入业务逻辑的前提下,实现缓存管理。它们是基于aop实现的,有以下注意项:
- 只能用于public方法上。
- 只有当调用方通过spring代理调用该方法时才生效。(同一个类中直接调用不生效)
- 需要启用缓存功能。@enablecaching。
1.1 缓存key 生成策略
缓存注解keygenerator字段用于指定该方法缓存key的生成策略。

图 key 生成策略需实现的接口
@bean
public keygenerator paramskeygenerator() {
return ((target, method, params) -> {
stringbuilder sb = new stringbuilder();
sb.append(target.getclass().getsimplename());
sb.append("::");
sb.append(method.getname());
for (object obj : params) {
sb.append("::");
sb.append(obj.tostring());
}
return sb.tostring();
});
}2 redis 缓存策略
maven依赖:
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-redis</artifactid>
</dependency>缓存策略配置:
@configuration
@enablecaching
public class cacheconfig {
@bean
public cachemanager cachemanager(redisconnectionfactory factory) {
rediscacheconfiguration config = rediscacheconfiguration.defaultcacheconfig()
.entryttl(duration.ofminutes(30))
.disablecachingnullvalues() // 避免缓存穿透
.serializekeyswith(redisserializationcontext.serializationpair.fromserializer(new stringredisserializer()))
.serializevalueswith(redisserializationcontext.serializationpair.fromserializer(new genericjackson2jsonredisserializer()));
return rediscachemanager.builder(factory)
.cachedefaults(config)
.build();
}
}2.1 redis 连接池
spring boot 2.x 默认使用lettuce作为redis客户端。
lettuce | 基于netty的异步非阻塞通信;原生线程安全;长连接lettuce性能优势更明显;cpu利用率更高效。 |
jedis | 同步阻塞通信;非线程安全; |
表 lettuce 与 jedis对比
2.2 redis 缓存问题
1 缓存穿透:查询一个根本不存在的数据,导致每次查询都会访问数据库。
使用布隆过滤器(检索元素是否存在集合中)。它内存占用小。判断元素存在有误差,但是判断元素不存在绝对准确。
2 缓存击穿:某个热点key突然实现,大量请求同时访问时,会击穿缓存直接访问数据库。
使用互斥锁或逻辑过期。也可以设置热点key永不过期或是后台刷新热点key缓存。
3 缓存雪崩:大量缓存key同时失效,大量请求直接访问数据库。发生场景有:1)缓存服务器重启;2)大量缓存设置相同过期时间。
缓存key的过期时间随机化。
到此这篇关于spring boot 缓存 与 redis的文章就介绍到这了,更多相关spring boot 缓存 redis内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论