

缓存击穿/穿透/雪崩
source link: http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA%3D%3D&%3Bmid=2654077002&%3Bidx=3&%3Bsn=6874166f98e8fa282579eeef43ea8fb8
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

缓存击穿/穿透/雪崩
Intro
使用缓存需要了解几个缓存问题,缓存击穿、缓存穿透以及缓存雪崩,需要了解它们产生的原因以及怎么避免,尤其是当你打算设计自己的缓存框架的时候需要考虑如何处理这些问题。
缓存击穿
一般的缓存系统,都是按照 key 去缓存查询,如果不存在对应的 value ,就应该去后端系统查找(比如数据库)。如果 key 对应的 value 是一定不存在的,并且对该 key 并发请求量很大,就会对后端系统就会造成很大的压力。
在高并发下,多线程同时查询同一个资源,如果缓存中没有这个资源,那么这些线程都会去后端服务或数据库查找,对数据库造成极大压力,缓存也就失去存在的意义。
缓存击穿解决方案
导致缓存击穿的问题在于高并发多线程情景下,许多请求一下子都到后端服务和数据库,导致后端服务与数据库的压力骤增。
处理这个问题,在多线程请求同一个 key 的时候,进行排队,这样第一次请求后端服务和数据库之后更新缓存的值,下一个请求从缓存中取数据的时候就会拿到缓存数据,不会再请求后端服务和数据库。
缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询,从而失去了缓存的意义而且相比直接查询数据库还增加了每次都去查缓存。
缓存穿透解决方案
导致问题出现的原因在于请求一个不存在的数据从而使得缓存始终不存在进而导致后端系统(主要是数据库)要承受很大的压力,所以想要解决这个问题,就势必就在缓存这里拦截住大量的请求,使得最终走到后端系统,查询数据库的请求尽可能的少。
一般处理这个问题,缓存不存在的时候会在缓存中设置一个时间较短的内容为空的缓存,从而减少实际请求到后端和进行数据库查询的次数。
复杂一些的解决方案有 布隆过滤器,基本原理是设置一个 list,查询缓存的时候从 list 里进行判断,这里不做多介绍。
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难 如果想要判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢(O(n),O(logn))。不过世界上还有一种叫作散列表(又叫哈希表,Hash table)的数据结构。它可以通过一个Hash函数将一个元素映射成一个位阵列(Bit array)中的一个点。这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。
缓存雪崩
当缓存服务器重启或者大量缓存集中在某一个时间失效,这样在失效的时候,也会给后端系统和数据库带来很大压力.
缓存雪崩解决方案
导致出现缓存雪崩的根本原因在于缓存大量失效,从而导致大量请求没有命中缓存,大量请求走到后端服务和数据库,造成压力。
如果系统启动就依赖很多缓存,那可以通过其它服务进行缓存预热,提前把需要的数据放到缓存中,避免系统启动大量请求直接请求到后端服务和数据库。
既然是由于同一时间缓存大量失效,我们也可以着手从缓存的失效时间上,做一些优化,让缓存不要在同一时间点失效。具体的实施办法,你可以在设置失效时间的时候随机加几秒过期时间,避免同一时间点缓存大量失效。
Reference
-
https://github.com/WeihanLi/WeihanLi.Redis/issues/2
-
https://www.cnblogs.com/jinjiangongzuoshi/archive/2016/03/03/5240280.html
-
https://blog.csdn.net/zeb_perfect/article/details/54135506
-
https://blog.csdn.net/bushanyantanzhe/article/details/79459095
-
https://baike.baidu.com/item/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8/5384697?fr=aladdin
Contact
Contact me: [email protected]
Recommend
-
19
1.前言 当我们设计一个Redis缓存服务时,缓存穿透、缓存击穿、缓存雪崩这三大问题我们不得不考虑。同时参见面试时面试官也会常问这三大问题。本章我们来分析一下这三大问题。 2.缓存穿透 2.1什么叫缓存穿...
-
20
点击上方 “ 匠心零度 ” ,选择“
-
7
击穿 大家都知道,计算机的瓶颈之一就是IO,为了解决内存与磁盘速度不匹配的问题,产生了缓存,将一些热点数据放在内存中,随用随取,降低连接到数据库的请求链接,避免数据库挂掉。需要注意的是, 无论是击穿还是后面谈到的穿透与雪崩,...
-
8
缓存穿透,击穿,雪崩以及解决方案,干货满满发布于 5 月 14 日缓存的设计包含很多技巧,设计不当将会导致严重的后果。redis作为一种非关系型数据库,也总是免不了...
-
9
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?原始数据存储在 DB 中(如 MySQL、Hbase 等),但 DB 的读写性能低、延迟高。比如 MySQL 在 4 核 8G 上的 TPS = 5000,QPS =...
-
5
大家好,我是七淅(xī)。 作为后端开发,我想缓存是大家再熟悉不过的东西了。 本文会介绍出现缓存雪崩、穿透和击穿的业务背景、解决方案和对业务可靠性处理。事先说明,最佳解决方案一定需要结合实际业务调整,不同业务的处理...
-
4
缓存击穿、穿透、雪崩专项测试 作者:京东科技刘须华 2022-11-18 14:34:28 R2M缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种...
-
6
【专项测试系列】-缓存击穿、穿透、雪崩专项测试 推荐 原创 京东云官方 2022-11-1...
-
10
缓存击穿、穿透、雪崩及解决方案 Redis是一种高性能的键值型数据库,它可以用来实现缓存功能,提高应用的响应速度和承载能力。但是,使用Redis缓存也会遇到一些常见的问题,比如缓存击穿、缓存穿透、缓存雪崩。这些问题都...
-
9
1. 什么是缓存雪崩 当我们提到缓存系统中的问题,缓存雪崩是一个经常被讨论的话题。缓存雪崩是指在某一时刻发生大量的缓存失效,导致瞬间大量的请求直接打到了数据库,可能会导致数据库瞬间压力过大甚至宕机。尤其在高并发的系统中,...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK