Redis缓存异常及解决方案

本文分享自天翼云开发者社区《Redis缓存异常及解决方案》,作者:l****n

本文向读者解释了Redis使用过程中,数据不一致、缓存雪崩、缓存击穿和缓存穿透等问题的定义,并给出对应的解决方案。 1、数据不一致 一致指的是: 缓存中有数据,那么,缓存的数据值需要和数据库中的值相同; 缓存中本身没有数据,那么,数据库中的值必须是最新值。 不一致如何发生: 对于读写缓存来说,写缓存时同步写数据库,需要使用事务保证缓存和数据库的更新具有原子性。弱一致性情况下,可以使用异步写回。 对于只读缓存,删改数据需要既更新数据库,又删除缓存。如果不使用事务,就会出现数据不一致。 比如先更新数据库,再删除缓存。更新成功,删除缓存失败,则缓存中为旧值。如果先删除缓存再更新数据库,则缓存删除成功,数据库更新失败,再访问数据库,数据库还是旧值。 解决方案 需要重试机制,当两个操作任意一个失败时,重新执行。 特别的,当数据库更新成功,缓存删除也成功时,其实也有可能不一致。比如删除了缓存,还未更新数据库。线程B此时读取数据库中旧值并写到缓存。 解决方法:延迟双删。sleep是为了等B线程执行完写缓存操作。sleep时间根据读数据和写缓存时间来估算。 redis.delKey(X) db.update(X) Thread.sleep(N) redis.delKey(X) 比如更新了数据库,还未删除缓存时。B线程就开始读数据,从缓存读到旧值。不过这种情况下缓存会马上被删除,所以影响较小。 

2、缓存雪崩 大量请求无法在redis得到处理,从而打到数据库。主要原因: 缓存中大量数据同时过期,应用访问时无法命中缓存,从而都请求到数据库; redis宕机。 解决方案: 过期时间增加随机数; 发生雪崩时进行服务降级。非核心数据直接返回默认值或错误; 限流熔断,当数据库负载突升时,暂停业务应用对缓存的访问。

3、缓存击穿 热点数据过期失效,大量请求突然打到数据库。 解决方法 热点数据不设置过期时间。

4、缓存穿透 数据不在缓存中,也不在数据库中。可能原因: 业务层误操作,删除了数据库数据。 恶意攻击。 解决方案: 缓存默认值; 使用布隆过滤器快速判断数据是否存在; 前端进行请求检查。

在实际的业务中,以上异常场景可能会同时出现,排查时要根据自己的情况进行针对性分析。

点赞
收藏

评论区

加载中...

相关推荐

Redis 击穿、穿透、雪崩的解决方案

Redis击穿、穿透、雪崩的解决方案击穿和穿透场景:指的是单个key在缓存中查不到,去数据库查询(透过redis去查db叫击穿)区别:击穿:数据在数据库中真实存在,缓存丢失,大量请求击穿数据库穿透:数据在缓存中没有,数据库中也没有

Redis 总结精讲

本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题

Redis持久化机制(文末有福利)

        上一篇主要针对Redis的内存淘汰机制以及Redis容易引发的三大问题:缓存击穿、缓存穿透以及缓存雪崩进行了详细的讲解以及提供了业界常用的解决方案。本篇主要讲讲Redis的持久化机制,Redis受开发者欢迎的一大原因就是因为可持久化的特性。我们如何保证Redis宕机之后重启可以将数据进行恢复?所以一般情

Redis 缓存穿透、缓存雪崩的概念及其预防

缓存穿透【什么是缓存穿透】频繁查询不在缓存中的数据,给原本被缓存保护的系统过大压力。【为什么会发生缓存穿透】1\.程序没写好;2\.恶意攻击。【怎样防止缓存穿透】1\.在对key进行查询之前,先做初步判断,如果key一定不存在(例如,对某表的缓存,key一定由数字组成,那么包含非数字的key一定是不存在的

Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

\TOC\Redis之缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级1、缓存雪崩  发生场景:当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机  解决办法:    1)随机均匀设置失效

Redis缓存穿透、缓存雪崩和缓存击穿

Redis缓存穿透、缓存雪崩缓存雪崩,是指在某一个时间段,缓存集中过期失效。产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都过期了。而对这批商品的访问查询,都落到了数据库上,对于数据库而言,