一. 概念

redis击穿或者穿透有一个前置条件:一定是高并发的情况下才会发生。

一般系统的架构设计会在ngnix或者其他微服务设计下阻拦很多的并发量,但是难免访问到redis的并发量还是很多,此时才会出现击穿问题。

击穿:redis曾经拥有,但是后来失去了,KEY的过期导致并发访问数据库

我们知道redis中的数据key是有失效时间的,或者redis本身也是有淘汰机制的,假设redis中的数据key正好失效或者LRU、LFU淘汰机制把key_value淘汰掉了,假设此时正好并发线程去访问这条数据,redis中没有,只能把大量的请求怼到数据库上,这就是redis击穿。

雪崩:击穿比较侧重某一个key失效,当大量的key同时失效,会造成大量的请求怼到数据库,
就会发生雪崩效应。
重点是大量、同时两个词
穿透:redis本就没有,请求直接全部怼到数据库上,奈何数据库也没有,
导致数据库长时间做无效的连接查询造成损耗。

所以击穿和穿透的区别就出来了:

击穿:redis中有需要的数据但是过期或者被淘汰了,导致直接全部访问数据库;

        穿透:redis中没有需要的数据,而且数据库中也没有需要的数据。

二.怎么解决击穿问题

  1. 首先redis都是单例单线程;
  2. 并发线程全部访问redis;
  3. redis中要访问的数据key失效或者数据被清除,无法获取数据;
  4. 此时通过setnx命令实现锁机制:SET KEY VALUE [EX seconds] [PX milliseconds] [NX|XX]
    1. EX 到期时间(以秒为单位)
    2. PX 到期时间(以毫秒为单位)
    3. NX 仅在键不存在时设置
    4. XX 只有在键已存在时才设置
  5. 此时的多线程分成了两部分,一个线程命令执行成功,那我们就允许他去访问数据库获取数据,另外一部分命令未执行成功,设置这部分睡眠一会儿,睡眠结束之后继续从步骤1开始执行。假设睡眠的线程执行到setnx命令,之前访问数据库的线程还未结束,也就是还没有释放锁,那么他们再次进行睡眠;
  6. 访问数据的哥们拿到数据之后,更新redis。睡眠的线程再次访问redis拿到需要的数据随即返回结果。

三.解决击穿问题过程中可能出现的问题

访问数据库的哥们中途挂了怎么办?可能出现死锁问题

通过setnx实现锁机制,若在访问数据库的过程中线程挂掉了,就会导致锁无法释放,其他睡眠的线程始终无法再次拿到锁,形成死锁;

解决方法:setnx命令可以设置锁到期时间,一旦线程挂掉,设置时间结束之后锁释放,其他睡眠的线程可以再次拿到锁访问数据库

数据库访问时间大于锁过期时间会造成数据库阻塞问题

锁的过期时间设置了,访问数据库的线程没有挂掉,但是访问数据的时间大于设置的锁过期时间,也就是锁已经过期了但是数据还未查询到,此时就会有新的线程拿到锁再次访问数据库,从而造成阻塞。

解决方法:使用多线程。再访问数据库的同时,重启一个线程去查询锁的过期与否,一旦发现锁过期,刷新锁的过期时间达到延长锁时间的效果

四、怎么解决雪崩问题

这个问题的解决得分两种情况:

1、我这个redis中的key同时失效是必须的,例如贷款利率因为政策问题,某一天的零点必须全部改变,或者优惠券在零点必须全部下架;

解决方案:

a、在业务层增加判断,当时间到达零点的时候所有的请求随机睡眠一点时间(几毫秒或者更小),这样访问redis缓存的请求时间就会变得不一样,减少同一时间大量的访问;

b、配合击穿时的解决方案,在访问redis时通过setnx实现锁机制,第一个访问数据库的线程只要把更新后的值同步到redis中,后续的请求就可以直接访问redis。

2、我这个redis中的key同时失效时点性不强。

解决方案:可以将redis中的数据key设置随机的失效时间,减少同时大量失效的情况。

五、怎么解决穿透问题

布隆过滤器

1、布隆过滤器的原理:

a、首先你的数据库中有什么数据;

b、布隆过滤器中包含固定大小的二进制向量或者位图(bitmap)和一系列映射函数

c、通过布隆算法(多个映射函数)转换成多个二进制位标记到bitmap的数组中;

d、接收请求时,要查询的数据同样转换成二进制位与bitmap中的进行对比,没有就直接返回,有就过滤掉去查询缓存,缓存查不到的话再去查询数据库;

f、由于hash冲突的原因,可能存在一种情况:要查询的数据通过hash算法得到的二进制位正好在bitmap中存在,但是数据本身在数据库中是不存在的,这是这个请求仍然会被放行,使其去访问数据库,所以布隆过滤器也是一个概率解决问题,并不能百分百解决问题,但是放行的概率小于1%

g、针对d中的情况可以配合布谷鸟过滤器使用,另外布谷鸟过滤器还存在一个del方法,支持数据的删除。

Redis—击穿、穿透、雪崩相关推荐

  1. 你需要知道的缓存击穿/穿透/雪崩

    目录 缓存击穿/穿透/雪崩 Intro 缓存击穿 缓存穿透 缓存雪崩 Reference Contact 缓存击穿/穿透/雪崩 Intro 使用缓存需要了解几个缓存问题,缓存击穿.缓存穿透以及缓存雪崩 ...

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

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

  3. redis击穿、雪崩、穿透解决方案

    Redis击穿 redis缓存击穿是指某一个非常热点的key(即在客户端搜索的比较多的关键字)突然失效了,这时从客户端发送的大量的请求在redis里找不到这个key,就会去数据里找,最终导致数据库压力 ...

  4. Redis击穿、雪崩、穿透场景描述与解决方案

    1.击穿 (1)场景描述 缓存中的某个key由于过期了,并且前端数据出现高并发(一定要有高并发)请求该key(实际上概率很低),导致瞬间都打在数据库上. (2)解决方案 使用redis的setnx(表 ...

  5. redis——缓存击穿/穿透/雪崩

    缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB). 一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力.这就叫 ...

  6. 面试常问:redis缓存击穿/穿透/雪崩

    1. 讲个故事 一个人去门店买联想电脑,线下门店没有货了,于是店员给厂家打电话问问有没有货,厂家发现也没货了,这个人就走了.过了一会另一个人也要来买联想电脑,然后店员又打电话问了一次厂家,如此反复.这 ...

  7. Redis数据读取(缓存击穿,穿透,雪崩)

    内容文件参考"付费专栏"可领取.专栏购买者提供本内容"永久答疑和远程协助"服务.一诺千金! N.1 缓存处理流程 1)前台请求,后台先从缓存中取数据,取到直接返 ...

  8. 布隆过滤器Redis缓存穿透雪崩击穿热点key

    目录 布隆过滤器 Redis 缓存 穿透 雪崩 击穿 热点KEY 布隆过滤器 布隆过滤器(判断某个key一定不存在) 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构 特点是高效地插入和查询, ...

  9. Redis缓存穿透、击穿、雪崩及主从复制

    文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...

最新文章

  1. IPSEC传输模式和隧道模式的区别
  2. Python技巧之“is”对比“==”
  3. Linux日志系统-03:logrotate主配置文件详解
  4. 洛谷——P3811 【模板】乘法逆元
  5. 【Java数据库】使用JDBC操作MySQL数据库、Batch批处理 、事务的概念
  6. Elasticsearch技术解析与实战(四)shardreplica机制
  7. javascript KeyboardEvent
  8. javascript 无法修改 数组中对象_谈谈JavaScript中对象建立(Object)
  9. 一定要多反思复盘和整理
  10. 在无参考数据集(比如LIME、MEF、DICM)上使用NIQE指标
  11. 静态库与动态库的区别和使用
  12. 2012-2013QS计算机专业世界大学排名
  13. (原创)Android 清除第三方应用的数据缓存实现(包括清除系统应用缓存)
  14. ioc performanceTest
  15. 英语复数名词的变化规则
  16. ubuntu txt文件打开乱码怎么恢复正常
  17. C++ - 整数反转
  18. 3.19字节懂车帝一面
  19. QGraphicsItem图元的简单使用(一)
  20. PrimoCache2.2.0汉化程序与2.0.0的交叉使用

热门文章

  1. javah命令详解与idea使用javah一键编译JNI的.头文件
  2. MFC+opencv实现摄像头的打开与关闭
  3. 嵌入式Linux自学笔记(二)——文件IO
  4. Android下载图片并添加图片水印
  5. 这4款神级软件 最好用的软件
  6. 大整数乘法(Karatsuba算法的字符串形式的C++实现)
  7. 2015年15+最佳的响应式HTML5网站模板
  8. INT303 Big Data 个人笔记
  9. GCT考试通过后获得证书是双证还是单证?
  10. 【C++ 】STL求全排列和组合