在高并发的场景下,数据库处理数据增删改查很是薄弱。有一些数据查询的频率远大于修改频率,就需要使用缓存技术,让先去请求redis,redis存在返回缓存数据,redis不存在就查询数据库,返回数据的同时将数据缓存到redis中。
读取缓存一般没有什么问题,一旦涉及到数据更新:数据库或者缓存更新,就容易出现缓存和数据库数据不一致情况。首先,数据“一致性”包含两种情况:
在高并发的情况下,不管是先写数据库,再删缓存;还是先删缓存,再写数据库,都有可能出现数据不一致的情况,比如:
1、先删除缓存
2、再写数据库
3、休眠500ms(根据统计线程读取数据和写缓存的时间)
(休眠的作用是当前线程等其他线程读完了数据后写入缓存后,删除缓存)
4、再删除缓存
先清除缓存,然后再写入数据库。有可能存在删除缓存以后,另一个线程读取数据,发现没有数据,就去数据读取数据,然后写入缓存中,此时缓存中的数据为脏数据;
解决办法:
原文:https://www.cnblogs.com/jeremylai7/p/15029801.html