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

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.xdnf.cn/news/15496.html

相关文章:

  • WPF 多窗口分文件实现方案
  • 网络安全(初级)(XSS-labs 1-8)
  • flink sql如何对hive string类型的时间戳进行排序
  • APIs案例及知识点串讲(上)
  • Jenkins全方位CI/CD实战指南
  • 向量数据库Faiss vs Qdrant全面对比
  • 理解大模型的对话和检索能力
  • JWT基础详解
  • 外网访问禅道软件项目管理系统,简单几步将本地内网IP端口设置互联网在线用
  • YOLO13正式发布!考虑将yolov13的创新点融合到半监督中,构建YOLOv13_ssod
  • MySQL 备份与恢复指南
  • 力扣-使用双指针的方法的题们(持续更新中。。。
  • Java全栈工程师面试实录:从电商支付到AI大模型的应用场景与技术栈解析
  • nlp论文:分本分类:《Bag of Tricks for Efficient Text Classification》
  • Pytorch中张量的索引和切片使用详解和代码示例
  • [ROS 系列学习教程] ROS动作通讯(Action):通信模型、Hello World与拓展
  • B/S 架构通信原理详解
  • 【数据结构】单链表练习(有环)
  • C++(STL源码刨析/stack/queue/priority_queue)
  • Rocky Linux 9 源码包安装php8
  • I3C通信协议核心详解
  • 描述统计1
  • 百度移动开发面经合集
  • 【PCIe 总线及设备入门学习专栏 5.1.2 -- PCIe EP core_rst_n 与 app_rst_n】
  • Java 大视界 -- Java 大数据机器学习模型在金融风险传染路径分析与防控策略制定中的应用(347)
  • HTML网页结构(基础)
  • 使用Spring Cloud LoadBalancer报错java.lang.IllegalStateException
  • Nestjs框架: 数据库架构设计与 NestJS 多 ORM 动态数据库应用与连接池的配置
  • QTableView鼠标双击先触发单击信号
  • 项目进度与预算脱节,如何进行同步管理