【BigHereo 53】---Redis遇到的问题---雪崩,击穿,穿透
2017-12-23 21:59
411 查看
Redis遇到的问题---雪崩,击穿,穿透
(1)雪崩(多个key被高并发)
(2)击穿(单个key被高并发)
(3)穿透(DB和redis都没有找到而出现穿透)
这样的场景一般都比较的纠结, 作为技术部, 我们怎么应对这样场景,做到防患于未然呢?
概念:高并发原因导致的: 设置了相同的过期时间,导致缓存在同一时刻失效,请求都到DB,瞬间压力过重发生雪崩.
(1) Redis本身因为高并发,崩了.
(2)redis失效了.
1.2,雪崩情况怎么解决?
(1)加锁或用队列:让它们去进行资源竞选, 选出相应的redis再去mysql中进行动态的操作.
(2)将缓存失效时间分散开:例如在失效时间基础上增加一个随机值,避免引发集体失效事情.
2.1,什么是击穿?
解答: 某时间段中某个key被高并发访问,导致缓存在同一时刻失效,请求都到DB,瞬间压力过重发生雪崩
注意:雪崩是对很多个key的高并发.
2.2,击穿怎么解决或避免呢?
解答:
1,使用互斥锁(mutex key):
缓存失效(值为空),不马上去操作DB,先用工具(eg:redis的setNX或Memcace的ADD)set一个mutexkey,如果有返回值在load db.
2.提前期使用 互斥锁:
value内设一个timeout1,比实际timeout2小,如发现1已过期,马上延长2设置到cache 中.
3,永不过期:
设置没有"物理"过期时间,保证了不会出现击穿情况.这方法对性能非常的好,缺点是其余线程可能访问的是老数据.
3.1,什么是缓存穿透?
概念:有请求来, 在mysql数据库中没有找到, 在redis中也没有找到,返回web层就会出现穿透
3.2,穿透怎么解决?
方案一: 程序中添加判断, 进行拦截: 现在程序中进行一个拦截.如果没有就返回,有东西再去数据库中查询.
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitMap中,一个一定不存在的数据会被这个bitMap拦截掉,从而避免底层存储系统的查询压力.
方案二:将过期时间设短一些: 如果一个查询返回数据为空(不管是数据不存在还是系统故障), 我们仍然把这结构进行缓存,但是设置过期缓存时间很短,最长不要超过5mins.
高并发中,常常会出现雪崩,击穿或穿透的现象,这就提醒我们必须做好防患于未然的措施,比如用队列,将缓存失效时间分散,或用程序添加拦截等等进行保护.
一,【前言】
Redis常常会遇到的三个问题:(1)雪崩(多个key被高并发)
(2)击穿(单个key被高并发)
(3)穿透(DB和redis都没有找到而出现穿透)
这样的场景一般都比较的纠结, 作为技术部, 我们怎么应对这样场景,做到防患于未然呢?
二,【详情】
1.1,什么是雪崩?概念:高并发原因导致的: 设置了相同的过期时间,导致缓存在同一时刻失效,请求都到DB,瞬间压力过重发生雪崩.
(1) Redis本身因为高并发,崩了.
(2)redis失效了.
1.2,雪崩情况怎么解决?
(1)加锁或用队列:让它们去进行资源竞选, 选出相应的redis再去mysql中进行动态的操作.
(2)将缓存失效时间分散开:例如在失效时间基础上增加一个随机值,避免引发集体失效事情.
2.1,什么是击穿?
解答: 某时间段中某个key被高并发访问,导致缓存在同一时刻失效,请求都到DB,瞬间压力过重发生雪崩
注意:雪崩是对很多个key的高并发.
2.2,击穿怎么解决或避免呢?
解答:
1,使用互斥锁(mutex key):
缓存失效(值为空),不马上去操作DB,先用工具(eg:redis的setNX或Memcace的ADD)set一个mutexkey,如果有返回值在load db.
2.提前期使用 互斥锁:
value内设一个timeout1,比实际timeout2小,如发现1已过期,马上延长2设置到cache 中.
3,永不过期:
设置没有"物理"过期时间,保证了不会出现击穿情况.这方法对性能非常的好,缺点是其余线程可能访问的是老数据.
3.1,什么是缓存穿透?
概念:有请求来, 在mysql数据库中没有找到, 在redis中也没有找到,返回web层就会出现穿透
3.2,穿透怎么解决?
方案一: 程序中添加判断, 进行拦截: 现在程序中进行一个拦截.如果没有就返回,有东西再去数据库中查询.
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitMap中,一个一定不存在的数据会被这个bitMap拦截掉,从而避免底层存储系统的查询压力.
方案二:将过期时间设短一些: 如果一个查询返回数据为空(不管是数据不存在还是系统故障), 我们仍然把这结构进行缓存,但是设置过期缓存时间很短,最长不要超过5mins.
三,【小结】
高并发中,常常会出现雪崩,击穿或穿透的现象,这就提醒我们必须做好防患于未然的措施,比如用队列,将缓存失效时间分散,或用程序添加拦截等等进行保护.
相关文章推荐
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- Redis总结(五)缓存雪崩和缓存穿透等问题
- Redis缓存穿透、缓存雪崩、redis并发问题分析
- Redis关于缓存雪崩和缓存穿透等问题
- 2015年工作中遇到的问题:71-80,Tomcat-Redis-浮点数-HTTPS
- 第一次见到redis遇到的问题
- centos7 安装redis及遇到的问题
- Ubuntu 14.04 Redis4.02 集群部署并记录遇到的问题以及对应解决方案
- redis ssm遇到的小问题2
- 安装composer遇到的问题及redis扩展的安装
- spring同时集成redis和mongodb时遇到多个资源文件加载的问题
- Redis介绍——Linux环境Redis安装全过程和遇到的问题及解决方案
- nginx+tomcat+redis 遇到的恶心问题
- 【转载】缓存穿透,缓存击穿,缓存雪崩解决方案分析
- 记一次Redis设置主从复制时遇到的问题
- 在redis使用过程遇到的一些问题的总结
- 使用Redis客户端hiredis遇到的一些问题
- 使用redis中遇到的问题记录
- 使用Spring Data Redis时,遇到的几个问题
- redis 安装及安装遇到的问题解决