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

yizhihongxing

作者:京东零售 于泷

一、背景

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

二、读取过程

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

• 读缓存

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

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

三、更新过程

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

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

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

问题:

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

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

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

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

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

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

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

问题:

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

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

此种方式不推荐

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

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

同上,不推荐

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

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

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

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

策略5:缓存延时双删

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

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

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

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

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

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

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

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

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

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

四、总结

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

原文链接:https://www.cnblogs.com/jingdongkeji/p/17333646.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:缓存与数据库双写一致性几种策略分析 - Python技术站

(0)
上一篇 2023年4月19日
下一篇 2023年4月22日

相关文章

  • 如何单机部署多个 MySQL 8.0 实例 ?

    在服务器资源有限的情况下,可利用该方案快速搭建各类 mysql 架构方案。各 MySQL 实例共享一个 mysqld 主程序,但各实例数据目录是独立的,存放在不同的文件夹中;好了、废话不多说,直接上干货,具体搭建步骤如下 环境介绍 实例 主机 mysql port mysqlx port datadir mysql1 192.168.31.100 3306 …

    MySQL 2023年4月8日
    00
  • MySQL查询性能优化武器之链路追踪

    MySQL查询性能优化是关系型数据库优化的核心之一,而链路追踪则是一种用于查找系统性能瓶颈的工具。本文将介绍如何使用链路追踪来分析MySQL查询性能问题。本文将分为以下几个部分: 链路追踪概述 MySQL性能问题分析 使用Zipkin进行链路追踪 示例说明 1. 链路追踪概述 链路追踪是一种用于查找系统性能瓶颈的工具,可以对分布式系统中的各个组件进行监控和追…

    MySQL 2023年5月19日
    00
  • 优化 MySQL 3 个简单的小调整

    下面是关于“优化 MySQL 3 个简单的小调整”的完整攻略: 1. 确认是否开启慢查询日志 在MySQL中,可以通过慢查询日志来捕获执行缓慢的查询。开启慢查询日志可以方便我们找出一些性能问题。 如何确定是否已开启慢查询日志? 可以执行以下SQL查询语句: SHOW VARIABLES LIKE ‘slow_query_log’; 若查询结果为“OFF”,则…

    MySQL 2023年5月19日
    00
  • MySQL控制用户输错密码尝试次数

    MySQL在安全性方面有一个有用的特性——控制用户输错密码尝试次数。这个特性可以防止暴力破解密码攻击,限制在一定时间内允许用户的登录尝试次数,错过限制次数后,MySQL会禁止用户登录一段时间。这里提供了一些步骤来实现这个特性。 1. 创建一个新的用户 首先,创建一个新用户专门用于控制限制和监控登录尝试次数。以下是创建用户的SQL脚本,你可以将“new_use…

    MySQL 2023年5月18日
    00
  • 浅谈MySQL中的子查询优化技巧

    在MySQL中,子查询是一种常用的查询方式,它可以帮助我们在一个查询过程中使用嵌套的SELECT语句,请详细阐述一下如何优化MySQL中的子查询。 一、使用EXISTS替代IN和NOT IN 在MySQL中,如果我们需要查询一个表中所有包含某个值的行,通常会使用IN或NOT IN语句,例如: SELECT * FROM table1 WHERE id IN(…

    MySQL 2023年5月19日
    00
  • MySQL系列详解五: xtrabackup实现完全备份及增量备份详解-技术流ken

      xtrabackup简介   xtrabackup是一个用来对mysql做备份的工具,它可以对innodb引擎的数据库做热备。xtrabackup备份和还原速度快,备份操作不会中断正在执行的事务,备份完成之后可以自动做校验,备份结果可以压缩(节省磁盘和带宽)。实际工作中可以用来做mysql的完全备份,增量备份,以及差异备份等。 xtrabackup有两个…

    MySQL 2023年4月13日
    00
  • mysql出现ERROR 1819 (HY000)的解决方法

    问题描述: 在使用mysql时,出现ERROR 1819 (HY000)的错误提示,该怎么办? 问题分析: ERROR 1819 (HY000)的错误提示一般是由于mysql版本更新造成的原因,新版mysql对密码的强度进行了限制,密码的长度和复杂度都有了更高的要求。 解决方法: 以下为解决ERROR 1819 (HY000)的具体步骤: 步骤一:以高权限账…

    MySQL 2023年5月18日
    00
  • 如何建设一个用于编译 iOS App 的 macOS 云服务器集群?

    作者:京东零售 叶萌 现代软件开发一般会借助 CI/CD 来提升代码质量、加快发版速度、自动化重复的事情,iOS App 只能在 mac 机器上编译,CI/CD 工具因此需要有一个 macOS 云服务器集群来执行 iOS App 的编译。 今天就来谈谈如何建设 macOS 云服务器集群 购买 mac mini / Mac Studio 机器 最简单的方式就是…

    云计算 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部