首页 > 数据库 >【通俗易懂】一篇文章带你了解Redis缓存击穿、缓存穿透、缓存雪崩

【通俗易懂】一篇文章带你了解Redis缓存击穿、缓存穿透、缓存雪崩

时间:2024-08-24 20:24:05浏览次数:14  
标签:缓存 过期 击穿 数据库 Redis 通俗易懂 穿透 key

目录

一、什么是缓存击穿、缓存穿透、缓存雪崩?

二、解决方法

2.1 缓存击穿

异步定时更新

互斥锁

2.2 缓存穿透

缓存空值

布隆过滤器 BloomFilter

2.3 缓存雪崩

设置不同的过期时间

集群

热点数据永不过期


一、什么是缓存击穿、缓存穿透、缓存雪崩?

缓存击穿:是指当某一个key的缓存过期时,大并发量的请求同时访问此key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。

缓存穿透:缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

缓存雪崩:是当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。

在记忆这几个概念的时候,不要死记硬背,你可以尝试这样记忆:

首先,雪崩的概念比较容易记,就是很多个Key同时过期才会雪崩,“缓存雪崩的时候没有一个Key是无辜的”。至于穿透和击穿,区别在于穿透是“透”,什么叫透呢,那就是不仅缓存被击穿了,数据库也被击穿了,这种才叫透。所以,这种缓存和数据库中都没有的情况叫做“缓存穿透”。

二、解决方法

2.1 缓存击穿

异步定时更新

比如某一个热点数据的过期时间是1小时,那么每59分钟,通过定时任务去更新这个热点key,并重新设置其过期时间。

互斥锁

在缓存处理上,通常使用一个互斥锁来解决缓存击穿的问题。简单来说就是当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。若其他线程也在请求该key时,发现获取锁失败,则先阻塞。

2.2 缓存穿透

缓存空值

在缓存中,之所以会发生穿透,就是因为缓存没有对那些不存在的值得Key缓存下来,从而导致每次查询都要请求到数据库。

那么我们就可以为这些key对应的值设置为null并放到缓存中,这样再出现查询这个key 的请求的时候,直接返回 null即可

但是还需要注意的就是需要有一个失效时间,因为如果不设置失效的话,如果哪天总部有货了,门店还是当做没货的话,就会影響销量了。

布隆过滤器 BloomFilter

很多时候,缓存穿透是因为有很多恶意流量的请求,这些请求可能随机生成很多Key来请求查询,这些肯定在缓存和数据库中都没有,那就很容易导致缓存穿透。

针对类似的情况,可以使用一个过滤器。

在缓存穿透防治上常用的技术是布隆过滤器(Bloom Filter)。

布隆过滤器是一种比较巧妙的概率性数据结构,它可以告诉你数据一定不存在或可能存在,相比Map、Set、List等传统数据结构它占用内存少、结构更高效。

对于缓存穿透,我们可以将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力

2.3 缓存雪崩

设置不同的过期时间

为了避免大量的缓存在同一时间过期,可以把不同的key过期时间设置成不同的,并且通过定时刷新的方式更新过期时间。

把每个Key的失效时间都加个随机值就好了。

setRedis(Key,value,time + Math.random() * 10000);

集群

如果Redis是集群部署,将热点数据均匀分布在不同的Redis库中也能避免全部失效的问题。

热点数据永不过期

设置热点数据永远不过期,有更新操作就更新缓存就好了(比如运维更新了首页商品,那你刷下缓存就完事了,不要设置过期时间)。

标签:缓存,过期,击穿,数据库,Redis,通俗易懂,穿透,key
From: https://blog.csdn.net/qq_38196449/article/details/141421370

相关文章

  • Nginx缓存服务
    Nginx缓存服务7.1缓存配置语法proxy_cache配置语法Syntax:proxy_cachezone|off;Default:proxy_cacheoff;Context:http,server,location//缓存路径Syntax:proxy_cache_pathpath[levels=levels][use_temp_path=on|off]keys_zone=name:size[inactive=time]......
  • 利用 Redis Sorted Set 实现高性能排行榜
    文章目录背景使用MySQL实现排行榜实现思路优点弊端复现1)建表2)使用navicat生成500w数据3)直接使用`orderby`查询4)优化:对score添加索引Redis的SortedSet什么是SortedSetSortedSet常用命令使用示例1)添加数据2)查看前五名3)查看具体分数4)查看具体排名5)对排名......
  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • 微信小程序根据本地缓存图片路径,生成缩略图的方法
    公共方法js文件/***生成缩略图*@paramcanvasIdcanvas容器的id*@paramfileUrl缓存在本地图片的路径*@paramthumbnailRange期待生成的缩略图尺寸范围,默认150,即宽或高不会超过150px*/functiongenerateThumbnail(canvasId,fileUrl,thumbnailRange=150){......
  • awk打印除某数据项/某列数/某些列数之外其它列数据的实现以及Twemproxy(redis集群方案
    一、awk打印除某数据项/某列数/某些列数之外其它列数据的实现        偶尔碰到一个需求,我需要使用awk打印数据,但是只需要打印某列之后的其它列,比如我只要第2列及之后的所有数据,如何实现呢?实际很简单:#将$1置成空,然后打印即可awk'{$1="";print}'filepathawk'{$1......
  • 缓存出海方案
    优质博文:IT-BLOG-CN一、挑战/注意事项【1】框架组不允许在不同地区部署的独立Redis实例拥有相同的名称,因此不同地区需要使用不用的Redis集群名称。【2】分布式锁问题:该场景需要保证key与UCS灰度策略是可以同步的,即同一个key不会被路由到多个机房。【目前缓存不同步数据......
  • Spring系列之Spring Cache缓存注解的使用
    目录一、概述二、缓存注解1、@Cacheable缓存结果2、@CachePut更新缓存3、@CacheEvict 清除缓存4、@Caching组合缓存(不常用)5、@CacheConfig类级别缓存配置(不常用)6、@CacheResult设置缓存超时(不常用)三、使用方式1、@EnableCaching开启缓存2、在方法上添加注解@C......
  • ZNS SSD是不是持久缓存的理想选择?
    随着数据量的增加和技术的进步,对于高效、可靠的存储解决方案的需求日益增长。传统的基于块的SSD虽然具有成本效益和持久性的优点,但在处理写密集型和更新密集型工作负载时存在局限性。NAND闪存的特点是数据只能按页(例如4KiB)写入,不支持原地更新,必须以块为单位进行擦除。然而,块接......
  • [Redis]消息队列
    Redis如何实现消息队列1、使用ListList最为简单和直接,主要通过lpush、rpop存储和读取消息队列的(先进先出)ruby代码解读复制代码127.0.0.1:6379>lpushmq"firstMsg"#推送消息firstMsg(integer)1127.0.0.1:6379>lpushmq"secondMsg"#推送消息secondMsg(integer)212......
  • Linux下Redis的安装和部署(哨兵模式)
    1.哨兵模式配置文件redis服务 redis端口 哨兵端口 主从redis-1 7001 27001 主节点redis-2 7002 27002 从节点redis-3 7003 27003 从节点下载Rediscurl-Ohttp://download.redis.io/releases/redis-6.0.6.tar.gz解压Redistarxzvfredis-6.0.6.tar.gz进入redis-6.0.6目......