一、核心架構圖解
二、關鍵組件解析
1. 緩存注解與Redis映射
@Cacheable(value = "users", key = "#id")
public User getUser(Long id) { ... }
- Redis鍵生成:
cacheName::SpEL表達式結果
- 值序列化:默認使用JDK序列化,推薦JSON
2. RedisCacheManager配置
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(SerializationPair.fromSerializer(redisSerializer())).entryTtl(Duration.ofMinutes(30));return RedisCacheManager.builder(factory).cacheDefaults(config).build();
}
三、數據存儲結構
1. Redis數據結構
# String類型存儲
SET "users::1001" "{\"id\":1001,\"name\":\"Alice\"}"# Hash類型存儲(當使用@Cacheable的cacheNames多級時)
HSET "users" "1001" "{\"id\":1001,\"name\":\"Alice\"}"
2. TTL管理
四、緩存操作流程
五、高級特性實現
1. 緩存穿透防護
@Cacheable(value = "users", key = "#id", unless = "#result == null")
public User getUser(Long id) { // 返回null時不緩存
}
2. 分布式鎖同步
@CachePut(value = "users", key = "#user.id")
@Transactional
public User updateUser(User user) {// 使用Redisson實現分布式鎖RLock lock = redissonClient.getLock("user_lock:" + user.getId());try {lock.lock();// 業務邏輯} finally {lock.unlock();}
}
六、性能優化策略
1. 序列化優化
@Bean
public RedisTemplate<String, Object> redisTemplate() {RedisTemplate<String, Object> template = new RedisTemplate<>();template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new GenericJackson2JsonRedisSerializer());return template;
}
2. 批量操作
@Cacheable(value = "users", keyGenerator = "batchKeyGenerator")
public List<User> batchGetUsers(List<Long> ids) {// 使用Redis管道批量獲取
}
七、監控與故障排查
1. 緩存命中率統計
Cache cache = cacheManager.getCache("users");
RedisCacheStatistics stats = ((RedisCache) cache).getStatistics();
System.out.println("命中率: " + stats.getHitRatio());
2. 常見問題排查表
現象 | 可能原因 | 解決方案 |
---|---|---|
緩存數據不一致 | 未正確使用@CacheEvict | 添加事務管理,確保先更新數據庫再清除緩存 |
反序列化失敗 | 序列化方式不一致 | 統一客戶端和服務端的序列化配置 |
內存溢出 | 未設置TTL或內存淘汰策略 | 配置合理的過期時間和LRU淘汰策略 |
高延遲 | 大Value值存儲 | 壓縮數據或拆分存儲 |
通過合理配置Spring Cache與Redis的集成,可以實現:
- 透明化緩存管理:業務代碼無需關注緩存實現
- 高性能數據訪問:減少數據庫壓力
- 分布式一致性:通過Redis實現多節點緩存同步
- 靈活的策略配置:按需定制過期時間、序列化方式等
實際應用中需注意:
- 避免過度緩存導致內存壓力
- 保持緩存與數據源的一致性
- 監控緩存命中率和響應時間
- 定期進行緩存清理和維護