解决方案一:延时双删

https://zhuanlan.zhihu.com/p/147028497

1、删除缓存

(其他线程此时查询缓存为空,会查询到数据库的旧值,并回填脏数据)

2、更新数据库

3、休眠500ms,等待脏数据回填完成

4、再次删除缓存,清空脏数据

 

解决方案二:内存队列

https://www.jianshu.com/p/5561d7d6dea7

1、操作业务时,直接将其丢进队列,等待异步执行;

2、当出现读请求时,先读缓存,成功则返回;

3、如果缓存不存在,再去判断队列头部是否是同一条记录的更新请求;

4、如果是,为了不打断其操作,将读请求也丢进队列,然后同步等待缓存更新完成;

5、如果不是,说明该更新请求早已完成,直接读数据库并缓存即可,不要入队列。