Redis具有三种读写策略:绕过缓存模式策略,阅读和写作渗透策略以及异步缓存写作策略。
这三个缓存阅读和写作策略具有自己的优势,没有最好的。我们需要根据实际业务方案选择最合适的业务方案。
跨路高速缓存模式是一种缓存读取和写作模式,我们通常使用更多,更适合阅读请求。
服务器需要同时维护,并且结果应遵守结果。
阅读和写作步骤:如下所示:
阅读:如下所示:
自我思考这样一个问题:“如果您可以在编写数据的过程中首先删除缓存,您是否更新DB?”
答:答案绝对是不可能的,因为这可能会导致数据库和缓存数据不一致的问题。例如,目前的数据在DB和CACHE中为100。请求1需要更新为200。如果您更新数据库,请求1已删除缓存,但是当数据库未完成时,请有一个请求2读取数据。首先转到缓存以阅读,发现缓存已删除,然后在编写缓存之前,然后转到数据库读取100(在此TimereQuest 1中)。目前,请求1完成。目前,数据库中的数据为200,缓存为100,这是不一致的。
可以简要地描述为:
请求1在缓存中删除数据
在思考:“在编写数据的过程中,如果您首先编写BD,它不会导致数据与删除缓存不一致吗?”
答案:从理论上讲,数据仍然存在不一致的数据,但是概率很小,因为缓存写作速度比数据库编写速度快得多。
例如,请求1首先读取数据,请求2然后编写数据A,如果缓存中不存在数据,则数据A将转到数据库以读取,目前数据库与缓存不一致。
这个过程可以简单地描述为:
请求1读取数据a->请求2以将更新数据a写入数据库,然后在缓存中删除数据
缺点读写,穿透了中间服务端被视为主要数据存储,从中读取数据并将数据写入其中。该服务负责读取和编写此数据,从而降低了应用程序的责任。
阅读和写作步骤:如下所示:
阅读:如下所示:
读取和写作渗透实际上是在旁路缓存上方包装的。在旁路缓存,读取请求时,如果其中没有相应的数据,客户端负责编写数据本身,并且读取和写作渗透是为了自身服务写缓存。这对客户透明。
像旁路缓存一样,也存在一个问题,即第一个请求数据不得在读写渗透中。对于热数据,您可以提前将其写入缓存。
异步缓存的写作和读写渗透非常相似,这两者都是由服务负责和读写的。
两者之间的最大区别是,读取和写入渗透是同步更新,而异步缓存写作仅更新,而不是直接更新,而是作为异步批次更新。
显然,这种方法给数据一致性带来了更大的挑战。例如,数据可能不会更新异步,并且该服务可能会挂起。
在我们通常的开发过程中,这种策略也很罕见,但这并不意味着其应用方案很小。例如,消息队列中消息的异步写入使用此策略。
异步缓存的写作表现非常高。它非常适合使用数据的使用通常会更改,并且数据的一致性要求不那么高,例如观点和赞美。
参考:https://javaguide.cn/database/redis/3-upmonly-userd-ded-nd-write-strategies.html
