Redis和数据库之间数据不一致的问题。
出现的场景
在高并发场景下,同时有读和写的的操作,不管是先删除缓存,再写数据库,还是先写库,再删缓存,都有可能出现数据不一致的情况。
1. 如果先删除缓存,在写数据库之前,有个读数据的线程发现缓存为空,就去读取数据库,读到的是脏数据,拿脏数据更新redis缓存,导致了redis与数据库之间的数据不一致。
2. 如果先写数据库,在删除缓存之前,写数据的线程宕机了,也会导致数据不一致的情况。
解决方案
延时双删
写库前后都删除缓存一次,添加延时的目的是在写完库之后,等待读线程结束,延时之后在删除一次缓存。这样可以解决缓存不一致的问题,除非读线程读取数据的时间比延时时间还要长。
缺点就是延时带来了写请求的耗时。
伪代码如下:
public void write(String key,Object data){
redis.delKey(key);
db.updateData(data);
Thread.sleep(500);
redis.delKey(key);
}