加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.zhandada.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

如何保证缓存和数据库的一致性问题?

发布时间:2022-11-16 17:32:05 所属栏目:MySql教程 来源:网络
导读: 为什么要引入缓存?
因为数据库是持久化于磁盘中的,而缓存一般是存放于内存中。操作系统对于磁盘的读写性能是只能够达到毫秒级,远不如内存的纳秒级别。
如果使用了缓存来分担数据库的读取

为什么要引入缓存?

因为数据库是持久化于磁盘中的,而缓存一般是存放于内存中。操作系统对于磁盘的读写性能是只能够达到毫秒级,远不如内存的纳秒级别。

如果使用了缓存来分担数据库的读取操作,尤其是对于写频繁的应用来说,提升是十分的显著的。

在这里插入图片描述

本文的缓存包括中间件(比如Redis)和应用的缓存库(比如Caffiene)

缓存和数据库如何操作?

当我们引入缓存中间件后来进行减轻数据库的读操作时,我们进而带来了一个问题:在写操作时如何保证数据库和缓存的一致性?

我们会从两个维度上入手:

删除缓存还是更新缓存?

大部分情况下我们会使用删除缓存的方案,因为考量缓存的性能指标时,一个很关键的因素是缓存利用率。 而对于1000次写请求,我们都进行1000次缓存更新时,那么对于缓存的更新操作是十分浪费的。 因为缓存中的数据并不会被骂上读取到,导致存放了很多不常访问的数据造成资源浪费。

先操作数据库还是先操作缓存

不论是先操作数据库还是先操作缓存数据库更新操作,都分为两步,那么就很可能存在第一步成功,第二步失败的情况。

如果是数据库操作成功了,缓存操作失败了,那么缓存依然是旧值,下次读请求时用户看到的依然是旧值。

如果是先缓存操作成功了,后数据库操作失败,那么数据库中的值依然是旧值,就会导致用户的更新丢失。

解决方案:重试

好像两个方案都会造成问题,如何解决呢?

最简单的办法就是重试。 不论是哪一种方案,只要第二步发生了失败我们就对其进行重试,理论上就能够保证数据的一致性了。

但是同步重试的并不合理,因为立即重试大概率还是会失败且频繁重试的话会占用系统的资源。

那么我们就会想到异步的解决方案了。

而这个异步的方案我们一般会使用可靠的消息队列来保证其可靠性。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!