原创

redis缓存问题与数据一致性问题

redis缓存问题与数据一致性问题

缓存雪崩

缓存雪崩是指设置缓存时采用了相同的过期时间,导致缓存在某一个时刻同时失效,或者缓存服务器宕机宕机导致缓存全面失效,请求全部转发到了DB层面,DB由于瞬间压力增大而导致崩溃。缓存失效导致的雪崩效应对底层系统的冲击是很大的。

解决方式

1、对缓存的访问,如果发现从缓存中取不到值,那么通过加锁或者队列的方式保证缓存的单进程操作,
从而避免失效时并发请求全部落到底层的存储系统上;
但是这种方式会带来性能上的损耗。
2、将缓存失效的时间分散,降低每一个缓存过期时间的重复率。
如果是因为缓存服务器故障导致的问题,一方面需要保证缓存服务器的高可用,
另一方面,应用程序中可以采用多级缓存。

缓存穿透

缓存穿透是指查询一个根本不存在的数据,缓存和数据源都不会命中。出于容错的考虑,如果从数据层查不到数据则不写入缓存,即数据源返回值为 null 时,不缓存 null。缓存穿透问题可能会使后端数据源负载加大,由于很多后端数据源不具备高并发性,甚至可能造成后端数据源宕掉

解决方式

1、如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。
这种办法最简单粗暴。比如,”key” , “&&”。
2、在返回这个&&值的时候,我们的应用就可以认为这是不存在的key。
那我们的应用就可以决定是否继续等待继续访问,还是放弃掉这次操作。
如果继续等待访问,过一个时间轮询点后,再次请求这个key,如果取到的值不再是&&,则可以认为这时候key有值了,
从而避免了透传到数据库,从而把大量的类似请求挡在了缓存之中。
3、根据缓存数据Key的设计规则,将不符合规则的key进行过滤。
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的BitSet中,
不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力
正文到此结束
广告是为了更好的提供数据服务
本文目录