缓存读写策略

我看到过两种分类方式,其实大同小异,都是按DB和缓存先处理谁(或者说以谁为主)来分的,只是角度不同,为了加深理解,都记下来吧。

读的时候,如果缓存里读到了,就直接返回读到的结果,这一步是通用的,下面就不赘述"读"时"从缓存读到"的情况了。

1. 分类方式一

网上比较常见的分类方式。

1.1. 缓存作为旁路的模式

这是最常见的模式

核心思想:先弄DB。

1.1.1. 读

缓存里未读到,客户端先读DB,再由客户端更新缓存。

1.1.2. 写

客户端写DB,客户端删缓存。

1.2. 读写穿透(缓存作为主路)的模式

核心思想:先弄缓存。

1.2.1. 读

缓存里未读到,缓存服务先读DB,再由缓存服务更新缓存,然后返回给客户端。。

1.2.2. 写

写缓存,由缓存服务同步地去更新DB。

1.3. 回写模式(也叫异步缓存写入模式)

核心思想:先弄缓存,异步同步DB。

1.3.1. 读

缓存里未读到,缓存服务先读DB,再由缓存服务更新缓存,然后返回给客户端。

1.3.2. 写

写缓存,由缓存服务异步批量地去更新DB。

1.4. 注意

  1. 第三种用到的地方:消息队列异步写入硬盘、innoDB的buffer pool机制。
  2. 热点数据要提前加载到缓存(预热),以免启动的时候大量请求直接打到数据库。

2. 分类方式二

这"分类方式二"是我个人的理解。

从3个维度分别独立地看,然后再总结成5个方式。

  • 这3个维度分别是:读写、DB和缓存、同步和异步。
  • 这5个方式分别是:
  1. 读不穿透
  2. 读穿透
  3. 写不穿透
  4. 写穿透
  5. 异步批量写穿透

缓存自己处理,就叫穿透。

2.1. 读不穿透

读缓存未命中时,客户端自己去读DB,然后客户端把读到的信息同步给缓存,再处理客户端自己的逻辑。

2.2. 读穿透

读缓存未命中时,缓存自己去读DB,然后把值给客户端。

2.3. 写不穿透

写时,客户端先写DB,客户端再写缓存。

2.4. 写穿透

写时,客户端写缓存,缓存自己来写DB。

2.5. 异步批量写穿透

写时,客户端写缓存,缓存自己来异步批量地写DB。

3. 方式一和方式二的关系

  • "旁路模式"其实是读不穿透、写不穿透
  • "读写穿透"其实是读穿透、写穿透
  • "回写模式"其实是读穿透、异步批量写穿透

我认为完全可以再造其他模式,比如读不穿透、写穿透,读穿透、写不穿透等等......主要看有没有合适的使用场景。

三种模式简单记为:两不透,两穿透,两穿透了还批量异步。

相关推荐
观无4 小时前
Redis远程链接应用案例
数据库·redis·缓存·c#
星星点点洲4 小时前
【缓存与数据库结合方案】伪从技术 vs 直接同步/MQ方案的深度对比
数据库·缓存
好想有猫猫6 小时前
【Redis】服务端高并发分布式结构演进之路
数据库·c++·redis·分布式·缓存
爱的叹息8 小时前
MyBatis缓存配置的完整示例,包含一级缓存、二级缓存、自定义缓存策略等核心场景,并附详细注释和总结表格
缓存·mybatis
山猪打不过家猪9 小时前
(六)RestAPI 毛子(外部导入打卡/游标分页/Refit/Http resilience/批量提交/Quartz后台任务/Hateoas Driven)
网络·缓存
李宥小哥11 小时前
Redis01-基础-入门
缓存·中间件
多多*12 小时前
非关系型数据库 八股文 Redis相关 缓存雪崩 击穿 穿透
java·开发语言·jvm·数据库·redis·缓存·nosql
伊织code14 小时前
cached-property - 类属性缓存装饰器
python·缓存·cache·装饰器·ttl·property·cached-property
李宥小哥15 小时前
Redis03-基础-C#客户端
开发语言·缓存·中间件·c#
Ten peaches15 小时前
苍穹外卖(缓存商品、购物车)
spring boot·redis·mysql·缓存