前言
以mysql_redis 为例 介绍 数据一致性
1:数据一致行(单进程/单线程)
这个没什么说的,都是串行
2:数据一致行(多进程/多线程)
读的逻辑,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
参考 https://cloud.tencent.com/developer/article/2245213
1> 先写mysql,再写redis
2>先写redis,在写mysql
3>先删redis,再写mysql
4> 先删redis,再写mysql,延迟N时间,再删redis
5> 先写mysql,再删redis (可以借助消息队列的重试机制)
6> 先写mysql,通过binlog,异步更新redis
7> 单数据库 + redis, 某索引的数据查询与修改在同一线程里,可以忍受脏数据的可以在其他线程里查询,适合逻辑简单的
1,2,3是铁定有问题的
4 双删的方案,也有点问题,延时再删除, N不好确定啊,N小了,第二次删空了,老数据又重新存储到缓存了,N大了,不就是卡了么
5 先写mysql,再删redis 中间这段时间读取的是脏数据,自行评估能不能接受
借助消息队列的重试机制,也是异步操作,一样存储脏数据时间,自行评估能不能接受
6 会保证 MySQL 和 Redis 的最终一致性,相当于异步更新,中间过程,缓存里还是脏数据,自行评估能不能接受
7 单数据库 + redis时,只需要保证查询与修改 在同一线程里操作,无需管是不是多线程模式,适合逻辑交互简单的(玩家间没什么交互),相当于处理个人数据时为 串行处理
eg:游戏中玩家数据, 玩家ID为主索引,玩家A,玩家B,工会, 线程A,线程B,线程C
只需要玩家A 的操作全在线程A 里操作,玩家B 的在线程B 操作,工会 在线程C 操作(工会里涉及玩家的数据由玩家线程发送过去,要更新时,如玩家在线由玩家线程更新,不在线统一到固定某线程更新),排行榜,拉数据打竞技等 可以忍受脏数据的可以在别的线程查询(查db或缓存都可以)
图画工具推荐下 :draw.io 线上线下都可以用,还时开源的 download:https://app.diagrams.net/
3:如果觉得有用,麻烦点个赞,加个收藏