Redis 和 MySQL 数据不一致性
具体如何去解决还得结合业务去综合考虑。
下面几个方式可能比较通用
1. 双删法
写流程
- 先删除缓存
- 写更新数据库
- 再次删除缓存 => 避免在第二步的时候有读请求访问数据库,然后把旧的值写入到缓存中
每一个region servser维护一个或多个Hlog(1.X版本可以开启multiwal),而不是每一个region一个日志。这样不同 region(可能来自来自不同 table) 的日志会混在一起,这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对 table 的写性能。带来的麻烦是,如果一台 region server 下线,为了恢复其上的 region,需要将 region server 上的 log 进行拆分,然后分发到其它 region server 上进行恢复。
HLog中日志单元WALEntry表示一次行级更新的最小追加单元(图中红色/黄色小方框)。它由两部分组成:HLogKey和WALEdit,HLogKey中包含多个属性信息,包含table name、region name、sequenceid等;WALEdit用来表示一个事务中的更新集合,一次行级事务可以原子操作同一行中的多个列。上图中WALEdit包含多个KeyValue。