当前位置: 代码网 > it编程>编程语言>Java > Spring Boot 缓存 与 Redis问题小结

Spring Boot 缓存 与 Redis问题小结

2025年07月21日 Java 我要评论
缓存是提升接口响应速度和降低数据库压力的重要手段。redis通过socket访问到缓存服务,效率比encache低,对集群和分布式支持友好。encache纯java的进程缓存,直接在jvm中进行缓存,

缓存是提升接口响应速度和降低数据库压力的重要手段。

redis

通过socket访问到缓存服务,效率比encache低,对集群和分布式支持友好。

encache

纯java的进程缓存,直接在jvm中进行缓存,速度快、效率高,但对分布式集群的支持不太好。

concurrenthashmap

manager

spring boot 默认提供的缓存管理器,线程安全,官方明确不建议在生产环境使用。

表 java缓存方案对比

1 缓存注解

spring boot 提供了缓存抽象层,并结合jsr-107标准,提供了多个缓存注解。

@cacheable

查询缓存。

@cacheput

更新缓存。

@cacheevict

删除缓存。

表 常用的缓存注解

这些注解作用于方法级别,在不侵入业务逻辑的前提下,实现缓存管理。它们是基于aop实现的,有以下注意项:

  1. 只能用于public方法上。
  2. 只有当调用方通过spring代理调用该方法时才生效。(同一个类中直接调用不生效)
  3. 需要启用缓存功能。@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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com