如何更有效的使用 Redis 缓存

深入学习 Redis - 如何使用 Redis 作缓存?缓存更新策略?使用需要注意哪些问题(工作/重点) 缓存可以理解为,将常用的数据从放到一个访问速度更快的的地方,方便更快的随时读取. 也就是说,速度快的设备,可以作为速度慢的设备的缓存,加快读取速度。 阅读详情

前言

对于 Redis 来讲,作为缓存使用,是我们在业务中经常使用的,这里总结下,Redis 作为缓存在业务中的使用。

旁路缓存

Cache Aside(旁路缓存)策略以数据库中的数据为准,缓存中的数据是按需加载的。它可以分为读策略和写策略。

只读缓存

只读缓存 从缓存中读取数据;如果缓存命中,则直接返回数据;如果缓存不命中,则从数据库中查询数据;查询到数据后,将数据写入到缓存中,并且返回给用户。

如果需要对数据进行修改的时候,直接修改数据库中的数据,然后删除缓存中的旧数据。

只读缓存的优点:

所有最新的数据都在数据库中,数据不存在丢失的风险。

缺点:

每次修改数据,都会删除缓冲,之后的请求会发生一次缓存缺失。

读写缓存

除了进行读操作外,数据的修改操作也会发送到缓存中,直接在缓存中对数据进行修改。此时,得益于Redis的高性能访问特性,数据的增删改操作可以在缓存中快速完成,处理结果也会快速返回给业务应用,这就可以提升业务应用的响应速度。

当然 Redis 是内存数据库,一旦掉电或宕机,内存中的数据就有可能存在丢失。

针对这种情况,一般会有两种回写策略:

  • 1、同步回写;

写请求发给缓存的同时,也会发给后端数据库进行处理,等到缓存和数据库都写完数据,才给客户端返回。这样,即使缓存宕机或发生故障,最新的数据仍然保存在数据库中,这就提供了数据可靠性保证。

不过,同步直写会降低缓存的访问性能。这是因为缓存中处理写请求的速度是很快的,而数据库处理写请求的速度较慢。即使缓存很快地处理了写请求,也需要等待数据库处理完所有的写请求,才能给应用返回结果,这就增加了缓存的响应延迟。

  • 2、异步回写。

所有写请求都先在缓存中处理。可以定时将缓存写入到内存中,然后等到这些增改的数据要被从缓存中淘汰出来时,再次将它们写回后端数据库。这样一来,处理这些数据的操作是在缓存中进行的,很快就能完成。只不过,如果发生了掉电,而它们还没有被写回数据库,就会有丢失的风险了。

优点:

被修改的数据永远在缓存中,不会发生缓存缺失,下次可以直接访问,不在需要向数据库中进行一次查询。

缺点:

数据可能存在丢失的风险。

设置多大的缓存合适

缓存能够提高响应速度,但是缓存的数量也不是越多越好?

1、大容量缓存是能带来性能加速的收益,但是成本也会更高;

2、在一些场景中,比如秒杀,少量的缓存承担的就是绝大部分的流量访问。

系统的设计选择是一个权衡的过程:大容量缓存是能带来性能加速的收益,但是成本也会更高,而小容量缓存不一定就起不到加速访问的效果。一般来说,建议把缓存容量设置为总数据量的15%到30%,兼顾访问性能和内存空间开销。

内存被写满了如何处理

Redis 中的内存被写满了,就会触发内存淘汰机制了

具体参加内存淘汰机制

缓存经常遇到的问题

Redis 作为缓存,经常遇到的几种情况:缓存中的数据和数据库中的不一致;缓存雪崩;缓存击穿和缓存穿透。

下面一一来探讨下

1、缓存中的数据和数据库中的不一致

数据一致性,通俗的理解就是,数据库中的数据和缓冲中的数据完全一致就满足一致性。不过对于只读缓存,如果缓冲中没有就去数据库中查询,这样如果缓存中没有数据,但是数据库中的数据是最新的,最终也能满足数据一致性。

所以总结下,一致性大致分成下面的两种情况:

1、缓存中有数据,缓存中的数据和数据库中的数据一样;

2、缓存中没有数据,数据库中记录了最新的数据。

下面分析下只读缓存和读写缓存中的数据不一致情况

读写缓存

读写缓存有同步写回和异步写回两种策略

同步写回:缓存在新增修改的时候,也会同步数据到数据库中,这样总能保持缓存中的数据和数据库中的一致;

异步写回:缓存新增修改时候,先不写回到数据库中,定时或者缓存中数据淘汰的时候,再写回到数据库中。这种,如果 Redis 故障宕机了,没有及时写回数据到数据库中,就会造成数据的不一致。

对于读写缓存,使用同步写回的策略,能保证数据数据的一致性。不过,需要在业务应用中使用事务机制,来保证缓存和数据库的更新具有原子性,也就是说,两者要不一起更新,要不都不更新,返回错误信息,进行重试。否则,我们就无法实现同步直写。

如果系统没宕机,redis 系统正常的情况下,因为读写缓存,缓存中的数据是一直存在的,所以当修改数据的时候先修改缓存中的数据,这样就算并发很大的情况下,因为缓存中的数据都是最新的,并且一直存在,这样数据总能读取到最新的数据。

只读缓存

只读缓存,如果数据新增,直接写入到数据库中,如果有数据修改删除,也是直接操作数据库不过缓存中的数据不会更新,而是直接删除缓存中的数据。

这样数据的更新操作之后,数据库中的数据总是最新的,缓存中就会发生缓存缺失,此时就会从数据库中读取数据,然后再加载到缓存中,这样缓存中的数据总能和数据库中的数据一致。

只读缓存在数据新增的时候,缓存中是没有数据的,所以肯定是要从数据库中加载,这种情况不存在数据不一致的情况。

在只读缓存中,数据不一致的情况,发生在数据的更新删除操作中,下面来一一分析下

删改操作既要修改数据库,同时还要删除对应的缓存,如果这两个操作的原子性无法得到保证,(一起操作成功,或者一起操作失败),那么数据的一致性就得不到保证了。

来个异常的栗子

1、先修改数据库,然后删除缓存,但是删除缓存失败了;

删除缓存失败了,那么缓存中存在的就是旧值,这时候用户的请求过来了,首先去缓存中查询,这时候拿到的就是老旧的数据。

2、先删除缓存,在修改数据库,修改数据库失败了;

缓存删除成功,数据库修改失败了,那么数据库中存在的就是旧值,因为缓存已经被删除了,这时候去缓存中查询,发生了缓存的缺失,数据就会从数据库中加载到缓存中,这时候读取到也是老旧的数据。

C++后台开发系统学习地址:C/C++Linux服务器开发高级架构师/C++后台开发架构师​

以下学习资料,C++后台开发面试题,教学视频,C++后台开发学习路线图,免费分享有需要的可以自行添加:学习资料群720209036 自取

​针对这种问题如何解决呢?

上面出现异常的两种场景,归根到底,就是两者操作的原子性没有得到保证,所以可以借助于消息队列实现最终的一致性。

使用 mq 解决分布式事务可参见分布式事务

这里的操作场景相对简单一点,只要借助于 mq 的重试机制,保证第二步的操成功就可以了。

栗如:

1、先修改数据库;

2、发送删除缓存的消息到 mq 中;

3、下游收到删除的消息,操作删除缓存,如果失败,借助于 mq 的重试机制,就能进行重试操作,直到成功。当然如果,重试多次还是失败,我们需要记录错误原因,然后通知业务方。

​那到底应该先删除缓存还是先修改数据库呢?这里我们再探讨一下

1、先删除缓存后修改数据库

先删除缓存,然后修改数据库

如果数据库的更新有延迟,那么这时候一个线程过来查询该数据,因为缓存中已经删除了,这时候发生了缓存的缺失,然后就回去数据库中查询,数据库可能还没有更新成功,就可能获取到旧值。

如何解决呢

使用 延迟双删 策略

当数据库被修改之后,线程 sleep 一段时间,然后再次删除缓存,然缓存发生一次缺失,这样下次的请求,就能把数据库中最新的数据加载到缓存中。

​比如上面的这种情况,因为数据库的更新可能存在延迟,所以时候线程2读取到了数据库的旧值,然后加载到了缓存中,这样接下来的所有的查询就都会读取旧值

所以 线程1,通过延迟双删来处理这种情况

线程1,在 sleep 一段时间之后,删除缓存,这样就能使后续的缓存缺失,后续的查询就能加载数据库中最新的数据到缓存中。

不过 sleep 的时间需要大于,线程2,读数据并且写入数据到内存的时间,如果 sleep 时间过小,这时候线程2,的旧值还没有写入到缓存中,线程1,已经再次删除了缓存,然后这时候线程2把旧值写入,导致缓存中依然是旧数据。

redis.delKey(X)
db.update(X)
Thread.sleep(N)
redis.delKey(X)

当然,这在 sleep 的时间内,还是有一部分请求会读取到旧值

2、先修改数据库然后删除缓存

先修改数据库,然后删除缓存

如果缓存删除有延迟,那么这时候过来的请求,就会读取到缓存中老旧的数据,不过缓存会马上被删除,只会有少部分的数据读取到老旧的数据,对业务影响比较小。

经过对比,发现先修改数据库然后在删除缓存,对我们业务的影响比较小,同时也跟容易处理。

只读缓存和读写缓存如何选择

读写缓存对比只读缓存

优点:缓存中一直会有数据,如果更新操作后会立即再次访问,可以直接命中缓存,能够降低读请求对于数据库的压力。

缺点:如果更新后的数据,之后很少再被访问到,会导致缓存中保留的不是最热的数据,缓存利用率不高(只读缓存中保留的都是热数据)。

所以读写缓存比较适合用于读写相当的业务场景。

2、缓存雪崩

什么是缓存雪崩

缓存雪崩是指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。

缓存雪崩有两种场景

1、大量缓存同时过期

如果有大量的缓存 key 设置了同样的过期时间,如果这些缓存 key 过期了,同时有大量的请求,进来了,这些请求就会直接打到数据库中,数据库可能因为这些请求,导致数据库压力增大,严重的时候数据库宕机。

如何解决呢?

1、避免给大量的过期键设置相同的过期时间,设计过期时间的时候,可以考虑加入一个业务上允许的过期随机值;

2、服务降级,只有部分核心业务的请求,才会流转到数据库中,数据库的压力就会被大大减轻了;

  • 当业务应用访问的是非核心数据(例如电商商品属性)时,暂时停止从缓存中查询这些数据,而是直接返回预定义信息、空值或是错误信息;

  • 当业务应用访问的是核心数据(例如电商商品库存)时,仍然允许查询缓存,如果缓存缺失,也可以继续通过数据库读取。

2、Redis 实例发生宕机

Redis 实例的宕机,缓存层就不能处理数据,最总流量都会流入到数据库中

如何解决呢?

1、业务中实现服务熔断或者请求限流机制;

  • 服务熔断:如果监听到发生了缓存雪崩,直接暂停对缓存服务的请求,但是这种对业务的影响比较大;

  • 服务限流:可以在入口做限流,不要让所有的请求都流入到后端的服务中;

2、提前预防,搭建 Redis 的高可用集群;

  • 尝试构建 Redis 的高可用集群,比如当某主节点挂掉了,集群能够马上重新选出新的主节点。例如哨兵机制

3、缓存击穿

其实跟缓存雪崩有点类似,缓存雪崩是大规模的key失效,而缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,导致大并发全部打在数据库上,导致数据库压力剧增。这种现象就叫做缓存击穿。

如何解决?

对于热点 key 可以不设置过期时间,或者设置一个超过使用周期的过期时间,保证这个 key 在业务使用期间永远存在。

4、缓存穿透

如果业务请求的缓存,既不在缓存中,也不再数据库中,那么缓存将没有用,所有的请求都会流入到数据库中。

那么,缓存穿透会发生在什么时候呢?一般来说,有两种情况。

1、业务层误操作:缓存中的数据和数据库中的数据被误删除了,所以缓存和数据库中都没有数据;

2、恶意攻击:专门访问数据库中没有的数据。

如何解决?

1、缓存空值或缺省值;

一旦发生缓存穿透,在缓存中写入一个业务中允许的空值,这样缓存中有数据了,就避免了缓存穿透。

2、使用布隆过滤器;

使用布隆过滤器判断下数据是否存在,数据如果不存在,就不向数据库发起请求了。

布隆过滤器

3、在请求入口的前端进行请求检测;

缓存穿透的一个原因是有大量的恶意请求访问不存在的数据,所以,一个有效的应对方案是在请求入口前端,对业务系统接收到的请求进行合法性检测,把恶意的请求(例如请求参数不合理、请求参数是非法值、请求字段不存在)直接过滤掉,不让它们访问后端缓存和数据库。这样一来,也就不会出现缓存穿透问题了。

缓存中的 hot key 和 big key

这两种的处理方式可参见

Hot Key 和 big key

总结

对于缓存的使用,我们经常用到的有两种1、只读缓存;2、读写缓存;

只读缓存,对比读写缓存

优点:缓存中一直会有数据,如果更新操作后会立即再次访问,可以直接命中缓存,能够降低读请求对于数据库的压力。

缺点:如果更新后的数据,之后很少再被访问到,会导致缓存中保留的不是最热的数据,缓存利用率不高(只读缓存中保留的都是热数据)。

所以读写缓存比较适合用于读写相当的业务场景。

缓存在使用的过程中,会面临缓存中的数据和数据库中的不一致;缓存雪崩;缓存击穿和缓存穿透,这些我们需要弄明白这些情况发生的额场景,然后再业务中一一去避免。

参考资料

​推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

通义千问语言模型Qwen2.5架构详解 此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。 阅读详情

相关推荐

手把手教你使用HFSS仿真高速差分过孔—上

高速数字电路设计中,信号完整性是一个非常重要的问题。为了使信号保持良好的传输特性,PCB板上的互联线一般都采用均匀传输线,使互联线保持特性阻抗一致性,减少信号反射。然而PCB板上的互联线很多时候避免不了换层的问题,这时候就必须使用过孔。过孔会导致阻抗不连续,进而造成反射,出现信号完整性问题。         当信号传输速率越高,信号前沿越短的时候,过孔引入的信号完整性问题越严重,需要对过孔进行优

a2447944219的博客 2万+

Redis 缓存

缓存类型 客户端缓存 对于BS架构的互联网应用来说客户端缓存主要分为页面缓存和浏览器缓存两种,对于APP而言主要是自身所使用的缓存。 清理缓存的方式: 以网页浏览器为例 1.使用Ctrl+F5可以强制刷新浏览器本地缓存 2.浏览器中的参数设置的时间已过期如:Expires,Cache-control: max-age, Last-Modified标签等 网络中缓存 网络中的缓存主要是指代理服务器对...

sinat_34814635的博客 4434

速腾Helios-16P使用Lego-loam实时构建点云地图(二)——Lego-loam的编译与运行

不兼容的问题,打开lego-loam的~/lego-loam_ws/src/LeGO-LOAM/LeGO-LOAM/src下的4个源码文件,搜索/camera_init,将所有/camera_init改成camera_init,也就是去掉斜杠,这样再回到工作空间重新编译lego-loam。3、速腾16线激光雷达RS-16 ----- 3D建图算法LeGO-LOAM的使用(Ubuntu18.04 + ROS Melodic)_速腾16线 lego loam_杰尼君的博客-优快云博客。

qq_59475883的博客 2568

redis缓存

缓存问题

chenchenchencl的博客 2209

告别裸机:在FreeRTOS上为STM32移植SOEM 1.4.0的完整指南

本文详细介绍了在FreeRTOS环境下为STM32H7系列芯片移植SOEM 1.4.0的完整指南,涵盖环境准备、任务架构设计、OSAL层适配及网络驱动优化等关键步骤。通过EtherCAT主站解决方案的实现,帮助开发者构建稳定可靠的工业自动化系统,提升实时通信性能。

weixin_33582311的博客 363

免疫治疗新思路:用COMPASS算法挖掘单细胞数据中的代谢靶点(含差异分析技巧)

本文介绍了如何利用COMPASS算法从单细胞转录组数据中系统推断免疫细胞的代谢活性,为肿瘤免疫治疗提供新的靶点发现思路。文章详细阐述了COMPASS结合流平衡分析的核心原理,并提供了从差异分析到可成药性评估的完整转化路径,旨在帮助研究者精准定位代谢弱点,开发新型免疫代谢疗法。

weixin_29275257的博客 366

【Redis缓存】

相比于数据库而言,缓存的操作性能更高,缓存性能高的主要原因有以下几点:1、缓存一般都是key-value查询数据的,因为不像数据库一样还有查询的条件等因素,所以查询的性能一般会比数据库高;2、缓存的数据是存储在内存当中的,而数据库的数据是存储在磁盘当中的,因为内存的操作性能远远大于磁盘,因此缓存的查询效率会高很多;3、缓存更容易做分布式部署(当一台服务器变成多台相连的服务器集群),而数据库一般比较难实现分布式部署,因此缓存的负载和性能更容易平行扩展和增加。缓存大致分为两大类:本地缓存、分布式缓存本地缓存:也

weixin_54161577的博客 9827

头歌操作系统2.3系统调用命令ls执行的系统调用

设置版本0内核为分析对象。然后一直c直到虚拟机出现。然后一直c就是答案了。

m0_74128952的博客 1万+

redis之缓存

reids 是基于内存的数据库,它的特性之一就快,缓存是其最主要的应用场景,本文主要介绍 redis 的缓存特性,以及该如何正确的使用它。

Crazy博客 4093

Java使用easyExcel生成excel文件直接写入邮件附件并发送

1.引入pom依赖 <!-- email --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!-- easyexcel需要依赖poi jar包 --> <depe

weixin_50493320的博客 3910

NX二次开发新建组件

NXOpen新建组件

qq_39541524的博客 329

瑞_Redis_商户查询缓存_添加Redis缓存&缓存更新策略

本文章为瑞_系列专栏之《Redis》的实战篇的商户查询缓存章节的添加Redis缓存以及缓存更新策略小节。主要讲解了Redis缓存更新的三大策略:内存淘汰、超时剔除、主动更新

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 1380

第154章 点云大规模并行处理(GPU加速)

优化点云处理✨ 使用。

yumeiguo的博客 374

【Redis 进阶】缓存

缓存是计算机系统中用于提高数据访问效率的关键技术,通过将常用数据存储在高速存储器中,减少对低速存储设备的访问。缓存的有效性遵循“二八原则”,即少数数据承载了大部分访问请求。Redis作为一种高性能内存数据库,常被用作关系型数据库的缓存层,显著提升数据读取速度并降低数据库负载。Redis的更新策略包括定期生成和实时生成,分别适用于访问模式稳定和变化频繁的场景。使用Redis时需注意缓存穿透、雪崩和击穿等问题,通过空值缓存、布隆过滤器、优化过期策略和服务降级等手段进行防范。

2301_79816047的博客 1085

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

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

django 使用redis进行页面数据缓存和更新缓存数据

转自:https://blog.youkuaiyun.com/xiaohuoche175/article/details/89304601 在开发过程中会遇到一些页面的数据是很长时间才进行更新的,不使用缓存的情况下,用户每次访问这些都需要先去数据库中获取这些数据,当访问量较大时,这样获取数据的方式就会降低页面的访问速度,影响效率,这时就可以使用redis将这些数据保存起来,通过判断是否生成过获取以...

weixin_30426065的博客 142

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Supabase缓存策略:Redis集成与数据缓存优化

你是否在开发Supabase应用时遇到过频繁查询导致的性能瓶颈?是否想过如何通过缓存技术显著提升应用响应速度?本文将带你深入了解Supabase与Redis的集成方案,掌握从基础配置到高级优化的完整缓存策略,让你的应用在高并发场景下依然保持流畅体验。读完本文,你将能够实现Redis与Supabase的无缝对接、设计高效的缓存策略,并通过实际案例掌握缓存优化技巧。 ## Redis集成基础 Su...

gitblog_00002的博客 603

VC中sqlite的使用

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

黑马点评学习笔记-Redis练手项目——day2(缓存篇)

随后就是在更新的时候,采取先更新数据库,再删除缓存(这样发生不一致问题的几率更加小(要先查询看看店铺id是否存在,否则会发生空指针问题)-》而且再命中之后还要判断缓存中存储的值是不是空值(不是则返回,是则直接结束)一开始店铺查询是需要使用mp的查询数据库实现的,由于这个。如何保证缓存与数据库的操作的同时成功或失败?前两种是被动措施,后面的是主动的措施。修改店铺是先修改数据库再删除缓存.先操作缓存还是先操作数据库?先操作数据库,再删除缓存。先删除缓存,再操作数据库。删除缓存还是更新缓存?

2302_80981029的博客 1448

Redis缓存实现

文章目录[隐藏] 基于注解的Redis缓存实现 基于API的Redis缓存实现 自定义RedisTemplate序列化机制 自定义RedisCacheManager 基于注解的Redis缓存实现 导入依赖 <depende...

zhmq_top的博客 290

SpringBoot2.x使用Redis缓存,更给默认序列话机制。

SpringBoot2.x默认的序列化机制是jdk,以下是转换过程。 package com.gnl.springbootcache.config; import com.fasterxml.jackson.databind.ObjectMapper; import com.gnl.springbootcache.entites.Employee; import org.springframew...

guinailu的博客 756

27 Redis 缓存污染问题

27 Redis 缓存污染问题前言一、如何解决缓存污染问题二、LRU 缓存策略三、LFU 缓存策略的优化总结 前言 应用 Redis 缓存时,如果能缓存会被反复访问的数据,那就能加速业务应用的访问。 如果发生了缓存污染,缓存对业务应用的加速作用就减少了。 在一些场景下,有些数据被访问的次数非常少,甚至只会被访问一次。当这些数据服务完访问请求后,如果还继续留存在缓存中的话,就只会白白占用缓存空间。这种就是缓存污染。 当缓存污染不严重时,只有少量数据占据缓存空间,对缓存系统的影响不大。但是缓存污染变得严重后

海陆云的博客 2万+

09蚂蚁-分布式缓存架构——3.Redis和EhCache一级二级缓存

Redis和Ehcache缓存的区别 如果是单个应用或者对缓存访问要求很高的应用,用ehcache。 如果是大型系统,存在缓存共享、分布式部署、缓存内容很大的,建议用redis。 实际工作中使用Ehcache 我们在项目中使用集中式缓存(Redis或者式Memcached等),通常都是检查缓存中是否存在 期望值的数据,如果存在直接返回,如果不存在就查询数据库让后在将数据库缓存, 这个时候如果缓存...

qq_28461661的博客 510

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

案例:假设有一个热门商品的库存信息缓存在Redis中,当这个商品的库存信息过期后,如果有大量用户同时查询该商品的库存,所有的请求都会直接打到数据库,导致数据库瞬间压力过大。定义:缓存雪崩是指当缓存中大量数据在同一时间过期(集中过期),或者由于某些原因导致大量数据同时失效时,大量请求直接打到数据库,造成数据库压力过大甚至崩溃。定义:缓存穿透是指查询一个一定不存在的数据,由于缓存不命中后需要查询数据库,而数据库中也没有这个数据,每次查询都要去数据库访问一次,导致数据库压力增大。案例:一个用户ID为。

xzx_521123的博客 482

redis缓存雪崩

Redis缓存雪崩是指在短时间内大量缓存数据同时失效,导致原本应该由缓存承担的请求流量突然涌向后端数据库或其他数据源,从而给后端系统带来巨大压力,可能导致数据库超负荷甚至崩溃的现象。使用本地缓存(如L1缓存)作为第一级缓存,再使用Redis作为第二级缓存,可以进一步分散请求,提高系统整体的响应速度和稳定性。当检测到缓存失效的请求过多时,可以采取限流措施,或者返回预先准备好的静态页面或默认数据,以减轻数据库的压力。当数据更新时,先标记缓存为过期,然后异步更新缓存,避免并发更新数据造成的数据库压力。

weixin_43803780的博客 586

Redis缓存使用技巧和设计方案

缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析、缓存更新策略的选择和使用场景、缓存粒度控制方法、穿透问题优化、无底洞问题优化、雪崩问题优化、热点key重建优化。 1)缓存的收益和成本分析 下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构。 下面分析一下缓存加入后带来的收益和成本。 收益: ①加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不够强悍(例如M

uuuyy_的博客 185

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具类)

2301_80412275的博客 2676

Redis缓存更新策略以及常见缓存问题

缓存就是数据交换的缓冲区(Cache),是存储数据的临时地方,一般读写性能较好,常见缓存:Web应用中缓存有什么作用呢?降低后端负载提高读写效率,降低响应时间数据的一致性成本代码维护成本运维成本。

buhuisuanfa的博客 2924
上一篇: Redis之最细命令介绍
下一篇: Linux C/C++ 并发下的技术方案(互斥锁、自旋锁、原子操作)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值