如何保证缓存和数据库的一致性问题?
因为数据库是持久化于磁盘中的,而缓存一般是存放于内存中。操作系统对于磁盘的读写性能是只能够达到毫秒级,远不如内存的纳秒级别。
如果使用了缓存来分担数据库的读取
为什么要引入缓存? 因为数据库是持久化于磁盘中的,而缓存一般是存放于内存中。操作系统对于磁盘的读写性能是只能够达到毫秒级,远不如内存的纳秒级别。 如果使用了缓存来分担数据库的读取操作,尤其是对于写频繁的应用来说,提升是十分的显著的。 本文的缓存包括中间件(比如Redis)和应用的缓存库(比如Caffiene) 缓存和数据库如何操作? 当我们引入缓存中间件后来进行减轻数据库的读操作时,我们进而带来了一个问题:在写操作时如何保证数据库和缓存的一致性? 我们会从两个维度上入手: 删除缓存还是更新缓存? 大部分情况下我们会使用删除缓存的方案,因为考量缓存的性能指标时,一个很关键的因素是缓存利用率。 而对于1000次写请求,我们都进行1000次缓存更新时,那么对于缓存的更新操作是十分浪费的。 因为缓存中的数据并不会被骂上读取到,导致存放了很多不常访问的数据造成资源浪费。 先操作数据库还是先操作缓存 不论是先操作数据库还是先操作缓存数据库更新操作,都分为两步,那么就很可能存在第一步成功,第二步失败的情况。 如果是数据库操作成功了,缓存操作失败了,那么缓存依然是旧值,下次读请求时用户看到的依然是旧值。 如果是先缓存操作成功了,后数据库操作失败,那么数据库中的值依然是旧值,就会导致用户的更新丢失。 解决方案:重试 好像两个方案都会造成问题,如何解决呢? 最简单的办法就是重试。 不论是哪一种方案,只要第二步发生了失败我们就对其进行重试,理论上就能够保证数据的一致性了。 但是同步重试的并不合理,因为立即重试大概率还是会失败且频繁重试的话会占用系统的资源。 那么我们就会想到异步的解决方案了。 而这个异步的方案我们一般会使用可靠的消息队列来保证其可靠性。 (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |