缓存策略选择
项目中同时使用三种缓存方式,每种都有特定场景。
🎯 三种缓存方式
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 |
项目设计原则
合适的工具用在合适的场景 — 三种方式各司其职,架构清晰高效。