使用 Redis常见的缓存读写策略有三种分别是:旁路缓存,读写穿透和异步缓存写入。

        首先,三种策略并没有高低之说,只是侧重点不同。接下来我给大伙挨个讲一讲。

旁路缓存(Cache Aside Pattern)

        服务端同时维护Mysql和Redis,并且以Mysql的主要存储。

        策略规定在查数据时,先从Redis中读。如果Redis中没有,再从Mysql中读取,并将结果返回。再写入Redis,避免下次读取依然查不到。

redis读写机制 原理 redis读写策略_旁路

        策略规定在写数据时,先写Mysql,再删除Redis。

redis读写机制 原理 redis读写策略_redis_02

        旁路缓存是最为广泛应用的一种读写策略。当然,这个策略也不是完美的,也会存在一致性问题。 

 

读写穿透(Read Write Through Pattern)

        策略视Redis为主要存储。

        策略规定在读数据时,先从Redis中读。读到直接返回。没有读到就从Mysql中读取数据放入到Redis中后,再返回数据。

redis读写机制 原理 redis读写策略_Redis_03

        策略规定在写数据时,先看Redis中是否存在该数据,存在则先更新换,再更新数据库。

 

redis读写机制 原理 redis读写策略_缓存_04

        我觉得该策略存在两个问题:① 读数据时先更新缓存再返回结果会降低查询接口的处理速度,② 写数据时先更新缓存可能会导致缓存一致性问题。 

异步缓存写入(Write Behind Pattern)

        这种策略是三种策略中最少出现在项目中的。跟读写穿透策略有些许类似,他们都是以Redis作为主战场。区别是读写穿透直接更新数据库,而该策略选择集中同步到Mysql数据库。策略存在一个较大的风险,如果缓存服务挂掉了,就容易出现不一致的情况。

        有两个比较著名应用场景:消息队列中消息异步写入磁盘和InnoDB的Buffer Pool。这两个场景都是关于持久化的。

缓存读写策略与延迟双删是什么关系?

        不知道有多少小伙伴有这种疑问。但至少作为初学者的我,刚看到这块的时候,是有这个疑问的。因为缓存读写策略要解决缓存一致性问题,延迟双删也是要解决缓存一致性问题。然后其实这个问题很简单,我们大多数使用的是旁路缓存策略,但是旁路缓存策略在很多情况还是会存在一致性问题。为了解决这个问题,就出现了延迟双删策略。延迟双删是对旁路缓存的一个优化。

        这个对知识融会贯通的过程也对我很有益,特此记录一下。