解决Redis缓存和数据库值不一致问题
发布日期:2020-10-24 来源:CSDN
为什么会发生数据库和缓存数据的不一致问题
一致性是什么,一致性包含了以下两种:
- 缓存中有数据,那么数据库的数据必须要和缓存的数据要一致。
- 缓存中没有数据,在数据库值必须要是最新的数据。
- 同步写回策略:就是写入缓存时,必须要写入数据库,保证数据一致性。
- 异步写回策略:想写入缓存,等到缓存失效或者淘汰的时候,再写入数据库,此时如果还没有写入数据库,缓存就挂了,这样数据就会丢失,数据库就没有最新的值了。
删除数据怎么保Redis和数据库的一致性问题
数据删除时,先选择删除数据库还是先选择缓存。
一,选择先删除数据库。
- 当我们删除数据的时候,先选择删除数据库,后选择删除缓存时,会在一定事件内发生数据不一致问题,比如线程A和B还有其他,A在删除数据数据的时候,B和其他线程来读取数据,这个时候,B和其他线程会读取到旧值,当A线程删除完成删除缓存后就可以消除读取旧值问题。这个会造成一小段时间内会读取到旧值。
- 当我们删除数据的时候,先选择删除数据库,在删除缓存时,删除缓存失败了,会造成旧数据一直会读取。比如线程A和B还有其他,A在删除数据库成功了,A和其他线程删除缓存失败。就会造成B和其他线程一直在读取旧值。解决方法选择删除数据库的时候,通过消息中间件MQ或者Kafka发送一条删除指令,在数据库删除完成之后启动一个线程去删除缓存,如果删除失败一直做删除操作,一直到删除成功。
二,选择先删除缓存。
- 1.当我们删除数据的时候,先选择删除缓存,后选择删除数据库,会导致缓存出问题,比如线程A和B还有其他线程,A线程删除了缓存,还没有来及删除数据库(比如网络延迟),此时B和其他线程来读取消息,会发生缓存中没有数据,就会去数据库查询数据,数据库中的值还是以前的值,这样会造成缓存被重新更新为旧值,解决方法:可以使用缓存双删,可以把线程A休眠一段时间,这个时间是B线程读取数据被把数据写到缓存中的时间,这个时间还需要开发者在测试中找到比较准确的时间,来设置这个A线程的休眠时间。
- 当我们删除数据的时候,先选择删除缓存,后选择删除数据库时删除失败了,这样会造成缓存数据一直在数据库没有被删除,导致一直读取的时旧值,这样可以通过消息中间件去操作,直到数据库更新成功,在去删除缓存,这样的实现用到了缓存双删和消息中间件。
三,自我认为还是选择先删除数据库在去删缓存。
- 1.首先如果删除缓存,缓存缺失,会给数据库带来一定的压力。
- 2.如果业务中读数据和写缓存的时间控制的不好设置,那么双删的等待时间就不好设置。
四,如果业务中必须要准确的数据,保证数据一致性。
- 当删除数据库的值时,其他客户端短暂把并发请求暂存,等数据库删除和缓存更新之后再去发起请求,从而保证数据的一致性。这样下来并发就减小了。
添加数据怎么保Redis和数据库的一致性问题
一,选择先添加数据库。
二,选择先添加缓存。
- 当把数据先添加缓存时,添加数据库的操作出了问题,我们可以采用Mq或Kafka消息中间件发送添加指令,知道数据添加到数据库,则结束操作。
修改数据怎么保Redis和数据库的一致性问题
一.选择先更新数据库,对于读写缓存的读写并发操作
二.选择先更新缓存,对于读写缓存的读写并发操作
解决以上者两种修改操作,我们可以利用消息中间件可以做到,当失败了一直等到数据一致,保证数据库能更新,和缓存数据能够写进去,和删除的效果是一致的。
三.选择先更新数据库,对于读写缓存的写写并发操作
- 当先更新数据到数据库时,有两个线程A和B线程时,当A线程去修改数据库,B线程也去修改数据库,B线程去修改缓存,A线程在去修改缓存,会造成数据不一致问题。

