0%

redis(二)

Redis 中如何保证缓存和数据库双写时的数据一致性

无论先操作db还是cache,都会有各自的问题,根本原因是cache和db的更新不是一个原子操作,因此总会有不一致的问题。想要彻底解决这种问题必须将cache和db的更新操作归在一个事务之下(例如使用一些分布式事务,或者强一致性的分布式协议)。

或者采用串行化,可以保证强一致性。

写请求为什么更新数据库后是删除缓存而不是更新缓存?

在这里插入图片描述
注意看上面的图片,当有两个写请求的线程,线程一比线程二先执行,反而是线程二先执行完。这时候,缓存保存的是A的数据(老数据),数据库保存的是B的数据(新数据),数据不一致了。

写请求时,为什么更新数据库,然后再删除缓存?

在这里插入图片描述
如果采用写请求,先删除缓存,再更新数据库就会出现如上图的情况,线程B读到的是老的数据,并且缓存中也保存的是老的数据。

写请求时,先更新数据,后删除缓存一定没有问题吗?

在这里插入图片描述
可以看到一个读请求和一个写请求,读请求可能会读取到旧的数据,或者当写请求删除缓存失败,读请求会一直读取的是旧的缓存数据。只不过是这种情况,相对于其他的实现方式概率要低很多。