首页 > 数据库 >mysql与redis如何保证数据一致性

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

时间:2023-04-08 23:45:23浏览次数:78  
标签:缓存 数据库 redis 同步 线程 mysql 保证数据

1.先更新MySQL数据库,再删除缓存,再从数据库查询到的最新的数据同步到redis。采用最终一致性性策略。

缺点:相较于mq的方式,这种方式由于要查数据库并将最新数据写到redis,可能会造成接口响应速度变慢。

2.更新mysql数据库,再采用mq异步的方式,将数据同步到redis中。

缺点:数据同步延时概率比较大,数据库的更改信息投递到mq中,消费者可能没来得及消费消息同步数据到redis。
优点:异步解耦

3.基于订阅mysql binlog,采用mq异步的形式将数据同步到redis(canal框架)。

将mysql以主从的方式部署,主库负责写,从库负责读,当主库的binlog日志文件发生改变时,将信息同步到从库,从库执行对应的sql,保证主从一致性。
canalServer端,伪装成mysql的从节点,订阅mysql主节点的binlog文件,当主节点的binlog发生变化时,会将binlog日志文件发送给canalServer端,自己创建的处理程序连接到canalServer端,将数据同步到redis。

优点:手动直接更改数据库也会自动同步到redis。

4.延时双删策略(不推荐)

  • 先删缓存,在更新mysql并同步到redis,在高并发的情况下,第一个线程还没来得及更新mysql时,其他线程读取到的缓存可能为null值,将mysql旧的数据同步到redis中了。

解决办法:延时删除,在t1线程更新数据库之后,sleep一段时间再去删除缓存。
缺点:t1线程延时多少秒再去删除缓存中的key?难以控制,得根据业务逻辑的执行时间和写缓存的时间来进行估算。

5.什么是双写一致性协议?
先更新数据库,在更新缓存。
updateDB();
updateredis();
多个线程同步修改mysql和redis时,由于mysql行锁机制,多个线程同时修改同一行数据,只能有一个线程修改成功,两个线程更新完数据库后同时更新redis,由于不能确保两个线程更新缓存的先后顺序,可能会造成数据库和缓存的不一致性。
解决办法:使用事务保证更新数据库和更新缓存整个两个操作的原子性。

参考:https://www.jianshu.com/p/1a6abe6eed74

标签:缓存,数据库,redis,同步,线程,mysql,保证数据
From: https://www.cnblogs.com/huang580256/p/17299585.html

相关文章

  • 1 REDIS 入门1
    1连接登录认证redis-cli -h hostip -pport -a pwd    命令行登录认证。入门常用,可用于登录远程redis库。出于安全考虑,可以不带密码先进行连接,然后再通过authpwd进行认证redis-cli  客户端工具。如果本机安装并启动了redis服务,redis-cli命令会直接连接......
  • MySQL笔记之Checkpoint机制
    CheckPoint是MySQL的WAL和Redolog的一个优化技术。 一、Checkpoint机制CheckPoint做了什么事情?将缓存池中的脏页刷回磁盘。checkpoint定期将dbbuffer的内容刷新到datafile,当遇到内存不足、dbbuffer已满等情况时,需要将dbbuffer中的内容/部分内容(特别是脏数据)转储到datafi......
  • 一文讲透 Redis 事务 (事务模式 VS Lua 脚本)
    准确的讲,Redis事务包含两种模式:事务模式和Lua脚本。先说结论:Redis的事务模式具备如下特点:保证隔离性;无法保证持久性;具备了一定的原子性,但不支持回滚;一致性的概念有分歧,假设在一致性的核心是约束的语意下,Redis的事务可以保证一致性。但Lua脚本更具备实用场景,它......
  • 10.大牛是怎么思考设计MySQL优化方案的?
    https://www.cnblogs.com/keme/p/10300154.htmlhttps://www.cnblogs.com/keme/p/10472283.html ......
  • go操作mysql
    数据库连接:使用database/sql包时必须注入(至少)一个数据库驱动。gogetgithub.com/go-sql-driver/mysql 导入包:import("database/sql"_"github.com/go-sql-driver/mysql") 通过Init函数连接数据库db,dbErr=sql.Open("mysql","root:root123456@tcp(127.0.0......
  • go操作redis
    前言:使用第三方开源的redis库:github.com/gomodule/redigo/redis需要先安装redis包gogetgithub.com/gomodule/redigo/redis 正文: window下打开redis服务:打开cmd命令行窗口cdC:\ProgramFiles\Redisredis-server.exeredis.windows.conf本地连接redistelnet127.......
  • 【MySQL】MySQL基础07— SQL学习 — DQL — 分组查询(转载请注明出处)
    SQL学习—DQL—分组查询5.分组查询背景:在分组函数的内容中,我们提及和分组函数一起查询的字段会有限制,产生错误。因为分组函数是将所以的参数统计成一个结果,而查询的字段是返回符合条件的个数,那么就会出错。所以引入了分组查询,将表中的相同的内容切分成数块,然后分别进行统......
  • Python ORM Pony MySQL数据库 常用操作
    Pony是一个高级的对象关系映射器ORM框架。Pony它能够使用Python生成器表达式和lambdas向数据库编写查询。Pony分析表达式的抽象语法树,并将其转换为SQL查询。支持SQLite,MySQL,PostgreSQL和Oracle等数据库,本文主要介绍PythonORMPony中MySQL数据库常用操作,及数据增加、删除、修......
  • 3.MySQL数据库 - 3
    MySQL数据库-3视图问题对于复杂的查询,往往是有多个数据表进行关联查询而得到,如果数据库因为需求等原因发生了改变,为了保证查询出来的数据与之前相同,则需要在多个地方进行修改,维护起来非常麻烦解决办法:定义视图视图是什么通俗的讲,视图就是一条SELECT语句执行后返回的结果集......
  • 2.MySQL数据库 - 2数据表数据的增删改查
    数据表数据的增删改查专项训练创建数据库、数据表--创建数据库createdatabasepython_test_1charset=utf8;--使用数据库usepython_test_1;--students表createtablestudents(idintunsignedprimarykeyauto_incrementnotnull,namevarchar(20)def......