目录

Redis穿透

解决方法1:布隆过滤器

解决方法2:返回空对象

解决方法3:接口校验

Redis击穿

解决方案1:可以设置热点数据永远不过期

解决方案2:添加锁

Redis雪崩

解决方案1:加互斥锁

解决方案2:将key的过期时间随机化

解决方案3:使用Redis集群提高可用性

解决方案4:数据预热

补充:


因为Redis是在内存中操作的,速度很快,所以我们经常使用Redis缓存数据。但是东西总有两面性,Redis也有它的问题,就是穿透、击穿、雪崩问题,现在记录一下。

Redis穿透

定义:如果我们查询一个数据会先到缓存中查,如果没有才去数据库查。如果有人利用不存在的key一直访问就会一直到数据库中查,这样就会导致Redis缓存穿透掉直接到数据库。这样肯定是不好的。

解决方法1:布隆过滤器

将所有可能存在数据,分别通过多个哈希函数生成多个哈希值,然后将这些哈希值存到一个足够大的bitmap中,此时一个一定不存在的数据就会被这个bitmap拦截直接return,从而减少了数据库的查询压力。

解决方法2:返回空对象

当某个请求的key在redis缓存和数据库中都查不到数据时,直接将这个key对应的空数据存在redis中,这样下次这个key又过来就直接走缓存,就不会到数据库中了,这个key和空数据应该设置过期时间,防止存储过多空数据浪费内存。

redisCache.getItem(key) = null & 数据库中也查不到redisCache.setItem(key,null,2分钟,minute)

解决方法3:接口校验

在接口层,获取请求的参数进行校验,发现有不合法的key直接return掉,连查询都不给机会。

boolean isNormal = checkKey(key);
if(isNormal){return ...
}

Redis击穿

定义:某一个热点key在redis缓存中过期失效了,这时大量用户对这个热点数据进行请求,但是由于缓存中已经失效了,就会到数据库中查询,此时数据库一时处理大量的查询,又是同样的数据像在数据库上击穿了一个点。

解决方案1:可以设置热点数据永远不过期

将那些用户经常查询的数据对应的key设置永远不过期,就可以保证走缓存了。

解决方案2:添加锁

可以使用分布式锁或互斥锁。多个请求都同时查询这个热点数据,使用锁机制只让第一个请求获取锁去数据库查这个热点数据,其他线程保持阻塞,这个热点数据查询出来后写入到redis缓存中,其他请求后面从缓存中取数据即可。

Redis雪崩

定义:和击穿不同的是,击穿是某条数据过期了。雪崩是大批量数据都过期了,而这大批量数据的请求过来后,Redis缓存失效,请求直接落到数据库上,引起数据库压力过大甚至宕机。

解决方案1:加互斥锁

跟缓存击穿解决思路一致,大量请求只有第一个请求获得到锁才能查询数据库,然后将数据写入redis后释放锁,其他请求直接查缓存。

解决方案2:将key的过期时间随机化

打乱key的过期时间,避免大批量的key同时过期,这样就不会有大量请求同一时间都查询数据库。或者将经常访问的数据的key永远不过期。

解决方案3:使用Redis集群提高可用性

使用Redis主从+哨兵,主Redis失效了或者宕机了,使用哨兵将从机切换成主机,这样就算一个缓存失效了,也有另一个顶上。

解决方案4:数据预热

在正式部署之前,把可能的数据直接写入到缓存中,这样就可避免在系统上线后这些热点数据被大量请求走数据库。

补充:

redis哨兵模式:针对Redis集群,Redis提供了哨兵模式的命令,哨兵是一个独立运行的进程,原理是哨兵通过向Redis集群发送命令,通过Redis服务器返回其状态监控Redis服务器的状态,当哨兵监测到Redis主机宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他服务器,修改配置文件,让他们换主机。

以上知识点记录好,后面遇到问题一定还是需要条件去实操验证呀!

Redis的穿透、击穿、雪崩问题相关推荐

  1. Redis缓存穿透击穿雪崩

    目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 1.缓存穿透 概述: 缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询.发现也数据库 ...

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

    目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...

  3. 一文搞懂Redis缓存穿透/击穿/雪崩

    缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询.查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力 ...

  4. 二十七、Redis缓存穿透和雪崩(完)

    Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...

  5. 21_Redis_浅析Redis缓存穿透和雪崩

    为什么了解缓存穿透和雪崩:保证服务的高可用问题 Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中,最要害的问题,就是数据的一致性问题,从严格 ...

  6. Redis 缓存穿透、雪崩、缓存数据库不一致、持久化方式、分布式锁、过期策略

    1. Redis 缓存穿透 1.1 Redis 缓存穿透概念 访问了不存在的 key,缓存未命中,请求会穿透到 DB,量大时可能会对 DB 造成压力导致服务异常. 由于不恰当的业务功能实现,或者外部恶 ...

  7. 什么是redis缓存穿透, 缓存雪崩, 缓存击穿

    什么是redis? redis是一个非关系型数据库,相对于其他数据库而言,它的查询速度极快,且能承受的瞬时并发量非常的高.所以常常被用来存放网站的缓存,以减少主要数据库(如mysql)的服务器压力. ...

  8. Redis缓存穿透击穿和雪崩(八)

    1. 缓存穿透 1.1. 定义 如果用户的请求Redis缓存没有,mysql持久层也没有这个数据,于是本地查询失败.当用户请求很多(或者恶意攻击)且都是这种缓存和持久层都没有命中的情况时,大量的请求持 ...

  9. 一篇吃透Redis缓存穿透、雪崩、击穿问题

    前言:在学Redis之前我们查询数据的时候都是直接查询数据库的,但是这样会有一个潜在的问题:"如果用户量很大,所有请求都去访问数据库,那么会使数据库压力过大,导致性能下降甚至宕机" ...

  10. Redis总结以及击穿,雪崩,缓存穿透,哨兵机制解答

    Redis Redis是什么? Redis 是一个使用 C 语言开发的高速缓存数据库. Redis进行数据库切换命令 SELECT  index   数据库索引号index用数字值指定,以0作为起始索 ...

最新文章

  1. ARM Cortex Debug Port Access Port DP AP JTAG-DP SW-DP SWJ-DP JTAG-AP MEM-AP
  2. linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题
  3. 云计算灾备:灾备通识
  4. ajax 公共请求头部,ajax请求中全局增加请求头,如常见的token
  5. python alpha_如何用Python打造一个简易版的Alpha GO?
  6. mysql 开启引擎命令_MySql中启用InnoDB数据引擎的方法
  7. 计算机英语笑话,关于计算机的幽默笑话
  8. [html] 写html代码时,怎样才加速写代码的速度呢?你有什么方法?
  9. 深入理解C++中的RVO
  10. dojo调用php,dojo学习第一天 Tab选项卡 实现_dojo
  11. mac netbeans java_在macOS上不安装JDK的情况下安装Netbeans
  12. linux nfs async,Linux下NFS共享以及oracle rman挂载优化
  13. java interface泛型_JAVA的接口泛型
  14. mac上配置java jdk环境
  15. 操作系统进程调度实验
  16. 双11薇娅直播,双芯旗舰iQOO Neo5斩获天猫平台销冠
  17. svm+特征提取做分类
  18. 神码ai人工智能写作机器人_机器学习简介part1与人工智能的比较
  19. 2.5 纳什均衡的存在性
  20. 查询rssi指令_RSSI测量方法及网络设备、终端设备与流程

热门文章

  1. Html表格制作费用报销单
  2. java安全管理器SecurityManager入门
  3. iWatch 的text和label
  4. Cheat Engine 新手教程
  5. 西游记原来是这么读的
  6. python项目实例-python简单项目实例
  7. java变量重名问题
  8. 伊登工业云:云计算打通“机器换人”最关键一环
  9. 【学习资料】心田花开:小学语文常见100个多音字
  10. 中国职业教育政策解读 | 职业教育系列报告(三)