跳到主要内容

缓存策略选择

项目中同时使用三种缓存方式,每种都有特定场景。


🎯 三种缓存方式

1. Spring Cache 注解 ⭐⭐⭐⭐⭐

适用场景: 业务方法返回值缓存

@Cacheable(value = "user:roles", key = "#userId")
public List<String> getUserRoleKeys(Long userId) {
return userMapper.selectRolesByUserId(userId);
}
优点说明
✅ 声明式业务逻辑与缓存逻辑分离
✅ 自动管理Spring 自动处理读取、写入、失效
✅ 统一配置TTL、序列化由 CacheManager 管理

2. RedisUtils 工具类 ⭐⭐⭐⭐

适用场景: 批量操作、复杂缓存逻辑

// 批量获取(MGET)— 一次网络请求
List<String> keys = ids.stream()
.map(id -> "user:detail:" + id)
.toList();
List<Object> cachedUsers = redisUtils.mGet(keys);

// 分布式锁
redisUtils.setIfAbsent("lock:order:123", "locked", 10, TimeUnit.SECONDS);
优点说明
✅ 精确控制完全控制缓存读写逻辑
✅ 批量操作支持 MGET/MSET
✅ 自定义 TTL每个操作可设不同过期时间

3. RedisTemplate 直接使用 ⭐⭐⭐

适用场景: 简单操作、配置类

// CacheWarmup 中的预热逻辑
for (SysRole role : roles) {
String key = "role:detail:" + role.getId();
redisTemplate.opsForValue().set(key, role, 1, TimeUnit.HOURS);
}
优点说明
✅ 简单直接无需封装
✅ 减少依赖配置类不用引入 RedisUtils

🏗️ 决策树

开始

├─ 是否是业务方法返回值缓存?
│ └─ 是 → 使用 Spring Cache 注解
│ └─ @Cacheable / @CacheEvict / @CachePut

├─ 是否需要批量操作 (MGET/MSET)?
│ └─ 是 → 使用 RedisUtils

├─ 是否有复杂缓存逻辑?
│ └─ 是 → 使用 RedisUtils

└─ 简单的 Redis 操作
└─ RedisTemplate 或 RedisUtils 都可以

📊 项目中的实际使用

位置方式用途
UserServiceImpl.getUserRoleKeys()Spring Cache缓存用户角色
RemoteUserServiceImpl.getUsersByIds()RedisUtils批量获取用户
CacheWarmup.warmupRoles()RedisTemplate启动预热

✅ 总结

场景推荐方式
方法返回值缓存Spring Cache
批量操作 (MGET/MSET)RedisUtils
分布式锁RedisUtils.setIfAbsent
复杂缓存逻辑RedisUtils
简单操作 / 配置类RedisTemplate
项目设计原则

合适的工具用在合适的场景 — 三种方式各司其职,架构清晰高效。