用了强大的 Redis,我们的项目是不是不再惧怕高并发查询了?缓存穿透和缓存雪崩了解一下。

中国30米分辨率城市建成区数据集 (1972-2023年) 全国城市建成区空间分布数据(1972-2023年),利用Google Earth Engine平台,基于Landsat系列遥感影像提取了1972–2023年城市不透水面,后经过不透水面聚集密度计算方法计算了不透水面聚集密度,通过阈值划分提取了城市建成区,并设置了建成区面积阈值,去除了噪点,获取了全国城市建成区空间分布数据集。该提取能准确刻画城市形态,提取精度高,保持了建成区的完整性。数据集包括41期数据,1972年,1978年,1985-2023年逐年,分辨率为30米,有栅格和矢量两种格式。 阅读详情

关于 Redis 的使用,大家应该已经不陌生了,我也介绍过 Redis 的使用、数据结构、使用场景分析,既然 Redis 这个强大,那么架构中引入了 Redis 之后,是不是就“无敌”了呢?

其实所有的架构、框架、组件,在解决一部分问题的同时,同样也会带来新的问题,让我们看看使用 Redis 可能会遇到什么样的问题。

缓存穿透

Redis 大部分的使用场景,都是根据 key ,先在 Redis 中查询,如果查询不到的话,再查询数据库。

当有大量的请求,key 值根本不在 Redis 中,那么查询就会落到数据库上,这些请求就仿佛“穿透”过了 Redis 落在了数据库上,最后会导致数据库不堪重负直至崩溃。

缓存穿透

让我们看看缓存穿透的应对策略:

1. 将无效 key 保存到 Redis 中

如果 Redis 中查询不到,并且查询数据库也没有结果,那么就将这个 key 写入到 Redis 中,设置 value = 空,这样如果这个 key 值被重复访问,也不会查询数据库。

将无效 key 保存到 Redis 中

但是如果数据库几分钟后,存入了一条真实的数据,那么就会发生数据库和缓存数据不一致的情况;

这种情况,要么主动更新 Redis 中这条 key-空 的数据,要么在设置缓存的时候,同时设置缓存的额过期时间,这样当时间一过,缓存数据就可以刷入到 Redis 中了。

如果每次查询的 key 值都不相同,比如收到恶意攻击,每次访问都是无效且不相同的 key 值,那么这个办法就会失效。

2. 布隆过滤器

布隆过滤器(Bloom Filter)的原理解释起来很复杂,用白话概括一下它的特点:它说某个 key 不存在,那么就一定不存在,它说某个 key 存在,那么很大可能是存在(存在一定的误判率)。

使用布隆过滤器,挡回无效请求,流程大概是这样的:

布隆过滤器

对布隆过滤器感兴趣的同学,可以试一试 Google 出品的 Guava 工具库,其中就有开箱即用的布隆过滤器:BloomFilter;

public class BloomFilterTest {
	public static void main(String[] args){
		int size = 1000000;
		//布隆过滤器
		BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, 0.001);
		
		for (int i = 0; i < size; i++) {
            bloomFilter.put(i);
        }
		
	List<Integer> list = new ArrayList<Integer>(1000);
        for (int i = size + 1; i < size + 10000; i++) {
            if (bloomFilter.mightContain(i)) {
                list.add(i);
            }
        }
        System.out.println("误判数量:" + list.size());
	}
}

另外,Redis 在 4.0 之后有了插件功能(Module),可以使用外部的扩展功能,可以使用 RedisBloom 作为 Redis 布隆过滤器插件。

缓存雪崩

通常我们在使用 Redis 的时候,都会为缓存设置过期时间,但是如果在某个时间点,有大量缓存失效,那么下一个时间点就会有大量请求访问到数据库,这种情况下,数据库可能因为访问量多大导致“崩溃”,这就是缓存雪崩。

让我们看看缓存雪崩的解决方案:

1. 不设置缓存过期时间

最暴力的解决办法,缓存不设置自动过期时间,只要缓存不崩,数据库就不会崩。

2. 设置随机过期时间

另外一个办法,就是让缓存过期时间不那么一致,比如一批缓存数据24小时后过期,那么就在这个基础上,让每条缓存的过期时间前后随机 1-6000 秒(1-10分钟)。

3. 使用互斥锁

在缓存失效后,通过互斥锁或者队列,控制读数据库和写缓存的线程数量;不过这样会导致系统的吞吐量下降。

4. 双缓存

设置一级缓存和二级缓存,一级缓存过期时间短,二级缓存过期时间长或者不过期,一级缓存失效后访问二级缓存,同时刷新一级缓存。

最后在强调一遍,任何架构、组件、框架的引入,都会带来新的问题,我们在使用的时候一定要有相应的评估和解决方案。

会点代码的大叔 | 文【原创】


敬请关注会点代码的大叔
​

科研项目数据抓取:Python爬虫实现与分析 本文详细介绍了如何使用Python爬虫抓取科研项目的数据,涵盖了从目标数据源选择到数据存储与分析的整个过程。通过使用。 阅读详情

相关推荐

R语言:基于Spatstat包的单变量和双变量平面Ripley‘s K函数分析

因为网上查找得到的R语言K函数分析的资料很少,Spatstat包的介绍也很少,所以抛砖引玉。本文简单介绍了使用R语言spatstat包的Kest,Kcross(Lcross)和Kinhom方法进行了单变量和双变量平面Ripley's K函数分析的方法及代码,希望有所帮助。

hsdcmax的博客 1万+

Redis 单机、主从、集群部署

Redis 单机、主从、集群部署

m0_37559973的博客 560

HP iLO4报错自救指南:Embedded Flash/SD-CARD故障的3种修复方案(附详细截图)

本文详细解析了HP iLO4出现'Embedded Flash/SD-CARD'故障时的3种修复方案,包括快速恢复、固件级修复和硬件级解决方案。通过Diagnostics诊断和Self-Test报告,帮助运维人员高效解决问题,并提供预防性维护建议,确保服务器远程管理功能的稳定性。

weixin_42522953的博客 512

redis思路

1

weixin_43775723的博客 412

深入解析经典蓝牙连接:从HCI命令到LMP协议的完整流程

本文深入解析经典蓝牙连接的完整流程,从设备发现、寻呼建立物理链路,到安全配对与加密的每一步。通过对照HCI LOG与AIR LOG,详细拆解了HCI命令与LMP协议报文的对应关系,帮助开发者精准定位连接问题,掌握蓝牙调试的核心方法。

weixin_29260291的博客 455

使用OpenCV进行3D重建:详细指南

3D重建是计算机视觉领域的一项关键技术,它能够从二维图像中恢复出场景的三维结构。这项技术在机器人视觉、增强现实和3D建模等多个领域都有广泛的应用。在本篇技术博客中,我们将详细介绍如何使用OpenCV这一流行的计算机视觉库来实现3D重建。我们将逐步探讨整个过程,包括相机标定、特征点提取与匹配、立体校正、深度图计算以及最终的三维重建。3D重建是一个复杂的过程,涉及多个步骤和多种算法。OpenCV提供了强大的工具来支持这一过程,从相机标定到特征点提取与匹配,再到立体校正和深度图计算,最后实现三维重建。

weixin_41544125的博客 1317

Redis高级篇 |单体Redis存在的问题及解决

集群下解决单体Redis存在的问题

weixin_54232686的博客 873

解决mmdet3d安装中因PyTorch高版本引发的THC.h缺失问题

本文详细分析了在安装mmdet3d时,因PyTorch版本过高导致THC.h头文件缺失的常见报错问题。文章指出该错误的本质是PyTorch 1.7+版本废弃了旧API,与老版本C++扩展代码不兼容。提供了两种核心解决方案:一是降级PyTorch至1.6及以下版本;二是修改源码,将THC.h引用替换为ATen/cuda等新头文件,并给出了具体的代码修改示例和排查技巧。

weixin_29085151的博客 380

叮当外卖单体项目SpringBoot+Mybatis-Plus+Redis(附源码)

这是一篇SpringBoot+Mybatis-Plus的单体项目,并且还带有Spring+Mybatis的单体项目,通过本项目可以让你快速掌握简单的CRUD操作和Redis数据缓存操作,定时组件的使用,图片的上传与下载,在Linux下部署项目。

孤夜的博客 4035

关于Nuttx操作系统

NuttX是一个成熟的实时操作系统

qq_28576837的博客 4092

面向可扩展的 ABAP CDS:EXTEND VIEW 全面实战与工程化指引

摘要: 本文深入讲解ABAP CDS的EXTEND VIEW功能,帮助开发者在标准或自建模型上安全扩展字段与关联。核心内容包括: 作用:避免直接修改标准CDS,通过轻量扩展添加业务字段和关联,降低维护风险。 语法要点:需定义CDS扩展实体名和Dictionary Append View名,支持添加普通字段、关联,但不允许聚合或修改原有结构。 限制:不能扩展含聚合、UNION的视图,且扩展字段需避免命名冲突。 工程实践:建议使用客户命名空间,区分结构扩展与元数据扩展,并注意功能性变更需通过其他方式实现。 示例

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 394

Linux上安装Redis教程

Linux上安装Redis教程 本篇文章是基于CentOS7,安装Redis版本为redis-6.2.6。 一、下载并解压Redis 1、执行下面的命令下载redis: wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis: tar xzf redis-6.2.6.tar.gz 3、移动redis目录,一般都会将redis目录放置到 /usr/local/redis目录: mv redis-6.2.6 /usr/local/

xby18772963985的博客 637

一文看懂 SAP Integration Suite:从架构治理、接口编排到事件驱动的集成全景

SAP Integration Suite是企业数字化转型中的关键集成平台,通过统一的方法论和工具链解决系统互联、数据对齐和流程协同等复杂问题。其核心能力包括:1)集成评估(Integration Assessment)提供战略规划框架;2)迁移评估(Migration Assessment)支持从传统平台向云的平滑过渡;3)云集成(Cloud Integration)实现日常业务流程编排;4)集成顾问(Integration Advisor)简化B2B标准映射;5)贸易伙伴管理(TPM)优化外部协作流程;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 503

用了强大的 Redis,我们的项目是不是不再惧怕高并发查询了?缓存穿透和缓存雪崩了解一下。...

关于 Redis 的使用,大家应该已经不陌生了,我也介绍过 Redis 的使用、数据结构、使用场景分析,既然 Redis 这个强大,那么架构中引入了 Redis 之后,是不是就“无敌”了...

weixin_43167418的博客 222

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java redis设置过期时间_用了强大的 Redis,我们的项目是不是不再惧怕高并发查询了?缓存穿透和缓存雪崩了解一下。...

关于 Redis 的使用,大家应该已经不陌生了,我也介绍过 Redis 的使用、数据结构、使用场景分析,既然 Redis 这个强大,那么架构中引入了 Redis 之后,是不是就“无敌”了呢?其实所有的架构、框架、组件,在解决一部分问题的同时,同样也会带来新的问题,让我们看看使用 Redis 可能会遇到什么样的问题。01缓存穿透Redis 大部分的使用场景,都是根据 key ,先在 Red...

weixin_39950764的博客 306

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Redis 缓存穿透、缓存击穿和缓存雪崩

缓存穿透、缓存击穿和缓存雪崩这三个概念和知识点我们一定要掌握,而且我们也必须掌握其解决方案,因为我们工作中经常会遇到缓存穿透和缓存雪崩的情况。

BlueProtocolBlog 1340

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Redis100篇 - Redis最常用场景:缓存怎么用 缓存穿透/击穿/雪崩解决方案

Redis缓存穿透问题及解决方案 摘要:Redis作为高性能内存数据库,广泛应用于缓存场景以提升系统性能。本文重点分析了Redis缓存使用中的关键问题——缓存穿透,即频繁查询不存在的数据导致数据库压力剧增。当请求无法在缓存命中时,会直接访问数据库,若数据不存在则无法缓存,形成恶性循环。解决方案包括:1)缓存空值策略,即使查询结果为null也将其缓存并设置较短过期时间,避免重复穿透;2)通过Java代码示例展示了在Spring Boot项目中如何实现这一防护机制。该方案能有效拦截恶意请求,保护数据库资源,确保

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Redis存储⑭Redis的应用_缓存_预热/穿透/雪崩/击穿

Redis存储⑭Redis的应用_缓存_预热/穿透/雪崩/击穿(缓存的概念涉及使用Redis作为缓存工具。缓存的更新策略包括定期生成和实时生成。缓存预热、缓存穿透、缓存雪崩和缓存击穿是常见的缓存问题,分别涉及预先加载缓存数据、查询不存在的数据导致直接访问数据库、大量缓存同时失效导致数据库压力骤增,以及热点数据在缓存失效瞬间被大量请求直接访问数据库。)

参考书籍:《C语言程序设计》《数据结构》《C++ Primer》《Effective C++》《STL源码剖析》《现代操作系统》《UNIX环境高级编程》《图解TCP/IP》《图解HTTP》《Linux高性能服务器编程》《剑指Offer》《算法导论》 1611

集成强大的 Redis,高并发查询以及缓存穿透和缓存雪崩预防

关于 Redis 的使用,大家应该已经不陌生了,我也介绍过 Redis 的使用、数据结构、使用场景分析,既然 Redis 这个强大,那么架构中引入了 Redis 之后,是不是就“无敌”了呢? 其实所有的架构、框架、组件,在解决一部分问题的同时,同样也会带来新的问题,让我们看看使用 Redis 可能会遇到什么样的问题。 01.缓存穿透 Redis 大部分的使用场景,都是根据 k...

liuyaokai1990的博客 114

Redis缓存详解:内存淘汰和缓存的预热、击穿、雪崩、穿透的原理与策略

指的是,由于在短时间内,redis上大规模的key失效,导致缓存命中率直线下降,打到mysql的请求激增压力迅速上升,引发mysql宕机。设置好缓存的容量上限,在接收用户请求的过程中,存在缓存的数据就直接返回给用户,如果不存在则去数据库中查,再将结果写到redis缓存中。引入缓存,在缓存中保存访问频繁的热点数据,降低直接对数据量访问的请求量(“二八定律”,20%的热点数据能满足80%的访问需求)。引入布隆过滤器,将合法的key预装到布隆过滤器中,请求先询问布隆过滤器,不存在就直接返回,不去访问mysql。

weixin_74312694的博客 1390

redis的缓存击穿,缓存穿透,缓存雪崩

在总结中,Redis的缓存击穿、缓存穿透和缓存雪崩问题对系统的性能和稳定性有很大的影响。为了解决这些问题,我们可以采取一些有效的措施,如使用互斥锁、设置缓存过期时间、使用布隆过滤器、设置空的默认值、使用备份节点、分布式锁和消息队列等技术。首先,让我们了解一下什么是缓存击穿。缓存击穿是指缓存中不存在的数据在查询时,由于缓存被穿透而直接查询数据库,导致缓存失效,严重影响系统性能和稳定性。缓存穿透是指查询的数据在缓存和数据库中都不存在,导致每次查询都直接查询数据库,严重影响系统性能和稳定性。

double222222的博客 783

【2023】Redis缓存高并发

有时候,缓存的数据是集中预热的,比如你每天的某个时间点将数据更新到缓存,就可能导致一大批缓存是集中于一个时间更新的,然后也可能会在某段时间后突然集中失效。在这种情况下,当有新的数据需要被缓存时,缓存系统就需要将一些已缓存的数据删除,以便为新的数据腾出空间。3️⃣:互斥锁,即每次发现key不存在的时候就加锁,只放一条线程去数据库查询真实数据,其他线程等候,直到被唤醒的时候重新检查缓存,就能直接返回缓存数据。4️⃣:数据预热:在系统启动时,将热门数据预热到缓存中,保证缓存中有足够的数据,避免发生缓存穿透。

皮皮的博客 2262

一篇文章带你了解Redis(为什么,持久化机制,内存淘汰机制,缓存穿透,缓存雪崩)

一篇文章带你了解Redis(为什么,持久化机制,内存淘汰机制,缓存穿透,缓存雪崩)

YmovomY的博客 1179

Redis实例案件--缓存雪崩、穿透

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075)交流学习。 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!! 本文主要描述了Redis的一些真实异常案例,但是都是总结是的描写。仅仅讲述了雪崩和穿透,对于穿透描述了布隆过滤器的使用。如果有需要可以继续阅读,对于这两种情况比较熟悉的可以绕过。 什么是缓存雪崩? 简...

xlecho的博客 819

Redis问题-缓存雪崩、击穿、穿透问题

缓存雪崩 我们假设一个没钱的小公司,双十一的例子来说一说,假设在双十一这天,持续24小时的购物狂欢,必然会有大量的用户也就是大量的请求打入我们的服务器,为了提高响应速度,肯定是将某些热点数据放入到缓存中了,假设在这种情况下,用户每分每秒都有超过十万次的点击,持续二十四小时,如果我的所有热点数据的缓存时间设置的是三小时的话,三小时后大量的缓存同时失效,但是同时又有超过十万次的请求打入后台,那么缓存失效,请求就会全部转发到数据库,数据库承受不了这么大的并发,即使是集群,那也得很强大的集群才有可能抗住这次缓存失效

SIESTA030的博客 1382

Redis 典型应用——缓存(缓存预热,穿透,雪崩,击穿)

缓存是计算机中一个很经典的概念,核心思路是把一些常用的数据放到访问速度更快的地方,方便随时读取;但对于计算机硬件来说,往往访问速度越快的设备,成本越高,存储空间越小,缓存是更快,但空间上是不足的,因此大部分时候,缓存只存放一些热点数据;

2201_75456895的博客 1651
上一篇: 大龄程序员刚迈过了 35 岁这个“坎儿”,和大家说点儿心里话
下一篇: 如何在分布式场景下生成全局唯一 ID ?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值