请根据场景设计缓存方案
有ABC三个请求,都是 uid 纬度的请求;分别涉及到配置 1,2,3;2,3,5;3,4,6。现在要求怎样在配置更新后及时将相关的请求缓存重置?
- 可以将配置变化的 binlog 加入消息队列
- 配置关联的请求前缀提前存入 redis
- 请求缓存的 key 做拆分:前缀为 2 中提到的前缀,以前缀为 key 存 uid 和 缓存更新时间到 zset 中。另 前缀 + uid 单独存储某个用户某个请求具体的缓存内容
- 当消息队列消费到配置变化时:获取该配置关联的请求桶前缀,将请求桶中时间小于当前时间的 uid 取出,并从桶中清除;将前缀和相关待过期 uid 组合获取真正缓存的 key,将其过期 or 删除。
如何保证缓存和db的数据一致性
cache aside pattern
读请求:先读缓存->缓存命中,返回数据->缓存失败,读DB->更新缓存
写请求:先更新DB->再更新缓存 额外记录DB变更,比如1s内是否有 db:table:column 产生了修改,这样在读到相关缓存时,可以先判断这个 变更 缓存是否有内容。
如果相邻时间窗口内没有更新操作,那么认为当前读到的缓存时相对最新的;如果相邻时间窗口内有更新操作,那么需要将此次读到的内容丢弃,重读DB,并删除 or 更新缓存。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bishop!
评论
GitalkValine