现分析Redis缓存使用过程失效的一些问题,在有缓存的情况下,查询数据的顺序是先查询缓存,如果查询到数据则直接返回数据,如果没有查询到数据,则到数据库中查询,数据库中有数据的话,将查询出的数据写到缓存并返给用户,写到缓存中的目的是以备下次查询时可以直接从缓存中获取信息,这本身是一个正常的查询过程,但是我们用redis的一个作用就是使用其缓存数据的作用,如果没有控制好其缓存设置,数据的查询可能就会出现一些问题,甚至影响系统的正常运行,现在总结redis缓存失效的三种情况及其对应的解决方法。

1、cache avalanche-缓存雪崩

缓存雪崩是指在一定时间内,缓存中大量的数据失效,导致大量的请求访问数据库,会给数据库产生很大的访问压力,导致CPU和内存过载,从而引起系统服务失败,这里有一个关键点,就是缓存中大量的数据甚至全部数据都不可用了,致使这种情况可能出现的原因有:

1)缓存服务器宕机了,甚至缓存集群都宕掉了

2)缓存服务器是好的,但是缓存中大量的数据在同一时期失效了

解决方案:

1)针对集群宕机,则需要部署高可用的redis集群服务,这是我们解决这一问题可以想到的办法,具体实现可以参考网友给出的一些方案,如https://blog.csdn.net/u014209205/article/details/82113258

2)缓存中大量的数据在同一时间失效了,这个很可能是因为在设置缓存有效时间时,将大量的数据的有效时间设置为一样导致的,比如所有数据的有效时间都设置为2分钟,如果并发量很高而且访问的数据又很多的话,可能有很多的数据的生效时间都是一样的,这样2分钟到了会有很多的数据失效,这时候大量的请求再来的时候会发现要查询的数据缓存中是不存在的, 则只能查询数据库,会在短时间内对数据库造成很大的访问压力,解决方法是可以为每个数据设置一个随机的有效时间,这样最起码不会导致大量的数据在同一时间失效

2、cache penetration-缓存穿透

缓存穿透是指反复高频查询那些根本不存在的数据(数据库中也不存在),根据查询数据的顺序,先缓存后查数据库,但是要查询的数据根本不存在,这时如果不实施相应的措施的话,会给数据库造成很大的访问压力,缓存也就失去了它存在的意义,针对这种问题,可以采用的解决方法是:

1)如果查询到的数据为空,也可以将这个空值存储到缓存中,缓存的有效时间设置的短一些

2)非法请求需要做认证拦截操作,接口层添加校验,如用户鉴权校验,id校验,id<=0的直接拦截

3)在查询redis缓存之前,使用布隆过滤器先进行查询,如果不存在则直接返回结果,详见https://zhuanlan.zhihu.com/p/348332384

3、cache breakdown-缓存击穿

缓存击穿是指,如果一个数据是一个热点数据,也就是有很多并发请求经常性地访问该数据,如果该数据在缓存中失效了,会导致大量的请求访问数据库,从而产生很大的查询压力,注意这里和雪崩还是有不同点的,那如何控制这些的热点数据以及访问这些热点数据的请求呢?可以直接想到的方案有:

1)不让热点数据失效,也就是将热点数据设置为永久有效的,热点数据的设置可参考:https://blog.csdn.net/fuqianming/article/details/99682764

2)对于访问热点数据的请求设置互斥锁,通过redis的setnx命令设置互斥锁

上面3点作为redis缓存失效问题的初探,深究起来其内容还是非常丰富的,但有时候感觉,像五柳先生之好读书而不求甚解其实有时候还是挺对的,现在的知识太多了,刚开始可以先了解一个概念,等用到的时候可以快速搜索出相关知识,再加以深度学习,这未尝不是一个学习的好办法......

初探redis缓存击穿、穿透、雪崩问题的更多相关文章

  1. Redis-缓存击穿/穿透/雪崩

    缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩,需要了解它们产生的原因以及怎么避免,尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题. 缓 ...

  2. Redis缓存击穿、缓存穿透、缓存雪崩

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 上篇文章谈到了Redis分布式锁,实际上就是为了解释为什么做缓存采用Redis而不使用map/guava.缓存 ...

  3. Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

    原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上的 TPS = 5000,QPS = 10000 左右,读写平均耗时 ...

  4. REDIS 缓存的穿透,雪崩和热点key

    穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法:①用一个bitmap和n个hash函数做布隆过滤器过滤没有在缓存的键.   ②持久层查询不到就 ...

  5. 谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应

    面试经历 在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别:我回答它俩是一样的,面试官马上抬起头用他那细长的单眼皮眼睛瞪着我说:"你 ...

  6. redis缓存击穿和缓存雪崩

    工作中经常会用到redis来做缓存,以防止后台db挂掉.但是db数据一般都在10T以上,不可能把mysql中的数据全部放入redis中,所以一般是将一些热key放入redis中. 缓存击穿 一个请求先 ...

  7. redis 缓存击穿 看一篇成高手系列3

    什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义.如果 ...

  8. Redis缓存击穿

    缓存击穿 缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞. 比如在做 ...

  9. redis击穿,穿透,雪崩,分布式锁,api(jedis,luttuce)

    击穿:(redis做缓存用,肯定发生了高并发,到达数据库查询) 设置key 的过期时间,过期后没有这个key,找不到了,就穿过了(其中一个key过期导致并发访问数据库) LRU (LRU,即:最近最少 ...

  10. redis缓存击穿问题一种思路分享

    思路每一个key都有一个附属key1,附属key1可以是key加特定前缀组成,key对应value为真正的缓存数据,附属key1对应的value不重要,可以是随便一个值,附属key1的作用主要是维护缓 ...

随机推荐

  1. java自定义的异常类

    java自定义的异常类 1.自定义异常类,需要继承 RuntimeException @Datapublic class EmployeeCheckException extends RuntimeE ...

  2. 基于ALSA库实现音频采集和播放遇到的问题

    最近基于Linux系统C语言实现音频的采集和播放,建立了两个子线程,一个通过调用snd_pcm_readi来实现采集数据,并存入FIFO中,另一个从FIFO中取数据并通过udp的sendto发送出去, ...

  3. 【性能监控】nmon和pyNmonAnalyzer的搭建和使用

    1,安装nmon 二进制安装:暂时空着,没有FQ,访问不了nmon的官网. 下载对应操作系统的文件,直接运行: 下载地址:https://pan.baidu.com/s/1gTBh10-ark5gbe ...

  4. pytorch学习笔记(9)--损失函数

    1.损失函数的作用: (1)计算实际输出和目标输出之间的差距: (2)为我们更新输出提供一定的依据(也就是反向传播) 官网链接:https://pytorch.org/docs/1.8.1/nn.ht ...

  5. ConcurrentHashMap在Java8中的变化

    增加红黑树这个存储结构 在Java8中,为什么要增加红黑树这种数据结构来进行存储,而不是全部使用链表来进行存储呢? 1.因为攻击者可以构造大量具有相同hashCode的内容,使其全部放在同一个列表中, ...

  6. 实验:STM32-ARDUINO-ESP01采用AT指令,通过MQTT连接上ONENET

    1.硬件准备 要求:STM32支持Arduino. 2.程序逻辑结构 3.主流程状态机 4.测试数据抓图 5. 关键程序代码 unsigned char g_ArrTemp[1024]; int AT ...

  7. Delphi实现Windows的气泡提示样式

    其实也不复杂,主要使用到shellAPI下的TNotifyIconData这个结构体: typedef struct _NOTIFYICONDATA { DWORD cbSize; //结构体的大小, ...

  8. 【python】绘图,颜色,线型

    颜色 最好用的:在网站上找到对应使用十六进制RGB/RGBA字符串表示颜色 可以看颜色及其对应色号名称:https://xkcd.com/color/rgb/ 参考:matplotlib指定绘图颜色的 ...

  9. go语言的特性

    一.golang语言特性 1. 垃圾回收 a.内存自动回收,再也不需要开发人员管理内存  //开发代码中不能存在无引用的变量,不然代码出错 b.开发人员专注业务实现,降低了心智负担 c.只需要new分 ...

  10. vite+vue3批量导入静态资源图片;动态绑定大量图片

    vite版本:vite3:vue版本:vue3 打包上线后发现,动态绑定的图片皆失效. 单图可用 import 导入解决,但是若有大量图片,一一导入则耗时耗力. vue2+webpack 可用 req ...