Redis缓存场景

news2024/11/28 1:14:36

Redis缓存场景

文章目录

  • Redis缓存场景
    • Redis做缓存
    • 旁路缓存
    • 缓存异常
      • 缓存穿透
      • 缓存击穿
      • 缓存雪崩
    • 缓存一致性
      • 先写缓存再写数据库
      • 先写数据库再写缓存
      • 先删除缓存再写数据库
      • 先写数据库再删缓存
      • 缓存双删
      • Binlog异步更新
      • 总结

Redis做缓存

部分图解来自于:https://www.mianshiya.com/

Redis由于高性能,通常可以作为数据库存储的缓存,比如给MySQL当缓存。

旁路缓存

Cache Aside,即旁路缓存,最常见的模式。应用服务把缓存作为数据库的旁路,直接和缓存进行交互。

读操作:

1.应用服务收到查询请求,先去查询数据是否在缓存上

2.如果在,把缓存数据打包返回;如果不在,去访问数据库查询,然后放到缓存上

image-20240821163309099

写操作:

旁路缓存一般都是先更新数据库,然后直接删除缓存。

image-20240821163407392

为什么不是更新缓存,而是删除缓存呢?因为更新比删除更容易导致时序性问题。

比如:

thread1更新一个MySQL字段为1,thread2更新MySQL字段为2,thread2更新缓存为2,thread1更新缓存为1。

最终缓存被更新为1,正确的数据因为时序性被覆盖了。

缓存异常

缓存穿透

缓存穿透指,缓存和数据库中都没有的数据,而用户不断发起请求。

如果从存储层查不到则不写入缓存,这个导致不存在的数据每次都请求到存储层去,失去了缓存的意义。

在流量大时,DB可能就挂了,如果有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

image-20240821165426228

解决方案:

1.接口层增加校验,如用户鉴权,id做基础校验,id<=0直接拦截

2.缓存中取不到的数据,数据库也取不到,将key-value设置为key-null,设置到缓存中(设置一个过期时间,如30秒,时间太长,正常情况也没法使用)。这样可以防止一个用户反复用同一个id暴力攻击

3.使用布隆过滤器,布隆过滤器可以快速判断某个元素是否存在于集合中。

布隆过滤器是一种巧妙的数据结构,可以用来查询,某个元素可能存在或一定不存在。

布隆过滤器的原理:

底层为一个bit数组,将字符串用多个哈希函数映射到不同位置,将对应位置置为1。

在查询时,如果一个字符串所有哈希函数映射的值都为1,那么数据可能存在;否则不存在。

为什么说可能呢?因为其他字符也可能占据这个bit位的值。

缓存击穿

缓存击穿是指缓存中没有数据库有的数据(一般都是缓存时间到期),由于并发量特别大,同时读缓存没有读到缓存,又同时去数据库去数据,引起数据库压力瞬间增大,造成过大压力。

缓存击穿,一般指热键在过期失效的一瞬间,还没来得及重新生产,就有海量数据,直达数据库。

解决方案:

1.热点数据支持续期,持续访问的数据可以不断续期,避免因为续期而失效而被击穿

2.发现缓存失效,重建缓存加互斥锁,当线程查询缓存发现缓存不存在就会尝试加锁,线程争抢锁,拿到锁的线程进行查询数据库,然后重建缓存,争抢锁失败的线程,加一个睡眠然后循环重试。

image-20240821181555510

缓存雪崩

缓存雪崩,指大量的应用请求因为异常无法在Redis缓存中进行处理,像雪崩一样,直接打到数据库。

异常原因主要是:缓存中数据大批量到过期时间,而查询数据量大,引起数据库压力增大甚至宕机。

image-20240821181619863

和缓存击穿不同的是,缓存击穿是指一条热点数据没在Redis及时重建,缓存雪崩是大批量数据在Redis同时失效。

解决方案:

1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发送。

2.重建缓存加互斥锁,当线程拿到缓存后发现缓存不存在就会尝试加锁,线程争抢锁,拿到锁的线程进行查询数据库,重建缓存,争抢锁失败的线程加一个睡眠然后循环重试。

缓存一致性

部分图解来自于:https://www.mianshiya.com/
不推荐使用:

1.先写缓存再写数据库

2.先写数据库再写缓存

3.先删除缓存再写数据库

推荐使用:

4.先写数据库再删缓存

5.缓存双删

6.Binlog异步更新

先写缓存再写数据库

部分图解来自于:https://www.mianshiya.com/
image-20240821183018394

由于网络问题,请求顺序无法保证,有可能出现,后更新缓存的请求反而先更新了数据库。

先写数据库再写缓存

部分图解来自于:https://www.mianshiya.com/
image-20240821183203219

同样的,后更新数据库的请求先更新了缓存。

先删除缓存再写数据库

部分图解来自于:https://www.mianshiya.com/
image-20240821183353280

读操作读到了过期的数据,虽然写操作已经完成了,但是因为缓存被删除了,读操作必须从数据库读到了更新前的旧值。

先写数据库再删缓存

部分图解来自于:https://www.mianshiya.com/
image-20240821183650246

先修改数据库的值,再去删除对应缓存,在修改数据库期间允许一定时间的缓存不一致,保证最终程序一致性。

但是也会有一定的问题:

image-20240821183842529

在写操作时,并发有个读请求,又因为缓存失效,读请求在写操作之后更新缓存,导致数据库和缓存不一致。

缓存双删

缓存双删,先删除数据库,再写数据库,过一段时间再删除缓存
部分图解来自于:https://www.mianshiya.com/
image-20240821192917342

避免数据被回种到缓存,间隔一段时间删除缓存。

也可以使用消息队列、定时任务或延迟任务实现删除:

image-20240821193139898

Binlog异步更新

部分图解来自于:https://www.mianshiya.com/
image-20240821193309413

先修改数据库,然后通过Canal监听数据库的binlog日志,记录数据库的修改信息,然后通过消息队列异步修改缓存的数据。这里注意保证顺序消费,保证缓存中数据按顺序更新,然后加上重试机制,避免网络问题导致更新失败。

总结

1.一般不使用前三种方式

2.后三种根据使用场景进行选择

  • 实时一致性:考虑先写MySQL,再删Redis(有短期不一致,但它能尽量保证数据一致性)
  • 最终一致性:考虑binlog+消息队列(因为重试和顺序消费,最大限度保证缓存与数据库最终一致性)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微课录制不再难:精选三款录屏软件助你一臂之力

在这个信息爆炸的时代&#xff0c;微课以其短小精悍、易于消化的特点&#xff0c;成为知识传播的新宠。无论是教师备课、企业培训&#xff0c;还是个人知识分享&#xff0c;微课都能以其独特的方式&#xff0c;让学习变得更加高效和便捷。在数字化教学的浪潮中&#xff0c;PPT课…

SAP SUBSCREEN使用

step1&#xff1a;在SELECTION-SCREEN中定义SUBSCREEN SELECTION-SCREEN BEGIN OF SCREEN 0101 AS SUBSCREEN. SELECT-OPTIONS S_XMGS FOR ZTPO0074-XMGS . SELECTION-SCREEN END OF SCREEN 0101.STEP2: 引用SUBSCREEN 关键字 CALL SUBSCREEN SUBSCR_0100 INCLUDING SY-RE…

Java基础核心知识学习笔记

方法重载 请记住下面重载的条件 方法名称必须相同。参数列表必须不同&#xff08;个数不同、或类型不同、参数类型排列顺序不同等&#xff09;。方法的返回类型可以相同也可以不相同。仅仅返回类型不同不足以成为方法的重载。重载是发生在编译时的&#xff0c;因为编译器可以根…

结合ChatGPT与Discord,提高团队合作效率

本文将教你如何集成Discord Bot&#xff0c;助力团队在工作中实现更高效的沟通与协作。通过充分发挥ChatGPT的潜力&#xff0c;进一步提升工作效率和团队协作能力。无需编写任何代码即可完成本文所述的操作&#xff0c;进行个性化定制只需对参数进行微调即可。 方案介绍 如果在…

联想闪电鲨移动硬盘文件没删除却消失了怎么办

在日常的数据存储与管理中&#xff0c;移动硬盘作为便携且容量可观的存储设备&#xff0c;深受用户青睐。然而&#xff0c;当您发现联想闪电鲨移动硬盘中的文件突然消失&#xff0c;而您确信并未进行删除操作时&#xff0c;这无疑会令人感到困惑与焦虑。本文旨在为您揭开这一谜…

MySQL各个版本root账号没有最高权限的解决方法

一、详细报错 ERROR 1045 (28000): Access denied for user ‘root’‘localhost’ (using password: YES) 报错原因&#xff08;分析过程&#xff09;&#xff1a; rootlocalhost用户密码修改导致 解决方法&#xff1a; 跳过权限验证启动数据库&#xff0c;并修改密码。如下…

[028-3].第05节:RabbitMQ中的交换机

1.什么是Exchanges(交换机&#xff09;: 1.RabbitMQ 消息传递模型的核心思想是: 生产者生产的消息从不会直接发送到队列。实际上&#xff0c;通常生产者甚至都不知道这些消息传递传递到了哪些队列中2.生产者只能将消息发送到交换机(exchange)&#xff0c;交换机工作的内容非常…

C++ TinyWebServer项目总结(7. Linux服务器程序规范)

进程 PID 进程的PID&#xff08;Process ID&#xff09;是操作系统中用于唯一标识一个进程的整数值。每个进程在创建时&#xff0c;操作系统都会分配一个唯一的PID&#xff0c;用来区分不同的进程。 PID的特点 唯一性&#xff1a; 在操作系统运行的某一时刻&#xff0c;每个…

江苏省第二中医院案例│“互联网+医疗”下的灾备建设

江苏省第二中医院&#xff0c;成立于1988年12月&#xff0c;是一所融医疗、教学、科研、预防保健为一体的公立省级综合性三级甲等中医院。目前&#xff0c;正对照“大学附属医院”“省级三甲医院”建设标准&#xff0c;全面推进医院建设高质量跨越式发展。 用户需求&#xff1a…

冒 泡 排 序

今天咱们单独拎出一小节来聊一聊冒泡排序昂 冒泡排序的核心思想就是&#xff1a;两两相邻的元素进行比较&#xff08;理解思路诸君可看下图&#xff09; 接下来我们上代码演示&#xff1a; 以上就是我们初步完成的冒泡排序&#xff0c;大家不难发现&#xff0c;不管数组中的元…

智能停车计费系统设计与实现_urqs9

TOC springboot552智能停车计费系统设计与实现_urqs9--论文 绪 论 1.1 研究背景 在新世纪的今天&#xff0c;计算机已经发展到一定的规模&#xff0c;带动了国内经济和科学技术的快速发展&#xff0c;科学技术的发展大大提高了生产效率&#xff0c;使人们的物质生活需求得到…

为啥每个语音的printf(“%d%d%d%d“,i,j,i++,j++)不一样

题目来源一位考研同学的题目。 第一眼&#xff1a;小子&#xff0c;这都不会&#x1f600; 第二眼&#xff1a;wok&#xff0c;咋没有选项&#x1f622; 作为一个大一学C语音&#xff0c;大二学Java的同学来说&#xff0c;我一看就觉得肯定是11 6 11 6 。 结果很遗憾&#xff0…

微服务开发相关问题

微服务开发相关问题 服务注册nacos 2.X注册问题[Nacos Config] config[dataIddatasource.yml, groupDEFAULT_GROUP] is empty 参考 持续更新… 服务注册 nacos 2.X注册问题 [Nacos Config] config[dataIddatasource.yml, groupDEFAULT_GROUP] is empty 因为&#xff1a;# 由于…

C++第十二弹 -- STL之list模拟实现

文章索引 前言模拟实现list1. ListNode节点类2. list的迭代器封装3. 反向迭代器4. list类的模拟实现测试代码 list的反向迭代器总结 前言 通过模拟实现可以让我们更加深刻的理解C底层STL的实现逻辑, 本篇就对list的底层进行模拟实现. 博客主页: 酷酷学!!! 点击关注 共同进步!…

影响五金精密零件加工价格的因素

在制造业中&#xff0c;五金精密零件的加工价格受到多种因素的影响。了解这些因素&#xff0c;对于企业合理控制成本、选择合适的加工供应商至关重要。 首先&#xff0c;零件的设计复杂度是一个重要因素。复杂的设计通常需要更先进的加工技术和更多的加工工序。例如&#xff0c…

intel ECI作为ACRN VM使用dpdk(vfio和iommu问题)以及img扩容

ACRN虚拟机内IOMMU 对非虚拟机而言&#xff0c;只要在BIOS里开启VT-d就可以用iommu去映射vfio使用DPDK&#xff0c;但是在虚拟机中即便BIOS开启了VT-d&#xff0c;它也传不到VM中。因此这个帖子解决一下这个问题。 在ACRN的launch脚本中需要passthru两个网卡&#xff0c;一个用…

C++ TinyWebServer项目总结(8. 高性能服务器程序框架)

《Linux 高性能服务器编程》一书中&#xff0c;把这一章节作为全书的核心&#xff0c;同时作为后续章节的总览。这也意味着我们在经历了前置知识的学习后&#xff0c;正式进入了 Web 服务器项目的核心部分&#xff01; 前置内容回顾&#xff1a; 1. C TinyWebServer项目总结&…

《深入浅出多模态》(九)多模态经典模型:MiniGPT-v2、MiniGPT5

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职…

【Datawhale AI夏令营第四期】 浪潮源大模型应用开发方向笔记 Task03 大咖项目分享 人话八股文Bakwaan_Buddy项目开发尝试

【Datawhale AI夏令营第四期】 浪潮源大模型应用开发方向笔记 Task03 人话八股文Bakwaan_Buddy项目开发尝试 Idea: 我们草台班子目前的想法是解决大家计算机学院毕业面临的BUG——不爱背、背不下来八股文&#xff0c;觉得枯燥、烦、工作了用不着&#xff0c;反正就是知识他不…

triton之flaggems的point-wise分析

一 流程 1 代码分析 1.1 parameter_ref_for_wrapper 对应 二 拾遗 报错 1 缺少@triton.jit File "/opt/conda/envs/py38/lib/python3.8/site-packages/Open_triton/utils/dynamic_index_put.py", line 676, in decorator num_inputs = len(fn.arg_name…