0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

缓存与数据库双写一致性几种策略分析

OSC开源社区 来源:OSCHINA 社区 2023-04-21 10:27 次阅读

一、背景

在高并发场景中,为防止大量请求直接访问数据库,缓解数据库压力,常用的方式一般会增加缓存层起到缓冲作用,减少数据库压力。引入缓存,就会涉及到缓存与数据库中数据如何保持一致性问题,本文将对几种缓存与数据库保证数据一致性的使用方式进行分析。为保证高并发性能,以下分析场景不考虑执行的原子性及加锁等强一致性要求的场景,仅追求最终一致性。

二、读取过程

f2d7ca0e-df9c-11ed-bfe3-dac502259ad0.png

•读缓存

•如果缓存里没有值,那就读取数据库的值

•同时把这个值写进缓存中

三、更新过程

更新操作有多种策略,各有优劣,主要针对此场景进行分析

策略 1:先更新 db,再删除缓存(常用的 Cache-Aside Pattern旁路缓存)

f2ecfe60-df9c-11ed-bfe3-dac502259ad0.png

问题:

1. 如果更新 db 成功,删缓存失败,将导致数据不一致

2. 极端场景,请求 A 读,B 写

1) 此时缓存刚好失效 2)A 查库得到旧值 3)B 更新 DB 成功

4)B 删除缓存 5)A 将查到的旧值更新到缓存中

此场景的发生需要步骤 2)查 db 始终慢于 3)的更新 db,才能导致 4)先于 5)执行,通常 db 的查询是要快于写入的,所以此极端场景的产生过于严格,不易发生

策略 2:先更新 db, 再更新缓存

f2f5faa6-df9c-11ed-bfe3-dac502259ad0.png

问题:

1. 并发更新场景下,更新缓存会导致数据不一致

2. 根据读写比,考虑是否有必要频繁同步更新缓存,而且,如果构造缓存中数据过于复杂,或者数据更新频繁,但是读取并不频繁的情况,还会造成不必要的性能损耗

此种方式不推荐

策略 3: 先更新缓存,再更新 db

f3000758-df9c-11ed-bfe3-dac502259ad0.png

同上,不推荐

策略 4:先删缓存,再更新 db

f30af1fe-df9c-11ed-bfe3-dac502259ad0.png

先删缓存,虽然解决了策略 1 中,后删缓存如果失败的场景,但也会发生不一致的问题

例如:请求 A 删除缓存,这时请求 B 来查,就会击穿到数据库,B 读取到旧的值后写入缓存,A 正常更新 db, 由于时间差导致数据不一致的情况

策略 5:缓存延时双删

f31afed2-df9c-11ed-bfe3-dac502259ad0.png

该策略兼容了策略 1 和策略 4, 解决了先删缓存还是后删缓存的问题,如策略 1 中,更新 db 后删缓存失败和策略 4 中的不一致场景,该策略可以将延时时间内(比如延时 10ms)所造成的缓存脏数据,再次删除。但是,如果延时删缓存失败,策略 4 中不一致问题还会发生,同时延时的实现,如创建线程,或者引入 mq 异步,可能会增加系统复杂度问题。

策略 6:变种双删,前置缓存过期时间

f3365d08-df9c-11ed-bfe3-dac502259ad0.png

该策略针对策略 1 中后删缓存失败的场景,前置一层缓存数据过期时间(具体时间根据自身系统本身评估,如可覆盖 db 读写耗时或一致性容忍度等),更新 db 后就算删缓存失败,在 expire 时间后也能保证缓存中无数据。同时,前置 expire 失败,或者更新 db 失败,都不会影响数据一致。

能够解决策略 4 中的问题:请求 A 删除缓存,这时请求 B 来查,就会击穿到数据库,B 读取到旧的值后写入缓存,A 正常更新 db, 由于时间差导致数据不一致的情况,描述图如下:

f349b3d0-df9c-11ed-bfe3-dac502259ad0.png

本策略中步骤 1 为 expire 缓存,不会发生击穿缓存到数据库的情况,数据将直接返回。除非更极端情况,如下图:

expire 时间没有覆盖住更新 db 的耗时,类似策略 1 中极端场景,此处不赘述

f3559e16-df9c-11ed-bfe3-dac502259ad0.png

四、总结

对于每种方案策略,各有利弊,但一致性问题始终存在(文章开头排除了原子性和锁),只是发生的几率在一点点慢慢变小了,方案的评估不仅要根据自身系统的业务场景,如读写比、并发量、一致性容忍度,还要考虑系统复杂度,投入产出比等,寻找最合适的方案。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3650

    浏览量

    63761

原文标题:缓存与数据库双写一致性几种策略分析

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问ESP-NOW对数据的完整一致性有校验吗?

    当使用ESP-NOW时,传递的数据在传输层有对数据包的完整(比如对面传给我的字节数和我收到的字节数是否相同)有底层校验吗? 还有这个数据包是否经过了CRC等差错检测的校验呢(就是
    发表于 06-17 06:55

     QSFP一致性测试的专业测试设备

    、高速度的光纤接口模块,广泛应用于数据中心、高速以太网和光纤通信等领域。本文将详细探讨QSFP一致性测试的目的、测试内容、测试方法以及测试的重要等方面。 QSFP一致性测试的目的是确
    的头像 发表于 03-14 10:40 281次阅读
     QSFP<b class='flag-5'>一致性</b>测试的专业测试设备

    企业数据备份体系化方法论的七大原则:深入理解数据备份的关键原则:应用一致性与崩溃一致性的区别

    在数字化时代,数据备份成为了企业信息安全的核心环节。但在备份过程中,两个关键概念——应用一致性和崩溃一致性,常常被误解或混淆。本文旨在阐明这两个概念的差异,并分析它们在
    的头像 发表于 03-11 14:05 207次阅读
    企业<b class='flag-5'>数据</b>备份体系化方法论的七大原则:深入理解<b class='flag-5'>数据</b>备份的关键原则:应用<b class='flag-5'>一致性</b>与崩溃<b class='flag-5'>一致性</b>的区别

    深入理解数据备份的关键原则:应用一致性与崩溃一致性的区别

    这两个概念的差异,并分析它们在数据备份中的重要,以便读者能够更有效地保护企业数据。 1. 概念区分: 应用一致性和崩溃
    的头像 发表于 03-11 11:29 420次阅读
    深入理解<b class='flag-5'>数据</b>备份的关键原则:应用<b class='flag-5'>一致性</b>与崩溃<b class='flag-5'>一致性</b>的区别

    DDR一致性测试的操作步骤

    DDR一致性测试的操作步骤  DDR(双数据率)一致性测试是对DDR内存模块进行测试以确保其性能和可靠。在进行DDR一致性测试时,需要遵循
    的头像 发表于 02-01 16:24 672次阅读

    Redis缓存与Mysql如何保证一致性

    基本流程就是客户端A请求,先去删除缓存,然后将数据写入数据库,此时客户端B查询先去查询缓存缓存没有返回,去查
    的头像 发表于 12-02 14:23 725次阅读
    Redis<b class='flag-5'>缓存</b>与Mysql如何保证<b class='flag-5'>一致性</b>?

    redis与mysql如何保持数据一致性

    Redis和MySQL是两个常用的数据库系统,它们都有自己的特点和用途。在某些场景下,我们可能需要将Redis和MySQL进行结合使用,并保持数据一致性、Redis与MySQL
    的头像 发表于 11-16 11:27 689次阅读

    什么是锂离子电池不一致性?如何提高锂离子电池的一致性

    什么是锂离子电池不一致性?锂离子电池不稳定的原因?如何提高锂离子电池的一致性? 锂离子电池不一致性是指同批次或不同批次的锂离子电池在性能上出现不
    的头像 发表于 11-10 14:49 1019次阅读

    如何保证缓存一致性

    “ 本文的参考文章是2022年HOT 34上Intel Rob Blakenship关于CXL缓存一致性篇介绍。”
    的头像 发表于 10-19 17:42 657次阅读
    如何保证<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    如何解决数据库缓存一致性

    压力。当乘客购买成功之后,数据库发生了变化,需要及时更新缓存中的数据,以便于其他乘客能从缓存中及时获取最新车票信息。这就是缓存
    的头像 发表于 09-25 15:25 777次阅读
    如何解决<b class='flag-5'>数据库</b>与<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    管理基于Cortex-M7的MCU的高速缓存一致性

    电子发烧友网站提供《管理基于Cortex-M7的MCU的高速缓存一致性.pdf》资料免费下载
    发表于 09-25 10:11 0次下载
    管理基于Cortex-M7的MCU的高速<b class='flag-5'>缓存</b><b class='flag-5'>一致性</b>

    优化数据库性能使用LSI MegaRAID CacheCade Pro 2.0读/缓存软件

    电子发烧友网站提供《优化数据库性能使用LSI MegaRAID CacheCade Pro 2.0读/缓存软件.pdf》资料免费下载
    发表于 08-10 17:38 0次下载
    优化<b class='flag-5'>数据库</b>性能使用LSI MegaRAID CacheCade Pro 2.0读/<b class='flag-5'>写</b><b class='flag-5'>缓存</b>软件

    数据库数据恢复-Oracle数据库文件块损坏的数据恢复案例

    打开Oracle数据库时报错,报错信息:“system01.dbf需要更多的恢复来保持一致性数据库无法打开”。用户急需恢复zxfg用户下的数据
    的头像 发表于 08-03 15:10 474次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复-Oracle<b class='flag-5'>数据库</b>文件块损坏的<b class='flag-5'>数据</b>恢复案例

    虹科干货 | 什么是数据库一致性

    数据库一致性(database consistency)由组值定义,数据库系统中的所有数据点都必须与这些值保持
    的头像 发表于 07-13 13:56 501次阅读
    虹科干货 | 什么是<b class='flag-5'>数据库</b><b class='flag-5'>一致性</b>?

    什么是数据库营销

    数据库一致性(database consistency)由组值定义,数据库系统中的所有数据点都必须与这些值保持
    的头像 发表于 07-13 11:38 458次阅读
    什么是<b class='flag-5'>数据库</b>营销