java_redis缓存_两种方式比较应用场景_redisTemplate.opsForValue().set/get 对比 @Cacheable注释函数
·
这两种方式在 Spring Boot 3.x + Redis 里都能用,但适用场景和最佳实践不一样。
🔹 方法一:直接用 redisTemplate.opsForValue().set/get
redisTemplate.opsForValue().set(
RedisConst.USER_LOGIN_KEY_PREFIX + user.getId(),
userLoginVo,
RedisConst.USERKEY_TIMEOUT,
TimeUnit.DAYS
);
UserLoginVo userLoginVo = (UserLoginVo) redisTemplate.opsForValue().get(
RedisConst.USER_LOGIN_KEY_PREFIX + userId
);
✅ 优点
- 灵活:完全自己控制 key 规则、TTL 时长、序列化方式。
- 适合 登录态、验证码、临时 token、会话信息 等。
- 可以直接做
setnx、expire等操作,方便做 分布式锁 / 限流。
❌ 缺点
- 代码侵入性高,业务里要写很多
redisTemplate.xxx。 - 容易 key 拼错,或者 TTL 忘记设置,导致 bug。
- 不适合复杂缓存策略(例如条件缓存、自动更新)。
🔹 方法二:用 @Cacheable(Spring Cache 抽象)
@Cacheable(value = "userPositionCount",
key = "#regionId + ':' + #uuid + ':' + #minLon + ':' + #maxLon + ':' + #minLat + ':' + #maxLat")
public Integer getNearestUsersCount(Long regionId, Long uuid,
Double minLon, Double maxLon,
Double minLat, Double maxLat) {
// 实际查询 DB 的逻辑
}
✅ 优点
- 零侵入:你不用自己写 get/set,Spring 自动帮你从缓存拿数据。
- 统一管理:可以在
RedisCacheManager里配置不同 cache 的 TTL。 - 适合 函数式缓存 → 相同参数只执行一次,结果直接缓存。
- 支持注解:
@Cacheable、@CachePut、@CacheEvict,统一清理缓存。
❌ 缺点
- 粒度较粗:不好做分布式锁/限流。
- 需要配置好
CacheManager,不如直接redisTemplate灵活。
🔹 场景区别 & 联系
-
直接用
redisTemplate:适合做 业务型缓存,比如:- 登录态保存(token -> user info)
- 手机验证码(手机号 -> code)
- 临时黑名单/白名单
- 分布式锁、限流计数
-
用
@Cacheable:适合做 查询结果缓存,比如:- 数据库查询结果
- 复杂计算结果
- 统计值(用户数、附近场馆数)
👉 二者可以 混合使用:
- 认证鉴权、token、session 走
redisTemplate。 - 数据查询、统计分析结果走
@Cacheable。
🔹 最佳实践 1(推荐)
- 登录态、token、验证码 → 用
redisTemplate,因为需要灵活控制 TTL 和删除。 - 数据库查询结果 → 用
@Cacheable,让 Spring Cache 自动管理,减少手写代码。 - 如果需要统一配置 TTL → 在
RedisCacheManager里配置,不要在业务里硬编码。
更多推荐



所有评论(0)