1 问题背景
需要在商品缓存中新增2个字段,redis中已存在20万个商品缓存,如何更新这20万个商品缓存
2 前言
本博客是笔者在真实的生产环境遇到的问题,非自学的demo或者单纯地研究理论。本博客仅供笔者自己总结参考,如有不正确的地方请指出。
3 详细背景
假如在redis中有如下结构的商品缓存:
{
id: 1,
title: "Iphone",
skus: [
{
id: 1001,
price: 6999.00,
sale_price: 5999.00
}
]
}
解释:此缓存结构表示一个spu,它有1个sku。
现在要在sku层级新增两个字段:weight 重量、weight_unit 重量单位,结构如下所示:
{
id: 1,
title: "Iphone",
skus: [
{
id: 1001,
price: 6999.00,
sale_price: 5999.00
weight: 1.20,
weight_unit: "kg"
}
]
}
往商品的缓存中加了字段,如果仍使用旧的缓存结构,那么查缓存时查出来新增的两个字段将会是null,会存在一定的问题(业务方面的问题,在此不做详细阐述),因此我们要在查询的时候,要获取最新的缓存结构,即要去db查并将值更新到缓存,就是要做缓存的更新。
生产环境上,特别是关于商品的缓存,不能直接粗暴地全部直接删掉然后让程序去db查值并更新到缓存,这会将压力从缓存移到db,db很容易一下子就被打垮。20万的商品缓存怎么更新呢?
4 解决方案
核心思想:设计一个字段标识查出来的商品缓存是否是最新的结构,此处假设用字段version 标识商品缓存的版本,假设最新的版本为1,即version 的值为1。
- 查商品缓存
- 判断商品缓存中的
version 字段是否为1,若是为空或者不为1,则表示此缓存不是最新的,需要去db查最新值并写回到缓存中。 - 考虑到如果要动态控制
version 的值,可以将version 的值放到配置中心中(比如nacos配置中心、apollo),那么无需改代码发版即可热更新version 的值。
|