在微服务拆分的电商系统中,缓存策略的选择需要结合微服务的独立性、数据特性、交互模式以及电商场景的高并发、高可用、数据一致性等核心需求,分层、分服务制定策略。以下是具体的选择思路和实践方向:
一、先明确微服务电商的缓存设计原则
服务内缓存优先,跨服务缓存谨慎
微服务的核心是 “数据自治”,每个服务应优先缓存自身域内的数据(如商品服务缓存商品信息、订单服务缓存订单状态),减少跨服务调用依赖。跨服务缓存(如依赖其他服务的数据)需严格控制一致性,避免数据混乱。
分层缓存,减少 “缓存穿透” 到数据库
结合 “本地缓存 + 分布式缓存” 形成多级缓存(如应用内存缓存→Redis→数据库),减轻分布式缓存压力,同时降低单节点故障影响。
按数据特性匹配缓存策略
不同服务的数据(如商品基本信息、库存、用户购物车、促销规则)更新频率、访问热度、一致性要求差异大,需针对性设计。

二、核心微服务的缓存策略选择
1. 商品服务(核心高频访问)
数据特点:
商品基本信息(名称、图片、规格):访问频率极高,更新频率低(非实时)。
商品详情(描述、参数):访问量中等,更新少,但数据量大(可能包含富文本)。
缓存策略:
多级缓存:
本地缓存(如 Caffeine、Guava):存储热门商品基本信息(Top 10 万),减少分布式缓存请求。
分布式缓存(如 Redis):存储全量商品基本信息 + 热门商品详情,设置较长过期时间(如 24 小时)。
更新机制:
商品信息更新时,通过消息队列(如 RabbitMQ)通知缓存删除(delete),避免直接更新缓存(防止并发更新冲突)。
详情页等大体积数据:采用 “缓存预热 + 按需加载”,上线前预热热门商品,冷数据首次访问后缓存。
2. 库存服务(高并发 + 强一致性)
数据特点:
库存数量:访问频率极高(下单、商品详情页均需查询),更新频繁(下单扣减、取消订单恢复),强一致性要求(不允许超卖)。
缓存策略:
分布式缓存(Redis)为主:
库存数据必须存储在 Redis 中,且需保证与数据库一致(避免缓存与 DB 数据不一致导致超卖)。
采用Redis 原子操作(如decr)处理库存扣减,结合 Lua 脚本保证扣减逻辑原子性(防止并发扣减超卖)。
更新机制:
库存变更时,先更新数据库,再更新 Redis(或通过事务确保两者同步),避免 “先更缓存再更 DB” 的不一致风险。
高并发场景(如秒杀):提前将库存加载到 Redis,采用 “预扣减 + 异步确认”,下单时先扣减 Redis 库存,成功后异步同步到 DB,失败则回滚 Redis。

3. 用户服务(用户信息、购物车)
数据特点:
用户基本信息(昵称、头像):访问频率中等,更新少,一致性要求低(允许短暂不一致)。
购物车:访问频率高,更新频繁(添加、删除商品),用户私有数据,需与用户绑定。
缓存策略:
用户信息:
分布式缓存(Redis)存储,Key 为user:{userId},过期时间设为用户登录时长 + 冗余时间(如 2 小时),用户登录时刷新缓存。
购物车:
未登录用户:购物车存储在浏览器 LocalStorage,登录后合并到服务端。
登录用户:购物车数据存储在 Redis(Key 为cart:{userId}),采用 Hash 结构存储商品 ID 与数量,支持快速增删改。
更新机制:实时同步(添加 / 删除商品时直接更新 Redis),定期异步同步到数据库(防止 Redis 故障丢失数据)。
4. 订单服务(高频读写 + 状态流转)
数据特点:
订单状态(待支付、已发货等):访问频率中等(用户查询、系统自动状态更新),更新频繁(状态流转),一致性要求高(状态需准确)。
缓存策略:
分布式缓存(Redis)+ 本地缓存:
本地缓存:存储用户最近订单(如 3 天内),减少重复查询。
Redis:存储活跃订单(如 7 天内未完成订单),Key 为order:{orderId},状态更新时同步更新缓存。
更新机制:
订单状态变更通过状态机管理,每次变更后同步更新 Redis(如 “支付成功” 后立即更新缓存状态),避免缓存与 DB 状态脱节。
历史订单(超过 30 天):从数据库查询,不缓存(访问频率低,节省缓存空间)。
5. 促销服务(规则复杂 + 时效性)
数据特点:
促销规则(满减、折扣、优惠券):访问频率高(下单、商品详情页计算优惠),更新集中(活动上线 / 下线时),时效性强(活动有开始 / 结束时间)。
缓存策略:
分布式缓存(Redis):
存储促销规则的结构化数据(如 JSON),Key 包含活动 ID 和时间维度(如promo:{activityId}:{date})。
活动上线前预热缓存,下线时主动删除缓存,避免无效规则被使用。
本地缓存辅助:
本地缓存存储当前生效的热门活动规则,减少 Redis 查询压力,设置较短过期时间(如 10 分钟),保证规则及时更新。

三、跨服务交互的缓存处理
微服务间常通过 API 调用获取数据(如订单服务调用商品服务获取商品名称),此时需避免 “跨服务缓存依赖” 导致的一致性问题:
禁止缓存跨服务 API 结果:除非明确该数据更新频率极低(如商品分类),否则缓存易因上游服务数据变更而失效。
上游服务主动通知:若下游服务必须缓存上游数据,上游服务更新数据时需通过消息队列通知下游服务删除缓存(如商品名称变更时,通知订单服务清理相关缓存)。
四、缓存中间件的选择建议
Redis:作为核心分布式缓存,支持丰富数据结构(String、Hash、Set)和原子操作,适合库存、购物车、促销等场景。
本地缓存:Caffeine(性能优于 Guava)适合商品基本信息等高频访问、小体积数据。
大体积数据:对于商品详情等大文本,可结合 Redis + 压缩(如 Snappy)存储,或使用分布式缓存中间件(如 Memcached)处理纯 KV 场景。
总结
微服务电商的缓存策略需 **“分服务、分数据、分层设计”**:
高频低更数据(商品基本信息):多级缓存 + 预热,优先本地缓存。
高频高更 + 强一致数据(库存):Redis 原子操作 + DB 同步,杜绝超卖。
用户私有数据(购物车):Redis 实时同步,结合本地存储。
时效性数据(促销):缓存预热 + 主动清理,保证规则生效。
同时,需通过监控(如 Redis 命中率、缓存穿透率)持续优化,避免缓存雪崩(过期时间集中)、穿透(缓存未命中直击 DB)等风险。