有ABC三个请求,都是 uid 纬度的请求;分别涉及到配置 1,2,3;2,3,5;3,4,6。现在要求怎样在配置更新后及时将相关的请求缓存重置?

  1. 可以将配置变化的 binlog 加入消息队列
  2. 配置关联的请求前缀提前存入 redis
  3. 请求缓存的 key 做拆分:前缀为 2 中提到的前缀,以前缀为 key 存 uid 和 缓存更新时间到 zset 中。另 前缀 + uid 单独存储某个用户某个请求具体的缓存内容
  4. 当消息队列消费到配置变化时:获取该配置关联的请求桶前缀,将请求桶中时间小于当前时间的 uid 取出,并从桶中清除;将前缀和相关待过期 uid 组合获取真正缓存的 key,将其过期 or 删除。

如何保证缓存和db的数据一致性

cache aside pattern
读请求:先读缓存->缓存命中,返回数据->缓存失败,读DB->更新缓存
写请求:先更新DB->再更新缓存 额外记录DB变更,比如1s内是否有 db:table:column 产生了修改,这样在读到相关缓存时,可以先判断这个 变更 缓存是否有内容。

如果相邻时间窗口内没有更新操作,那么认为当前读到的缓存时相对最新的;如果相邻时间窗口内有更新操作,那么需要将此次读到的内容丢弃,重读DB,并删除 or 更新缓存。