1. Redis 缓存操作流程:
2. 在高并发情况下, Redis 不一致产生的原因?
2.1 先写MySQL 数据,再删缓存; 先删缓存,再写MySQL数据,都存在缓存不一致的情况。举个例子:
先删缓存,再写MySQL数据: 线程1 删除了缓存,但是还没有来的急写MySQL;另外一个线程2 正好读这个缓存,没有发现,线程2去MySQL里面去读取数据,最后原来的线程1更新了数据,那么线程1读到是脏数据。
先写MySQL,再删缓存:线程1 写入了MySQL数据,还没有来的急删除数据,此时线程1 突然宕机了,删除缓存没有成功,则出现缓存不一致情况。
3. Redis不一致解决方案。
3.1 采用延时双删策略:
代码如下:
public void write(String key,Object data){
redis.delKey(key);
db.updateData(data);
Thread.sleep(500);
redis.delKey(key);
}
为什么要加延时,这里特别说明一下,为了防止写操作完成后,上面 2.1 中读请求执行完毕,删除可能造成的脏数据。
3.2 异步更新Redis缓存(基于MySQL的binlog同步机制)
Redis+ 消息队列+binlog 实现。当MySQL 数据变更(增加,修改,删除)操作,那么触发 mysql 的 binlog 机制,增量通过消息队列来异步跟新Redis的缓存数据。这里可以结合阿里巴巴的 cannal 框架,来处理binlog变更的操作,更新Redis。
以此来保证Redis缓存的一致性。