当前位置: 首页 > news >正文

Spring Boot 缓存 与 Redis

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

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 生成策略需实现的接口

    @Beanpublic 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 {@Beanpublic 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.3 Redis 缓存问题

1 缓存穿透:查询一个根本不存在的数据,导致每次查询都会访问数据库。

使用布隆过滤器(检索元素是否存在集合中)。它内存占用小。判断元素存在有误差,但是判断元素不存在绝对准确。

2 缓存击穿:某个热点key突然实现,大量请求同时访问时,会击穿缓存直接访问数据库。

使用互斥锁或逻辑过期。也可以设置热点key永不过期或是后台刷新热点key缓存。

3 缓存雪崩:大量缓存key同时失效,大量请求直接访问数据库。发生场景有:1)缓存服务器重启;2)大量缓存设置相同过期时间。

缓存key的过期时间随机化。

http://www.lryc.cn/news/589739.html

相关文章:

  • XXE漏洞2-漏洞原理及检测方式(超详细)
  • HandlerIntercepter,JWT和杂项知识点
  • LeetCode Hot 100 二叉树的最大深度
  • 【Java】【力扣】94.二叉树的中序遍历
  • C#获取当前系统账户是否为管理员账户
  • LeetCode经典题解:141、判断链表是否有环
  • LeetCode Hot100【4. 寻找两个正序数组的中位数】
  • C++之unordered_xxx基于哈希表(链地址法)的自我实现(难)
  • 逆向入门(39、40)程序逆向篇-DaNiEl-RJ.1、genocide1
  • 【LeetCode 热题 100】543. 二叉树的直径——DFS
  • STM32-RTC内部时钟
  • fastadmin会员单点登录
  • C#语法基础总结(超级全面)
  • flutter app内跳转到其他安卓 app的方法
  • HTML 入门教程:从零开始学习网页开发基础
  • HTML基础P1 | HTML基本元素
  • Android 升级targetSdk无法启动服务
  • APIs案例及知识点串讲(上)
  • FreeRTOS中断管理STM32
  • Java-74 深入浅出 RPC Dubbo Admin可视化管理 安装使用 源码编译、Docker启动
  • 【docker】将本地镜像打包部署到服务器上
  • LVS:高性能负载均衡利器
  • CVE-2005-4900:TLS SHA-1 安全漏洞修复详解
  • WIN10系统优化篇(一)
  • Samba服务器
  • 【RTSP从零实践】12、TCP传输H264格式RTP包(RTP_over_TCP)的RTSP服务器(附带源码)
  • Vue 结合 Zabbix API 获取服务器 CPU、内存、GPU 等数据
  • Thymeleaf 基础语法与标准表达式详解
  • [Linux入门] Linux 账号和权限管理入门:从基础到实践
  • 如何通过扫描电镜检测汽车清洁度中的硬质颗粒并获取成分信息