1.常用的缓存图如下:
高频查找某数据时,可以考虑使用redis缓存。当查找时,首先从redis中查找,如果已存在就直接从redis读取返回,如果redis中不存在,就从数据库中查找,再写入Redis中,这样下次可以直接从缓存中读取,通过缓存大大提高了服务的查询性能。
但是如果是数据需要更新,此时先操作数据库还是先操作缓存,操作缓存又有两种方式,是对缓存进行更新,还是对缓存进行删除都有讲究,下面分别进行讨论。
2.删除缓存而不是更新缓存,因为有并发性的问题
问题说明:线程1更新数据库,线程2更新数据库,线程2先更新缓存,线程1再更新缓存,此时就会导致缓存中的是旧的数据,数据库里是新的数据。并且在缓存失效时间内,都是读取的旧的数据。
3.不能使用先删除缓存,再写库的
问题说明,线程1删除了缓存,此时线程2查询,会将数据库的值写入缓存,线程1进行更新,此时会发现缓存和数据库不一致。
4.缓存双删解决极端情况:
还有一种极端的情况,因为某些原因,如下图所示,某一个时刻缓存失效,此时线程2查数据,缓存无,就从数据库中查,再从数据库中查完还没有来得及写入缓存时,线程1来了,更新了数据库,并且删除了缓存,然后线程2接着写入缓存。此时缓存中就是旧的数据。
解决办法,缓存双删:线程1隔一段时间后,第二次删除缓存,这样避免了线程2的影响。
5.总结:
要保证缓存和数据库强一致,最好的办法是使用分布式锁,但是这样影响会影响并发性能。所以我们能做的是尽可能减少不一致的概率。我们一般采用的是:
1)使用删除缓存的方式,而不是更新缓存的方式
2)先操作数据库,再操作缓存
参考:
1) bilibili 老齐300讲
2)缓存和数据库一致性问题,看这篇就够了 ()
如果觉得《redis 数据库 缓存一致性》对你有帮助,请点赞、收藏,并留下你的观点哦!