| ||||||||||||||||||||||||||||||||||||
电商系统的缓存策略选择需紧密结合其业务场景特性(如读写频率、数据一致性要求、流量波动)和技术架构特点(如微服务拆分、数据存储分布),避免 “一刀切”。以下是针对电商核心场景的缓存策略选择方法,按业务模块分类说明: 一、商品模块:读多写少,优先优先保证响应速度 商品模块(商品详情、分类列表、搜索结果)是电商系统的 “流量入口”,特点是读请求量极大(占比 90%+)、写操作少(仅商品上下架 / 编辑时更新)、数据变更频率低。 核心目标:最大化缓存命中率,减少数据库压力,支撑高并发读。 1. 缓存策略选择 缓存介质:分布式缓存(Redis)为主,本地缓存(Caffeine)为辅(缓存热点商品)。 更新策略:Cache-Aside(先更库,再删缓存) 流程:更新商品信息时,先修改数据库,再删除对应缓存 Key(而非直接更新缓存),下次读请求会自动从数据库加载最新数据并写入缓存。 优势:避免 “更新缓存” 的额外开销,适合写频率低的场景。 过期策略: 普通商品:设置中等过期时间(如 30 分钟)+ 随机偏移量(避免集中失效)。 热点商品(如爆款、首页推荐):逻辑永不过期(移除物理过期时间),通过后台定时任务主动更新缓存。 特殊处理: 商品搜索结果:缓存分页数据(如search:手机:page1),设置较短过期时间(如 5 分钟),结合搜索引擎(Elasticsearch)的缓存机制。 商品规格 / 库存:库存数据单独缓存(product:1001:stock),与商品基本信息分离,避免库存高频更新导致基本信息缓存频繁失效。
二、订单模块:写多读少,需保证数据一致性 订单模块(订单创建、状态更新、历史查询)的特点是写操作密集(下单、支付、发货等状态变更)、读操作集中在用户查询历史订单、数据强一致性要求(如订单状态必须实时准确)。 核心目标:平衡缓存效率与数据一致性,避免因缓存导致业务异常(如显示已取消但实际已支付)。 1. 缓存策略选择 缓存介质:分布式缓存(Redis),不建议用本地缓存(避免多实例数据不一致)。 更新策略:Write-Through(先更库,再同步更新缓存) 或 异步更新(基于消息队列) 核心订单状态(如 “待支付”“已发货”):采用 Write-Through,更新数据库后立即更新缓存(如order:12345 → {status: "已支付", ...}),确保读请求能获取最新状态。 非核心数据(如订单物流轨迹):数据库更新后发送 MQ 消息,异步更新缓存,减少主流程耗时。 过期策略: 近期订单(30 天内):缓存时间较长(如 7 天),方便用户频繁查询。 历史订单(30 天以上):不缓存或设置短过期时间(如 1 小时),通过数据库分页查询,减少缓存内存占用。 特殊处理: 订单 ID 生成:用 Redis 生成自增 ID(incr order_id),避免数据库自增 ID 的性能瓶颈。 防重复下单:用 Redis 分布式锁(setnx order:lock:user123 → 1)确保同一用户同一商品不会重复下单。 三、购物车模块:高频读写,需兼顾性能与实时性 购物车模块(添加商品、修改数量、删除商品)的特点是读写频率都极高(用户可能反复操作)、数据与用户强绑定(每个用户的购物车独立)、允许短暂不一致(如商品价格变动,下次打开时刷新即可)。 核心目标:支撑高频读写,减少数据库交互,同时保证用户操作流畅。 1. 缓存策略选择 缓存介质:分布式缓存(Redis),推荐用 Hash 结构存储(如cart:user123 → {商品ID1: 数量, 商品ID2: 数量})。 更新策略:直接写缓存,异步同步数据库 流程:用户添加 / 修改购物车时,先更新 Redis(如hincrby cart:user123 1001 1),再通过异步线程或 MQ 同步到数据库(避免阻塞用户操作)。 优势:写操作耗时极短(Redis 单命令微秒级),用户体验流畅。 过期策略: 登录用户购物车:长期有效(与用户账号绑定),数据库定期同步备份。 游客购物车:设置过期时间(如 7 天),用户登录后合并到账号购物车。 特殊处理: 商品价格 / 库存校验:用户结算时,从数据库或商品缓存重新校验价格和库存,避免缓存中的旧数据导致下单异常。
四、促销模块:高并发场景,需抗住流量峰值 促销模块(秒杀、优惠券、满减活动)的特点是流量极端集中(如秒杀开始瞬间 QPS 突增 100 倍)、数据时效性强(活动开始 / 结束时间严格)、业务逻辑复杂(库存扣减、优惠叠加)。 核心目标:通过缓存扛住流量峰值,避免系统崩溃,同时保证库存准确性。 1. 缓存策略选择 缓存介质:本地缓存(Caffeine)+ 分布式缓存(Redis Cluster),多级缓存分担压力。 更新策略:缓存预热 + 原子操作 活动前预热:提前将活动商品信息、库存、规则加载到 Redis 和本地缓存(如seckill:1001 → {stock: 1000, price: 99})。 库存扣减:用 Redis 原子命令(decr seckill:1001:stock)处理,避免超卖,再异步同步到数据库。 过期策略: 活动商品:缓存时间覆盖整个活动周期,活动结束后立即失效。 优惠券:缓存用户可领取的优惠券列表(coupon:user123),设置短过期时间(如 1 分钟),避免缓存与实际领取状态偏差过大。 特殊处理: 限流防护:在 Redis 层通过incr+ 过期时间实现接口限流(如seckill:limit:user123限制单用户每秒 1 次请求)。 热点分离:将超热门商品(如秒杀手机)的缓存单独部署,避免影响其他活动。 五、用户模块:读写均衡,需保护敏感数据 用户模块(登录信息、个人资料、地址管理)的特点是读写频率中等、数据敏感性高(如手机号、地址)、安全性要求高(避免缓存泄露)。 核心目标:缓存非敏感数据提升体验,同时防止敏感信息泄露。 1. 缓存策略选择 缓存介质:分布式缓存(Redis),敏感数据(如密码)不缓存。 更新策略:Cache-Aside 非敏感数据(如用户名、等级):更新数据库后删除缓存,下次读取时刷新。 登录令牌(Token):直接写入 Redis(token:xxx → userID),设置与 Token 有效期一致的过期时间,实现自动登出。 过期策略: 用户资料:中等过期时间(如 2 小时),避免频繁更新。 地址列表:较长过期时间(如 7 天),结合用户主动更新触发缓存刷新。 特殊处理: 防缓存穿透:用户 ID 不存在时,缓存空值(如user:9999 → null,过期时间 5 分钟)。 敏感数据脱敏:缓存用户信息时,对手机号、邮箱等脱敏(如138****5678)。
六、通用策略选择原则 按 “读写比” 决策: 读多写少(商品、分类):优先用 Cache-Aside,最大化缓存命中率。 写多读少(订单状态):用 Write-Through 或异步更新,保证一致性。 高频读写(购物车):直接写缓存 + 异步同步,优先保证性能。 按 “一致性要求” 决策: 强一致性(支付状态、库存):缓存更新需同步或加锁,避免数据偏差。 最终一致性(商品销量、用户积分):允许短暂不一致,用异步更新(MQ + 定时任务)兜底。 按 “流量特性” 决策: 流量平稳(日常商品浏览):常规缓存策略即可。 流量波动大(大促、秒杀):多级缓存 + 预热 + 限流,扛住峰值。 总之,电商系统选择缓存策略的核心是 **“场景化适配”**:先分析业务模块的读写频率、一致性要求、流量特征,再匹配对应的缓存介质(本地 / 分布式)、更新策略(Cache-Aside/Write-Through)、过期规则。同时,需通过监控(命中率、响应时间)和压测验证策略有效性,在大促等关键节点前优化调整,最终实现 “性能提升” 与 “风险可控” 的平衡。 | ||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||
|













