多线程高并发下数据一致性问题
缓存一致性背景
在高并发的场景下,缓存往往成为缓解数据库I/O压力最完美的选择;将并发高峰期请求频繁的数据放入缓存,请求派发时优先操作(读取或者修改)缓存中的数据,然后在异步同步到数据库中。这种处理方式在理想情况下是很完美的,它使得数据库I/O不再试并发瓶颈,指数扩张了整个系统的吞吐量。倒是现实却也存在很多问题:
数据一致性问题,是指缓存中的数据和持久化存储中的数在某一时刻存在不一致的情况。今天缓存以redis为例,持久化以mysql为例。
解决方案
不管是先写库还是先删除数据在写库,还是先删除数据然后写库然后再删除,都存在数据不一致的情况,因为在高并发的场景下,写和读是高频率并发的,你无法提前预知谁先到来。针对这一问题,目前业界有一下四个解决方案:
第一方案:经典的延时双删策略,伪代码如下:
public void updateUserInfo(String key,UserBasic userBasic){
redis.delKey(userBasic.