1.为什么会不一致 ?

Redis 是缓存层,数据库是持久层。
二者数据可能不一致的原因包括:
更新数据库成功,但更新缓存失败;
缓存提前过期;
并发写操作覆盖(顺序问题);
异步更新延迟。

2.更新策略

2.1 Cache Aside(旁路缓存)

读操作
1. 读缓存
2. 如果缓存不存在 ,再读数据库
3. 将数据写入缓存(设置过期时间)
写操作: 先更新数据库,再删除缓存

缺点:删除缓存可能失败;删除顺序不当会不一致

2.2 Read/Write Through(读写穿透)

应用不直接访问DB,所有读写都经由缓存代理完成

缺点:实现复杂,性能略低	

2.3 Write Behind(异步写回)

只写缓存,由缓存异步刷回数据库	

缺点:容易丢数据	

3.处理并发问题

3.1延迟双删策略(Double Delete)

1. 更新数据库;
2. 删除缓存;
3. 延迟 500ms 再删一次缓存。
//可以应对并发中缓存被“脏写”回的情况。

3.2异步消息队列(MQ)

数据更新时发送 MQ 消息,异步同步缓存状态。

3.3分布式锁

保证更新操作串行执行,避免交叉覆盖。