缓存更新策略
2025-4-20
| 2025-4-20
Words 990Read Time 3 min
type
status
date
slug
summary
tags
category
icon
password
Redis在减少服务器的负载压力的同时,也带来的一些问题:最大的问题就是缓存中的数据和数据库的数据不一致的问题。
第一种是靠redis去维护数据的一致性,只有等内存不足的时候才会去更新缓存,但如果内存一直很充足,那么缓存的数据就一直不会更新。
第二种是给数据设置超时时间,比如30分钟,数据超时删除之后,缓存数据删除,从数据库里查询数据,更新缓存。但如果在30分钟之内更新了数据库里的数据,就造成了缓存和数据库数据不一致的问题。
第三种是靠编码控制,主动更新,并且以超时删除作为兜底方案。更新数据库的同时去更新缓存。
notion image

主动更新策略

第一种是由程序员操作缓存和数据库,保证数据一致性
第二种:由一个服务去保证缓存和数据库的一致性。对外是隐藏的,表面上只是调用了增删改查接口。但是想要维护一个这样的服务是比较凹i麻烦的。
第三种是,程序员只操作缓存,开一个线程定时的去看缓存和数据库的数据是否唯一,由其他线程保证数据的一致性。但是维护这样一个线程也是比较麻烦的。
notion image
image-20230722170444345

缓存和数据库更新策略

1、 reids的作用是为了查询更快,更新缓存的问题在于如果每次更新数据库都去更新缓存。更新100次数据库也就更新了100次缓存,但是这中间并没有任何查询操作。那其实这么多次的缓存更新是无效的。删除缓存就可以解决这个问题,因为删除只需要一次,等真正由查询的时候再去同步缓存,那么即使更新100次数据库,也只会同步一次缓存数据。
2、一般是单体服务,可以把数据库和缓存放在一个事务当中。
notion image
image-20230722171716508
3、操作缓存和更新数据库的顺序

先删除缓存,再更新数据库

正常情况下

notion image

异常情况下

当删除完缓存时,更新数据库需要的时间比较长时,这时线程2插入进来查询数据,查询缓存没有数据,就去查询数据库但那边还没有更新数据库,所以此时查出的数据还为10,再写入缓存,10。线程1完成更新数据库操作。结果就是缓存和数据库的结果不一致了。
notion image

先操作数据库再删除缓存

正常情况下

先更新数据库,再把缓存删除,下次去查询的时候,未命中,查询数据库,写入缓存,这样可以保证数据库和缓存的一致性。
notion image

异常情况下

前提条件:由于异常情况,缓存失效了
先查询缓存,未命中,查询数据库,这时查的数据是:10
此时线程2更新数据库为20,删除缓存。
最后线程1写入缓存,但写入的结果是10。就造成了数据库缓存不一致的结果。
notion image

总结:

1、由程序员操作缓存和数据库的一致性,可以更加保证数据库的一致性。
2、先操作数据库再更新缓存出现数据不一致的概率更小。
缓存穿透和缓存击穿维数组的动态和
Loading...