代码环境
- 仓库:https://github.com/springvortex/spring-cloud-alibaba.git
- 分支:
release/v1.0.0- JDK:
21- Spring Boot:
4.1.0
这次提交没有新增独立的 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
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));
}
更新和删除后按 ID 驱逐:
@CacheEvict(cacheNames = "provider:goods:id", key = "#goods.goodsId")
public boolean updateGoods(Goods goods) {
return updateById(goods);
}
最终 key 形如:
zjc:provider:goods:id:1
放在 Service 层而不是 Controller 层,是因为缓存的是业务对象和数据库访问结果;放在 Provider 而不是 Consumer,是因为 Provider 是用户、商品数据的拥有方,能在写入后准确失效,避免双层缓存和跨服务失效不同步。
缓存故障策略也有边界:读和写失败记录 WARN,并继续执行数据库方法;清理失败记录 ERROR,因为旧数据可能保留到 TTL 到期。缓存不可用时业务可用,但一致性风险必须被看见。
经验总结
缓存不是独立服务边界,而是数据拥有方的一种访问策略。公共模块统一技术底座,业务模块决定哪些数据值得缓存、何时失效,这样职责更稳。
评论
评论由 GitHub Discussions 承载,需要 GitHub 账号登录。