Redis-缓存击穿/穿透/雪崩
缓存击穿/穿透/雪崩
Intro
使用缓存需要了解几个缓存问题,缓存击穿、缓存穿透以及缓存雪崩,需要了解它们产生的原因以及怎么避免,尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题。
缓存击穿
一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value ,就应该去后端系统查找(比如数据库)。如果 key 对应的 value 是一定不存在的,并且对该 key 并发请求量很大,就会对后端系统就会造成很大的压力。
在高并发下,多线程同时查询同一个资源,如果缓存中没有这个资源,那么这些线程都会去后端服务或数据库查找,对数据库造成极大压力,缓存也就失去存在的意义。
缓存击穿解决方案
导致缓存击穿的问题在于高并发多线程情景下,许多请求一下子都到后端服务和数据库,导致后端服务与数据库的压力骤增。
处理这个问题,在多线程请求同一个 key 的时候,进行排队,这样第一次请求后端服务和数据库之后更新缓存的值,下一个请求从缓存中取数据的时候就会拿到缓存数据,不会再请求后端服务和数据库。
缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询,从而失去了缓存的意义而且相比直接查询数据库还增加了每次都去查缓存。
缓存穿透解决方案
导致问题出现的原因在于请求一个不存在的数据从而使得缓存始终不存在进而导致后端系统(主要是数据库)要承受很大的压力,所以想要解决这个问题,就势必就在缓存这里拦截住大量的请求,使得最终走到后端系统,查询数据库的请求尽可能的少。
一般处理这个问题,缓存不存在的时候会在缓存中设置一个时间较短的内容为空的缓存,从而减少实际请求到后端和进行数据库查询的次数。
复杂一些的解决方案有 布隆过滤器,基本原理是设置一个 list,查询缓存的时候从 list 里进行判断,这里不做多介绍。
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。
缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间失效,这样在失效的时候,也会给后端系统和数据库带来很大压力.
缓存雪崩解决方案
导致出现缓存雪崩的根本原因在于缓存大量失效,从而导致大量请求没有命中缓存,大量请求走到后端服务和数据库,造成压力。
如果系统启动就依赖很多缓存,那可以通过其它服务进行缓存预热,提前把需要的数据放到缓存中,避免系统启动大量请求直接请求到后端服务和数据库。
既然是由于同一时间缓存大量失效,我们也可以着手从缓存的失效时间上,做一些优化,让缓存不要在同一时间点失效。具体的实施办法,你可以在设置失效时间的时候随机加几秒过期时间,避免同一时间点缓存大量失效。
Redis-缓存击穿/穿透/雪崩的更多相关文章
- Redis缓存击穿、缓存穿透、缓存雪崩
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 上篇文章谈到了Redis分布式锁,实际上就是为了解释为什么做缓存采用Redis而不使用map/guava.缓存 ...
- Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
原始数据存储在 DB 中(如 MySQL.Hbase 等),但 DB 的读写性能低.延迟高. 比如 MySQL 在 4 核 8G 上的 TPS = 5000,QPS = 10000 左右,读写平均耗时 ...
- REDIS 缓存的穿透,雪崩和热点key
穿透 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 解决办法:①用一个bitmap和n个hash函数做布隆过滤器过滤没有在缓存的键. ②持久层查询不到就 ...
- 谈谈redis缓存击穿透和缓存击穿的区别,雪崩效应
面试经历 在很长的一段时间里,我以为缓存击穿和缓存穿透是一个东西,直到最近去腾讯面试,面试官问我缓存击穿和穿透的区别:我回答它俩是一样的,面试官马上抬起头用他那细长的单眼皮眼睛瞪着我说:"你 ...
- redis缓存击穿和缓存雪崩
工作中经常会用到redis来做缓存,以防止后台db挂掉.但是db数据一般都在10T以上,不可能把mysql中的数据全部放入redis中,所以一般是将一些热key放入redis中. 缓存击穿 一个请求先 ...
- redis 缓存击穿 看一篇成高手系列3
什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询,这样缓存就失去了意义.如果 ...
- Redis缓存击穿
缓存击穿 缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞. 比如在做 ...
- redis击穿,穿透,雪崩,分布式锁,api(jedis,luttuce)
击穿:(redis做缓存用,肯定发生了高并发,到达数据库查询) 设置key 的过期时间,过期后没有这个key,找不到了,就穿过了(其中一个key过期导致并发访问数据库) LRU (LRU,即:最近最少 ...
- redis缓存击穿问题一种思路分享
思路每一个key都有一个附属key1,附属key1可以是key加特定前缀组成,key对应value为真正的缓存数据,附属key1对应的value不重要,可以是随便一个值,附属key1的作用主要是维护缓 ...
随机推荐
- SDK使用NinePatch(.9)资源
.9资源是啥? .9图是一种可以拉伸的图片格式,当你把它用作背景图时,android系统会根据实际情况来拉伸图片资源.比如按钮的背景必须根据上面显示文字的长短作拉伸.NinePatch就是额外包含了一 ...
- Gym 100942A Three seamarks
题目链接: http://codeforces.com/problemset/gymProblem/100942/A ----------------------------------------- ...
- VMware 虚拟化编程(13) — VMware 虚拟机的备份方案设计
目录 目录 前文列表 备份思路 备份算法 备份细节 连接到 vCenter 还是 ESXi 如何选择快照类型 是否开启 CBT 如何获取备份数据 如何提高备份数据的传输率 备份厚置备磁盘和精简置备磁盘 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_5_数据结构_红黑树
生活中的树和计算机中的树.计算机的树是倒着的
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_4_Map集合遍历键找值方式
键找值的方式 增强for 增强for的简化方式
- string与wstring的互相转换接口(Windows版本)
string与wstring的互相转换接口(Windows版本) std::wstring stringToWstring( const std::string & str ) { LPCST ...
- beego 注解路由无效问题分析
问题描述:学习 beego 框架发现注解路由无效,除了不能找到路由外,未见任何异常. 问题解决:将配置文件中的 runmode 更改为 dev 模式. 问题分析: 如果没有设置过 runmode 不会 ...
- fiddler之简单的接口性能测试
在针对某一个/某一些接口,发送相同的请求,不考虑参数的变化时,可以使用fiddler进行简单的性能测试.(使用功能为:replay) 一.replay功能调用 (1.Reissue Requests: ...
- 绕过安全狗Apache4.0版本
参数拦截:script.空格and空格.空格or空格.union select.user() 绕过: and.order by绕过: 内联注释 union select绕过: union%23%0a ...
- 应用安全-Web安全-CSRF攻防整理
原理 - 登录受信任网站A,并在本地生成Cookie.在不登出A的情况下,访问危险网站B. #csrfdemo.php <?php $data = json_decode(file_get_co ...