这两种方式在 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(推荐)

  1. 登录态、token、验证码 → 用 redisTemplate,因为需要灵活控制 TTL 和删除。
  2. 数据库查询结果 → 用 @Cacheable,让 Spring Cache 自动管理,减少手写代码。
  3. 如果需要统一配置 TTL → 在 RedisCacheManager 里配置,不要在业务里硬编码。

更多推荐