返回顶部
首页 > 资讯 > 前端开发 > node.js >双写方式是什么
  • 744
分享到

双写方式是什么

2024-04-02 19:04:59 744人浏览 薄情痞子
摘要

本篇内容主要讲解“双写方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“双写方式是什么”吧!什么是双写?我们开门见山,这个很好理解,双写就是说,一份数据在

本篇内容主要讲解“双写方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“双写方式是什么”吧!

什么是双写?

我们开门见山,这个很好理解,双写就是说,一份数据在数据库存一份,在缓存中也存一份,给缓存一个过期时间,当读不到缓存时从数据库读出来然后写入缓存。

为什么需要双写呢?

双写方式是什么

当请求量越来越大的时候,系统会慢慢出现瓶颈,由于数据库的链接是有限的,无法支撑较高的QPS,所以我们要想一个办法分担数据库的压力,于是就有了双写,将数据写入缓存,客户端读取数据直接从缓存中读取,这样就可以提高系统的性能。

但是如果要使用双写,那么不管是先更新缓存还是先更新Mysql,总会有时间间隔,那么就要保证你的业务在一定程度上允许短暂的数据不一致的情况出现,否则,还是不建议使用的.

那么就有人问了?双写一定不能保证强一致性吗?

双写方式是什么

答案是可以,只要把所有与其相关的读写请求用队列串行化,这样就可以保证双写的强一致性了,但是这样会极大的降低系统的QPS,非常不推荐这种做法。

既然要双写,那么肯定会出现数据库和缓存数据不一致的情况,要怎样去避免呢?

双写不一致问题要怎么解决

一.先更新数据库,再更新缓存

这种情况会有什么问题呢?我们看下图:

双写方式是什么

首先a先更新数据库,按照正常流程来走,紧接着要a线程删除缓存,可是突然后面来了个b线程,并且a线程因为各种业务原因卡住了,导致b线程先完成了,之后a线程才更新缓存。这时突然有其他线程进来读数据,就会读到a的数据,但是按照业务流程来走,应该读到b的数据,此时,就出现了数据错乱的问题。

  • 1.线程a更新数据库

  • 2.线程b更新数据库

  • 3.线程b更新缓存

  • 4.线程a更新缓存

  • 5.其他线程读数据(读错了)

到这里我们会发现,直接更新缓存是有很大的问题的,而且很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值,有可能是联合其他的很多数据结合计算出来的一个值。

而且可能会有一种场景,我们经常在更新数据库后直接更新缓存,但是在此之间并没有缓存被访问的需求,这样我们就做了很多无用功,付出了很多代价。

大家应该对单例模式有所了解,其中有一种懒加载的思想,就是说,在你需要的时候再去加载,用在双写的情况下非常合适,也就有了下面这种先更新数据库,再删除缓存的模式。

二.先更新数据库,再删除缓存

这种情况又会有什么问题呢?

双写方式是什么

当然,这还是一种有问题的方案,我们来跟着图盘一盘。

1:线程a更新数据库

2:程序挂了,没来的及删除缓存

3.其他线程来读数据(全都是错的)

这种方案的问题一目了然,只要程序挂了,就会出现数据读错的情况,真实的业务你是应该读到a线程的值,却一直在读之前的值。

那这种方案有没有优化呢?

双写方式是什么

当然也有了,其实我们可以每次写入都记录日志,然后修改结束后也记录日志,通过日志状态来判断是否写入成功,

  • 如果没有写入成功后续并且没有新的写入请求,就补写,

  • 否则不做处理。

但是这种情况也会出现不一致的问题,就是如果写数据库程序断了,到下次恢复数据之前这段时间,还会出现数据不一致的情况。

并且如果是频繁写入的情况,很有可能日志机制没有发挥作用,就有新数据写入覆盖,并且日志系统还要占用额外的资源。

我懂了!应该先删除缓存再更新数据库,这样就可以了!

三.先删除缓存 再更新数据库

来来来,继续贴图,是不是很熟悉?

双写方式是什么

这种方案会有问题吗??当然有,继续盘道:

  • 1:线程a删除缓存

  • 2:线程b删除缓存

  • 3:线程a卡了

  • 4:线程b更新数据库

  • 5:线程a更新数据

  • 6:其他线程读数据,读到了a的(又错了)

完了,这种情况居然也有问题,线程a到底行不行,每次都是你出事。

这种情况中间会有一段数据乱掉,但是随着下次的更新数据还是会恢复正确。

难道终极方案是先删除缓存,再更新数据库,再更新缓存??

四.先删除缓存,再更新数据库,再删除缓存

继续贴图

双写方式是什么

  • 1.线程a删除缓存

  • 2.其他线程读取数据,读到的是a之前的数据

  • 3.线程a更新数据库

  • 4.线程a删除缓存

  • 5.其他线程设置缓存数据,是a之前的数据(此时应该是a的)

大家是不是又发现了,这种设计方案还是会有问题的,直到下次数据更新才有可能将数据恢复正确。

来吧,最后一种大家经常讨论的延时双删方案,我们一起盘一盘。

五.延时双删

go on

双写方式是什么

  • 1.先删除缓存

  • 2.再写数据库

  • 3.休眠一段时间(根据具体的业务时间来定)

  • 4.再次删除缓存

这里加了一个延时的操作,目的是确保 修改数据库 -> 清空缓存前,其他事务的更改缓存操作已经执行完。

所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

但这其中难免还是会大量的查询到旧缓存数据的,因为延时时间是根据业务自己定义的,时间太长和太短在高并发情况下都会有查询到脏数据的情况产生。

这样最差的情况就是在超时时间内数据存在不一致。

到此,相信大家对“双写方式是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 双写方式是什么

本文链接: https://lsjlt.com/news/83134.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 双写方式是什么
    本篇内容主要讲解“双写方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“双写方式是什么”吧!什么是双写我们开门见山,这个很好理解,双写就是说,一份数据在数...
    99+
    2024-04-02
  • 编写Python代码的方式是什么
    这篇文章主要讲解了“编写Python代码的方式是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“编写Python代码的方式是什么”吧!Python以句法简单、简洁而闻名,只需掌握简单的英语...
    99+
    2023-06-16
  • JavaScript短路求值简写方式是什么
    这篇文章主要介绍了JavaScript短路求值简写方式是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。短路求值简写方式当给一个变量分配另一个值时,想确定源始值不是null...
    99+
    2023-06-27
  • MySQL中双主情况下跳过Event的方式是什么
    本篇内容介绍了“MySQL中双主情况下跳过Event的方式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • JavaScript十进制指数的简写方式是什么
    这篇文章主要介绍JavaScript十进制指数的简写方式是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!十进制指数当需要写数字带有很多零时(如10000000),可以采用指数(1e7)来代替这个数字:for(le...
    99+
    2023-06-27
  • wpf双向绑定的方法是什么
    WPF(Windows Presentation Foundation)中的双向绑定是一种机制,可以在界面控件和数据对象之间实现双向...
    99+
    2023-08-08
    wpf
  • Spring Schedule Task动态改写Cron配置方式是什么
    这篇文章主要介绍“Spring Schedule Task动态改写Cron配置方式是什么”,在日常操作中,相信很多人在Spring Schedule Task动态改写Cron配置方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的...
    99+
    2023-06-25
  • ubuntu双系统扩容的方法是什么
    要在Ubuntu双系统中扩展分区的方法通常包括以下几个步骤:1. 在Windows系统中,使用磁盘管理工具缩小Windows分区的大...
    99+
    2023-09-05
    ubuntu
  • ubuntu双屏幕设置的方法是什么
    在Ubuntu上设置双屏幕可以通过以下步骤进行:1. 连接第二个显示器到计算机上。2. 打开“Settings”(设置)应用程序。3...
    99+
    2023-09-09
    ubuntu
  • linux双网卡绑定的方法是什么
    在Linux中,绑定双网卡可以使用以下方法: 使用网络连接绑定(Network Bonding): 安装 ifenslave ...
    99+
    2023-10-23
    linux
  • mysql双主键设置的方法是什么
    在MySQL中设置双主键(也称为联合主键)的方法是在创建表时将两个或多个字段设置为主键。例如: CREATE TABLE examp...
    99+
    2024-02-29
    mysql
  • html5双标签是什么
    本篇内容主要讲解“html5双标签是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“html5双标签是什么”吧!   双标签   1、 表示“段落”,段后...
    99+
    2024-04-02
  • vue3响应式原理和api编写的方法是什么
    这篇文章主要讲解了“vue3响应式原理和api编写的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3响应式原理和api编写的方法是什么”吧!前言vue3响应式原理加api编写...
    99+
    2023-06-22
  • Python书写格式及变量命名的方法是什么
    本篇内容介绍了“Python书写格式及变量命名的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、命令格式:定义变量名称条件函数用...
    99+
    2023-06-25
  • java双重数组定义的方法是什么
    在Java中,可以使用两种方法来定义双重数组:1. 声明并初始化一个双重数组:```int[][] array = {{1, 2, ...
    99+
    2023-09-27
    java
  • vue2.0双向数据绑定的方法是什么
    这篇文章主要介绍“vue2.0双向数据绑定的方法是什么”,在日常操作中,相信很多人在vue2.0双向数据绑定的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2.0双向数据绑定的方法是什么”的疑...
    99+
    2023-06-27
  • 双栈vps提高网速的方法是什么
    提高双栈VPS网速的方法有以下几种:1. 选择优质的网络服务提供商:选择一家可靠的网络服务提供商,确保其提供高速、稳定的网络连接。2...
    99+
    2023-08-20
    双栈vps vps
  • mysql双机热备配置的方法是什么
    在MySQL双机热备配置中,通常使用主从复制(Master-Slave Replication)来实现数据备份和故障恢复。以下是实现...
    99+
    2024-04-09
    mysql
  • 什么是双线服务器
    双线服务器是:双线服务器是电信和网通同时接入的服务器,位于双线机房,由国家骨干光纤网直接接入,能根据访问者的线路实现自动判断和自动切换,从而实现更快的打开网站。具体内容如下:什么是双线服务器双线服务器通常指电信和网通同时接入的服务器。双线服...
    99+
    2024-04-02
  • 双线服务器是什么
    双线服务器是:双线服务器是为了解决国内电信和网通间的互联互通问题而产生的,主要分为双IP双线路和单IP双线,能实现电信和网通互联互通,且访问速度快,但费用较高,带宽较小。具体内容如下:双线服务器是为了解决国内两大网络(电信和网通)之间的互联...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作