用途:在 Spring Boot 项目中集成 Redis,用于缓存、会话存储、限流等场景。
依赖:需引入 spring-boot-starter-data-redis 与 spring-boot-starter-cache。
配置:通过 @Configuration 与 @EnableCaching 启用缓存;定义 RedisTemplate,键用 StringRedisSerializer,值用 GenericJackson2JsonRedisSerializer(JSON 而非 Java 序列化);定义 RedisCacheManager,设置默认 TTL、序列化方式并调用 disableCachingNullValues(),可为不同缓存单独配置 TTL。
键命名约定:{app}:{domain}:{id}、{app}:{domain}:list:{filter}、{app}:session:{userId}、{app}:ratelimit:{ip}。
声明式缓存:使用 @Cacheable 读取、@CachePut 写入后更新、@CacheEvict 删除或清空。手动 cache-aside 模式则通过 RedisTemplate 的 opsForValue().get/set/delete 自行读写并设置 TTL。
限流:用 increment 计数,首次计数时设置 expire 窗口,判断是否超过阈值。
缓存击穿:热点键过期时并发请求同时回源,可用 @Cacheable(sync = true) 让单实例内仅一个线程计算;跨实例可加带 TTL 的 Redis 锁(SETNX),并给 TTL 加抖动避免同时过期。
配置示例:application.yml 中设置 spring.data.redis 的 host、port、password、timeout 及 lettuce 连接池参数,spring.cache.type 设为 redis。
常见陷阱:值勿用 Java 序列化;勿缓存带 JPA 懒加载字段的实体,应缓存 DTO;必须设置 TTL;勿忘 @EnableCaching;用 disableCachingNullValues() 避免缓存空值;热点键用 sync = true 防击穿;TTL 加抖动。