如何保证一致性?
单点
Cache Aside Pattern
1.命中:程序先从缓存中读取数据,如果命中直接返回
2.失效:程序从缓存中读取数据,如果没有命中,则从数据库读取,成功之后将数据放到缓存中
3.更新:程序先更新数据库,再删除缓存(可以配上延迟删除)
为什么不先更新缓存在更新数据库?
假如说更新数据库失败了,数据库要回滚,那缓存也要回滚吗?
那为啥不先更新数据库再更新缓存呢?
如果现有两个线程A、B,A更新了数据库的数据 a = 1; 然后B抢占到了资源 更新缓存的数据a = 2,此时线程A将数据更心动缓存 会产生a = 1的结果。
那删除缓存再更新数据库呢?
先把缓存删除了,那上面的例子,B进来想读缓存原来的数据发现没有,去数据库读到a = 2,此时线程A又将数据库数据改为a = 1
集群数据库
让Redis订阅主数据库的binlog,这样即使从数据库没有即使同步到数据,线程B进来的读的时候也可以从Redis里读到A = 1
假如Redis就是订阅不到binlog咋整?还有一种方式就是消息队列。如图