首页 > 数据库 >Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?

Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?

时间:2024-03-18 10:23:49浏览次数:34  
标签:缓存 数据库 Redis 同步 MySQL 一致性 数据

Redis作为缓存,MySQL数据库如何与Redis保持一致性(双写一致性)?

双写一致性:

​ 修改了数据库中的数据的同时,也要更新缓存的数据,保证数据库和缓存中的数据保持一致。

请求数据的执行流程:

​ 请求去访问Redis,如果Redis缓存中有数据则返回数据,如果Redis缓存中没有数据则去查数据库,数据库把数据返回给请求之前将数据加载到缓存中,这样下次请求就可以在Redis缓存中执行。

保证一致性的方式:

一、延迟双删:(不保证数据的强一致性)

​ 是指在更新数据库之前先删除缓存,然后再去更新数据库,更新数据库后,再去延时删除缓存。

​ 之所以要延迟删除缓存是因为大多数的数据库并不是一个,一个数据库存在数据库损坏、宕机等问题。数据库需要做主从同步的操作,把数据库(主数据库)的数据同步到另一个数据库(从数据库)中,以实现数据的备份、负载均衡、灾难恢复等功能。数据库在做主从同步时有延迟。所以延迟双删,需要等待主从同步完成。

​ 缺点:不能确定主从同步完成的时间,如果没有数据同步完成,查询缓存时容易出现脏数据,所以延迟双删有查询出脏数据的风险。

主从同步详解:

​ 主从同步是指在数据库系统中,通常将一个数据库(主数据库)的数据同步到另一个数据库(从数据库)中,以实现数据的备份、负载均衡、灾难恢复等功能。

概念和步骤:
  1. 主数据库(Master):负责处理写操作和更新操作的数据库。所有的写操作都先在主数据库上执行。
  2. 从数据库(Slave):接收主数据库的变更,并进行同步,可以用于读操作或备份。从数据库通常是只读的,不允许直接对其进行写操作。
  3. 复制(Replication):指将主数据库的变更操作(如插入、更新、删除)同步到从数据库的过程。复制可以是异步的,也可以是半同步或同步的。
  4. 同步延迟(Replication Lag):主从同步中存在一定的延迟,即主数据库发生变更后,从数据库接收并应用这些变更之间的时间差。
工作原理:
  • 主数据库记录所有的数据变更操作,并将这些变更以日志形式发送给从数据库。
  • 从数据库接收到主数据库的变更日志后,按照相同的顺序和操作方式进行变更,从而保持与主数据库数据的一致性。
  • 当从数据库发生故障或需要切换时,可以快速切换到主数据库继续提供服务。
二、分布式锁(必须保证数据的强一致性)

通过加锁的方式,保证执行时只有一个线程去操作,其他线程需要等待有锁的线程释放锁。(性能太低)

可以通过加共享锁、排它锁提高性能。

共享锁:其他线程可以共享读的操作,在读操作时不能进行写的操作。

排它锁:线程在加锁后对其他线程阻塞,不允许其他线程进行读写操作。

缺点:

​ 虽然数据保持了强一致性,但是性能低。适用于对数据要求必须一致的业务使用。

三、异步通知(允许数据短暂的不一致性)

使用异步通知保证数据的最终一致性。

1、MQ(消息中间件)异步通知:

​ 当请求操作完数据库后,发送一个通知给MQ(消息中间件),在缓存服务中去监听MQ(消息中间件),收到通知后去更新Redis缓存。异步通知能够保证数据的最终一致性。主要是靠MQ(消息中间件)的可靠性。

2、基于Canal的异步通知:

​ 当MySQL数据库中的数据发生变化时(如插入、更新、删除操作),对应的binlog中会记录下这些数据变更事件,Canal接收到数据变更后,去通知缓存去更新数据。

好处:对于业务代码几乎是零侵入的。

标签:缓存,数据库,Redis,同步,MySQL,一致性,数据
From: https://www.cnblogs.com/My-knowledge/p/18079785

相关文章

  • 捉虫日记 | MySQL 8.0从库某些情况下记录重放的CREATE TABLE、DROP TABLE语句到慢日志
    作者:卢文双资深数据库内核研发本文首发于2023-11-3020:47:35https://dbkernel.com问题描述当主从复制采用binlog的行模式时,如果从库启用slow_query_log、log_slow_replica_statements且从库重放CREATETABLE、DROPTABLE时因特殊情况(比如被从库其他SQL占用MDL......
  • Red Hat Enterprise Linux 7 / Oracle Linux 7 安装 MySQL
    如果你的系统只支持RedHatEnterpriseLinux7/OracleLinux7,并且你已经下载了`mysql80-community-release-el7-11.noarch.rpm`包,那么你可以按照以下步骤来安装MySQL:1.首先,使用`rpm`命令来安装`mysql80-community-release-el7-11.noarch.rpm`包:```bashsudorp......
  • Linux安装jdk和mysql
    Linux安装jdk和mysqlJDK安装操作步骤:使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux空jdk-8u171-inux-x64.tar.gz(这里注意自己的路径即可)解压安装包,命令为tar-zxvfjdk-8u171-linux-x64.tar.gz-C/usr/local配置环境变量,使用vim命令修改/etc/profile文件,在文件......
  • redis-server.exe 双击闪退还显示未连接
    Redis下运行cmd:D:\Redis-x64-3.0.504>redis-server.exeredis.windows.conf报错:[7672]13Mar21:29:36.738#CreatingServerTCPlisteningsocket*:6379:bind:Noerror执行客户端(可以在下载的地方双击redis-cli.exe,也可以执行命令):D:\Redis-x64-3.0.504>red......
  • Redis缓存和MyBaits整合
    目录一.基础知识1.Redis缓存2.特点二.使用Redis1.下载redis2.安装RedisDesktopManager软件3.连接Redis三.Redis缓存和MyBaits整合1.加入依赖2.配置文件3.配置类4.创建数据库和实体类5.使用四.练习一.基础知识1.Redis缓存缓存(*Cache),就是数据交换的*缓......
  • 诚意满满之MySQL实现事务隔离的秘诀:锁与MVCC
    如果对事务没有太多理解,可以看前面三篇:诚意满满之讲透事务诚意满满之讲透事务隔离级别诚意满满之MySQL如何实现原子性、持久性不看前三篇也没有关系,知识点是独立的。MySQL的四个事务隔离级别:读未提交、读已提交、可重复读、串行读。其中,读未提交即是不加任何限制,串行读则......
  • mysql 获取临时密码
    安装MySQL服务器后,你需要进行初始化设置。以下是一些基本步骤:1.**启动MySQL服务器**```bashsudosystemctlstartmysqld```2.**获取临时密码**在首次启动MySQL服务器时,系统会为root用户生成一个临时密码。你可以通过查看MySQL日志来获取这个临时密码:```bashsudo......
  • mysql数据库的安装(图文详解)
    如果之前电脑有装过mysql数据库,一定要卸载干净,再重新安装!!!卸载教程点击下面这个链接https://www.cnblogs.com/wbxh/articles/180792221、下载mysql的安装包下载地址https://dev.mysql.com/downloads/installer/2、开始mysql的安装(这里以5.7为例)3、安装完成......
  • 疫苗接种管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍疫苗接种管理系统是一种旨在提高疫苗注射效率、确保接种记录准确性的信息系统。在全球疫情常态化防控的背景下,此类系统对于实现疫苗的快速分发、接种情况追......
  • 养老公寓管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍随着社会老龄化的加速,养老服务成为社会关注的焦点。养老公寓作为服务老年人群的重要居住形式,其管理水平直接影响到老年人的生活质量和家属的满意度。一个功......