SpringVortexNotes

Redis 详情缓存放在数据拥有方

zjc 于 2026-08-24 发布

代码环境

这次提交没有新增独立的 service-cache 服务,而是把 Redis 缓存基础设施放在 service-common,把具体缓存放回数据拥有方 service-provider 的 Service 层。

公共配置:

spring:
  cache:
    type: redis

zjc:
  cache:
    redis:
      enabled: true
      key-prefix: "zjc:"
      default-ttl: 30m
      cache-ttls:
        provider:user:id: 30m
        provider:goods:id: 30m

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-provider/src/main/resources/config/application-redis.yaml

service-common 提供 JSON 值序列化、字符串 key 序列化、统一 key 前缀、默认 TTL、按 cacheName 覆盖 TTL 和故障降级。Redis 和 Spring Cache 依赖在公共模块中是 optional,只有业务服务自己引入 starter 后,自动配置才生效,Gateway 不会被强制带入 Redis 运行时。

Provider 的商品详情读取:

@Cacheable(cacheNames = "provider:goods:id", key = "#goodsId")
public GoodsDTO getGoods(Long goodsId) {
    return goodsConverter.entityToDto(getById(goodsId));
}

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-provider/src/main/java/com/zjc/provider/service/impl/GoodsServiceImpl.java

更新和删除后按 ID 驱逐:

@CacheEvict(cacheNames = "provider:goods:id", key = "#goods.goodsId")
public boolean updateGoods(Goods goods) {
    return updateById(goods);
}

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-provider/src/main/java/com/zjc/provider/service/impl/GoodsServiceImpl.java

最终 key 形如:

zjc:provider:goods:id:1

https://github.com/springvortex/spring-cloud-alibaba/blob/release/v1.0.0/service-common/src/test/java/com/zjc/common/cache/RedisCacheAutoConfigurationTest.java

放在 Service 层而不是 Controller 层,是因为缓存的是业务对象和数据库访问结果;放在 Provider 而不是 Consumer,是因为 Provider 是用户、商品数据的拥有方,能在写入后准确失效,避免双层缓存和跨服务失效不同步。

缓存故障策略也有边界:读和写失败记录 WARN,并继续执行数据库方法;清理失败记录 ERROR,因为旧数据可能保留到 TTL 到期。缓存不可用时业务可用,但一致性风险必须被看见。

经验总结

缓存不是独立服务边界,而是数据拥有方的一种访问策略。公共模块统一技术底座,业务模块决定哪些数据值得缓存、何时失效,这样职责更稳。

评论

评论由 GitHub Discussions 承载,需要 GitHub 账号登录。