redis 数据库 缓存一致性

1.常用的缓存图如下:

redis 数据库 缓存一致性_第1张图片

高频查找某数据时,可以考虑使用redis缓存。当查找时,首先从redis中查找,如果已存在就直接从redis读取返回,如果redis中不存在,就从数据库中查找,再写入Redis中,这样下次可以直接从缓存中读取,通过缓存大大提高了服务的查询性能。

但是如果是数据需要更新,此时先操作数据库还是先操作缓存,操作缓存又有两种方式,是对缓存进行更新,还是对缓存进行删除都有讲究,下面分别进行讨论。

2.删除缓存而不是更新缓存,因为有并发性的问题

redis 数据库 缓存一致性_第2张图片

问题说明:线程1更新数据库,线程2更新数据库,线程2先更新缓存,线程1再更新缓存,此时就会导致缓存中的是旧的数据,数据库里是新的数据。并且在缓存失效时间内,都是读取的旧的数据。

3.不能使用先删除缓存,再写库的

问题说明,线程1删除了缓存,此时线程2查询,会将数据库的值写入缓存,线程1进行更新,此时会发现缓存和数据库不一致。redis 数据库 缓存一致性_第3张图片

4.缓存双删解决极端情况:

还有一种极端的情况,因为某些原因,如下图所示,某一个时刻缓存失效,此时线程2查数据,缓存无,就从数据库中查,再从数据库中查完还没有来得及写入缓存时,线程1来了,更新了数据库,并且删除了缓存,然后线程2接着写入缓存。此时缓存中就是旧的数据。

redis 数据库 缓存一致性_第4张图片

 解决办法,缓存双删:线程1隔一段时间后,第二次删除缓存,这样避免了线程2的影响。

redis 数据库 缓存一致性_第5张图片

5.总结:

要保证缓存和数据库强一致,最好的办法是使用分布式锁,但是这样影响会影响并发性能。所以我们能做的是尽可能减少不一致的概率。我们一般采用的是:

1)使用删除缓存的方式,而不是更新缓存的方式

2)先操作数据库,再操作缓存

参考:

1) bilibili 老齐300讲

2) 缓存和数据库一致性问题,看这篇就够了 (qq.com)

你可能感兴趣的:(redis,缓存)