首页 > 数据库 >Redis和Mysql如何保持数据一致性

Redis和Mysql如何保持数据一致性

时间:2024-08-01 22:27:18浏览次数:17  
标签:缓存 数据 数据库 Redis 更新 Mysql 一致性 保持数据

一般情况下,Redis是用来实现应用和数据库之间读操作得缓存层,主要目的是减少数据库IO,还可以提升数据的IO性能。

当应用程序需要去读取某个数据时,会首先尝试去Redis里面加载,如果命中就直接返回,如果没有命中,就去从数据库中查询,查询到数据之后再把这个数据缓存到Redis里。

 如果一份数据,同时保存在数据库和Redis里面,当数据发生变化时,需要同时去更新Redis和Mysql,由于更新是有先后顺序的,并且他不像Mysql中多表事务操作,可以满足ACID特性,和会出现数据一致性的问题

这种情况下,只有两种方法:

1.先更新数据库,在更新缓存

2.先删除缓存,在更新数据库

如果先更新数据库,在更新缓存,如果缓存更新失败,会导致数据不一致

如果是先删除缓存,在更新数据库,理想是应用下次访问Redis时,发现Redis里面是空的,就从数据库中加载保存到Redis,那么数据是一致的。但是会有极端情况,由于删除Redis和更新数据库这两个操作不是原子的,所以这个过程如果有其他线程来访问,还是会存在数据不一致的情况。

 所以在极端情况下,如果依旧想保持数据一致性,就需要采用最终一致性方案。

比如,基于RocketMQ的可靠性消息通信,来实现最终一致性。

还可以直接通过Canal组件,监控Mysql中binlog日志,把更新后的数据同步到Redis里面。

因为这里是基于最终一致性来实现的,如果业务场景不能接受数据的短期不一致性,那就不能使用这个 方案来做。 以上就是我对这个问题的理解。谢谢大家

标签:缓存,数据,数据库,Redis,更新,Mysql,一致性,保持数据
From: https://blog.csdn.net/qq_55846232/article/details/140858254

相关文章

  • 7.Redis的Hash类型
    Hash类型,也叫散列,其value是一个无序字典,类似于HashMap结构。问题String结构是将对象序列化为json字符串后存储,当需要修改对象某个字段是不是很方便。key                            value(将java对象序列化为json......
  • 4.Redis数据结构&通用命令
    Redis数据结构Redis是一个键值对的数据库。key:大多都是Stringvalue:类型多种多样 Redis通用命令keys:查看所有的key不建议在生产环境上使用keys命令,因为redis是单线程的,keys命令会搜索很长一段时间,搜索的期间redis无法执行其他的命令,等于服务被阻塞了,影响redis的性......
  • MySQL高级——MySQL的储存过程
    目录一、什么是储存过程 二、变量定义2.1局部变量2.2用户变量(会话变量) 2.3系统变量 2.3.1全局变量2.3.2会话变量三、定义参数四、分支流程4.1if判断4.2case分支  五、循环流程5.1循环-while5.2循环-repeat 5.3循环-loop 六、游标 七、异常......
  • 5分钟掌握软件测试必会mysql数据库知识(数据类型和数据约束
    mysql常用数据类型mysql的常用数据类型,主要有四种,需要我们重点掌握。1整型int整型分成两类,一类是有符号的,就是负数,一类是无符号的,就是正整数。很多时候我们需要的就是无符号的。比如年龄。2小数decimal小数的设置需要我们特别去了解一下。例如:decimal(4,2)这是表示......
  • docker 安装 redis
    1、拉取redisdockerpullredis2、配置redis路径mkdir-p/data/redis/confmkdir-p/data/redis/data#配置redis.conf#bind192.168.1.10010.0.0.1#bind127.0.0.1::1#bind127.0.0.1protected-modenoport6379tcp-backlog511requirepass000415timeout0tcp-keepal......
  • Redis过期key的删除策略
    在Redis中,设置了过期时间的键在过期时间到达后,并不会立即从内存中删除。如果不是,那过期后到底什么时候被删除呢?下面对这三种删除策略进行具体分析。立即删除:立即删除能够保证内存数据的及时性和空间的有效利用,但在处理大量过期键时,它可能会对系统性能产生负面影响。优点......
  • docker方式安装redis集群
    创建一个Redis集群,你需要按照一定的步骤来配置Docker容器和Redis实例。以下是详细的步骤来帮助你完成这个过程,并创建一个包含六台服务器的Redis集群。准备工作确保你已经安装了Docker和DockerCompose(可选但推荐)。创建Redis集群创建目录结构在主机上创建必要的......
  • 安装多个mysql
    下载文件wgethttps://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz解压到目录在文件夹建立my.cnf配置文件[client]port=3309socket=/data/mysql83309/mysqld.sock[mysqld_safe]socket=/data/mysql83309/mysqld.sock[mysq......
  • redis集群搭建,哨兵集群搭建
    一、首先创建redis文件夹,下载redis源码(通过yum下载无法指定文件夹,比较乱)[root@dxhredis]#mkdir/redis[root@dxhredis]#cd/redis/[root@dxhredis]#wgethttp://download.redis.io/releases/redis-6.2.6.tar.gz二、解压源码,并下载工具进行编译[root@dxhredis]#ta......
  • MySQL 学习笔记 进阶(InnoDB引擎 下)
    InnoDB引擎 InnoDB引擎-事务原理-概述事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。一致性(Co......