内容施工中, 请稍后查看…

一个好的缓存应该保证的目标

  1. 可复用, 对于不同的接口不需要重复开发
  2. 妥善解决 缓存雪崩, 缓存击穿, 缓存穿透 问题
  3. 可配置缓存策略(例如存储方式, 是否存储空值)
  4. 提供监控能力, 缓存命中率等

API设计

查询单个元素
批量查询

map类型
查询某个元素, 所有元素, 多个元素, 获取长度

删除元素

选项控制

是否允许空值, 设置空值的默认值, 设置空值的过期时间

随机过期时间

缓存击穿, 大量请求同时查询某一个key, 导致缓存还未建立前发送大量请求, 需要在业务逻辑测加上锁

缓存一致性

先更新数据库, 再更新缓存 ==> 更新失败脏数据, 并发更新写入历史数据
先更新缓存, 再更新数据库 ==> 并发更新写入历史错误数据 ==> 不建议

先删除缓存, 再更新数据库 ==> 重新载入旧数据 ==> 延迟双删除策略
先更新数据库, 再删除缓存 ==> 读取旧数据, 相对最优方案


针对读多写少场景, 可以先更新数据库再删除缓存
针对读写相当或者写多读少的场景, 先更新数据库再更新缓存, 可减少数据库的读取压力


使用BinLog或者MQ投递更新消息, 从而保证缓存最终一定被更新.

最后更新: 2026年04月22日 21:55

版权声明:本文为原创文章,转载请注明出处

原始链接: https://lizec.top/2024/10/02/%E7%BC%93%E5%AD%98%E8%AE%BE%E8%AE%A1%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E7%8E%B0/