(短文)使用redis缓存会发生的问题: 双写一致性

业务增长迅速,于是加入了一些缓存,如redis来缓存一些数据,提高系统的响应能力。

数据最终流向 ->> database,redis,elasticsearch,hadoop

保证这几个数据源之间数据一致性

(短文)使用redis缓存会发生的问题: 双写一致性

改良方案

将数据按顺序记录,写入某个消息队列,然后其他系统按消息顺序恢复数据

1.一致性问题

这种情况下,各个数据源之间数据肯定是一致的。因为写入顺序已经在消息队列中定义好,各数据源按照消息队列中的消息顺序,恢复数据即可,并不存在竞争现象。因此,不会出现不一致的问题!

2. 原子性问题

这种情况下,如果写入DataSource失败, 例如出现了网络问题,这条消息恢复失败了。这个问题其实好解决,一般我们在顺序根据消息恢复数据的时候,会记录下坐标。如果写入失败,停止恢复数据。下次从该坐标处恢复数据即可。

缓存一致性问题

Cache Aside Pattern–先写数据库,再删缓存[经典做法]
为什么更新数据库后不更新而是删除缓存?
冷数据不会经常被访问, 频繁更新缓存代价大
其实删除缓存,而不是更新缓存,就是一个 Lazy 计算的思想,不要每次都重新做复杂的计算,不管它会不会用到,而是让它到需要被使用的时候再重新计算。