十五、Redis缓存常见问题

Redis作为最常用的缓存中间件,在使用过程中,必然会遇到过;**缓存穿透、缓存雪崩、缓存击穿。**这三个可以说是Redis缓存使用过程中,最常见的问题,且也是面试中最常闻到的问题。

1、缓存穿透

**缓存穿透:**是指查询了一个必然不存在的数据,缓存中和数据库中都不会存在的数据。由于缓存中没有缓存,所以每次请求都会请求到数据库。这就可能存在别人恶意攻击的风险,比如拿个数据库中必然不存在的id(-1,或者非常大的),每次请求都会请求到数据库。会导致数据库的负载增大,甚至打挂数据库。
image.png

解决方案

缓存空对象

缓存空对象:是指当在数据库中也查询不到这个对象时,在缓存中增加一个key-null的键值。
但是缓存空的对象会有两个问题:

  1. value为null,也会占用内存空间,由于对不存在的key,也做了缓存,可能会导致缓存中存在大量的不存在值的key,会占用大量的内存空间。可以采用设置缓存时间(一个较短的时间)的方式,让其自动剔除。
  2. 缓存和数据库可能存在一段时间的数据不一致的情况,也就是说在缓存中key的过期时间内,数据库中可能添加了这个数据,那么在此key过期这段时间内,就存在缓存和数据库不一致的情况。这种情况可以采用消息队列或者其他方式清掉缓存的空对象即可。

布隆过滤器拦截

在访问缓存和数据库之前,将存在的key用布隆过滤器提前保存起来,做第一层拦截。当收到一个key的请求时,先在布隆过滤器中判断是否存在这个key,如果不存这个key,则直接返回给客户端。如果存在可以进入缓存、数据库中。这种情况适用于数据相对固定的情况。
布隆过滤器实际上就是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否存在集合中。可以得知一个元素一定不存在,但是不能知道一个元素一定存在。布隆过滤器存在一定的失误率和删除困难的缺点。

2、缓存击穿

缓存击穿是指一个key在缓存中不存在,但是数据库中存在的情况。最常见的情况就是,一个key非常热门,在短时间有有很高的并发在请求。这时如果这个由于过期时间或者其他原因失效了,那么此时会有大量的请求会请求到数据库,可能会短时间压垮数据库。

解决方案

1、分布式互斥锁

只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完毕,重新从缓存中获取数据即可。set(key,value,timeout)
image.png

2、key永不过期

  • 在物理层面不设置热点key的过期时间
  • 从功能上,为每个value设置一个逻辑上的过期时间,当发现超过逻辑过期时间后,使用单独的线程去更新缓存。

image.png

3、两种方案对比

  • 分布式互斥锁:这种方法实现简单,但是存在一定的隐患,如果查询数据库和重建缓存的时间过长,可能会存在死锁或者线程池阻塞的风险,高并发情况下吞吐量大大降低!但是这种方法能够较好的降低后端存储负载,并在数据一致性上做的比较好。
  • **永不过期:**这种方案由于没有设置key的过期时间,其实也就不存在热点key的问题,但是会存在数据不一致的情况,且代码的复杂度会大大增大。

3、缓存雪崩

由于缓存承载了大量的请求,有效的保护了数据库。但是如果缓存由于某些原因(比如:机器宕机)或者大量的key由于超时时间相同在同一时刻失效(大批key失效/热点数据失效),大量请求直接请求到数据库中,数据库压力陡增导致系统雪崩。

解决方案

  • 可以把缓存设置成高可用的,即使个别节点、个别机器宕机,依然可以继续提供服务。利用Sentinel和Redis Cluster。
  • 采用多级缓存,本地缓存作为一级缓存,redis作为二级缓存,不同级别的缓存设置不同的过期时间,即使某级缓存失效了,还有其他级别缓存兜底。
  • 给key的过期时间附上随机值,尽量让不同的key的过期时间不同。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【手势操作-复习前一天的内容-预习今天的内容 Objective-C语言】

一、昨天呢,我们学习的是这个,事件 1.事件这一块儿呢,iOS事件,分为三大类, 1)触摸事件 2)加速计事件 3)远程控制事件 2.这个里边呢,我们主要学习的是这个触摸事件,触摸事件里边,就是Touch,touchesBegan:方法里边,有一个touches参数,它是set类型的, 3.Set,…

启动项目时出现SELinux is preventing

问题描述 启动项目时出现SELinux is preventing**** SELinux正在阻止systemd对文件AB.sevice进行读取访问。 我的是启zabbix是报该错: 最终解决方案 方法一:暂时禁用SELinux setenforce 0 方法二:禁用SELinux 在配置文件/etc/sysconfig/…

韵搜坊(全栈)-- 前后端初始化

文章目录 前端初始化后端初始化 前端初始化 使用ant design of vue 组件库 官网快速上手:https://www.antdv.com/docs/vue/getting-started-cn 安装脚手架工具 进入cmd $ npm install -g vue/cli # OR $ yarn global add vue/cli创建一个项目 $ vue create ant…

【网络安全入门】你必须要有的学习工具(附安装包)零基础入门到进阶,看这一篇就够了!

工欲善其事必先利其器 在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧! Web安全类 Web类工具主要是通过各种扫描工具,发现web站点存在的各种漏洞如sql注入、xss等。从而获取系统权限,常用的…

相同的树LeetCode

100. 相同的树 - 力扣(LeetCode100. 相同的树 - 力扣( 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 /*** Definition…

css 步骤条虚线渐变色效果实现

效果如图所示&#xff1a; 思路&#xff1a; 使用元素覆盖的方式实现视觉上虚线的效果 实现代码&#xff1a; html布局 <ul class"details-cont"><li class"details-li" v-for"item in 3" :key"item"><div class&qu…

如何从未入库的gerrit中撤销一个文件

用一个例子说明 比如有一个提交里面的default.xml的修改没有必要&#xff0c;需要从未入库的gerrit中移除 步骤如下&#xff1a; 1.做reset操作 git reset HEAD^ packages/SettingsProvider/res/values/defaults.xml 2.做checkout操作 git checkout packages/SettingsProv…

C语言leetcode刷题笔记3

C语言leetcode刷题笔记3 第8题&#xff1a;876.链表的中间结点遍历数节点个数快慢指针 第9题&#xff1a;874.比较含退格的字符串第10题&#xff1a;155.最小栈法1&#xff1a;getMin内部实现查找法2&#xff1a;getmin直接返回值补充&#xff1a;栈的使用例子优化&#xff1a;…

使用自动矢量化编译Neon

概述 作为程序员&#xff0c;你有多种方式使用 Neon 技术&#xff1a; 支持 Neon 的开源库&#xff0c;例如 Arm Compute Library提供一种最简单的方式使用 Neon编译器的自动矢量优化特性可以利用 Neon 技术自动优化你的代码Neon intrinsics内建函数&#xff0c;编译器用相应…

ArcGIS如何计算地级市间的距离

一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析工具→邻域分析→生成临近表。 计算一个或多个要素类或图层中的要素间距离和其他邻…

sCrypt受邀在中国人民大学举办《区块链与数字经济》课程讲座

4月17日&#xff0c;可一科技特邀美国sCrypt公司的开发工程师周全&#xff0c;在中国人民大学的《区块链与数字经济》课程上进行了讲座。周全讲解了区块链的分布式设计、不可篡改特性&#xff0c;以及智能合约的基本原理&#xff0c;利用“智能家居触发机制”等生动比喻&#x…

JS解密之新js加密实战(二)

前言 上次发了一篇关于新加密的&#xff0c;只解了前边两层&#xff0c;这中间家里各种事情因素影响&#xff0c;没有继续进一步研究&#xff0c;今天百忙之中抽空发布第二篇&#xff0c;关于其中的一小段加密片段&#xff0c;我认为分割成多个小片段是更容易被理解的。逻辑相…

ansible——playbook

一、playbook定义 Ansible Playbook是设定自动化任务的一种蓝图&#xff0c;可在无需人工干预或有限干预的前提下执行复杂的IT操作。Ansible Playbook对一组或一类共同构成 Ansible 清单的主机执行。 Ansible Playbook本质上是一些框架&#xff0c;是一些预先编写的代码&#x…

OrangePi Zero2 全志H616开发学习文档、基础IO蜂鸣器、超声波测距、舵机PWM基础开发

一.平台介绍 OrangePi开发板不仅仅是一款消费品&#xff0c;同时也是给任何想用技术来进行创作创新的人设计的。它是一款简单、有趣、实用的工具&#xff0c;你可以用它去打造你身边的世界。 特性 CPU 全志H616四核64位1.5GHz高性能Cortex-A53处理器GPU MaliG31MP2 Supports…

【树】简要理解树的概念

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、树的概念2、树的相关概念3、结语 1、树的概念 树是一种非线性的数据结构&#xff0c;它…

[FSCTF 2023]ez_php1

一共有三小关 第一关&#xff1a;md5加密 第二关&#xff1a;反序列化 重点 单个字符串序列化 unserialize($str) "$KEY" <?php $KEY"YES I love";echo serialize($KEY); s:10:"YES I love"; 第三关&#xff1a; 反序列化 把a的地址赋给…

【SpringBoot】 什么是springboot(二)?springboot操作mybatisPlus、swagger、thymeleaf模板

文章目录 SpringBoot第三章1、整合mybatsPlus1-234-67-10问题 2、整合pageHelper分页3、MP代码生成器1、编写yml文件2、导入依赖3、创建mp代码生成器4、生成代码5、编写配置类扫描mapper类6、编写控制器类 4、swagger1、什么是swagger2、作用3、发展历程4、一个简单的swagger项…

Hexo博客重新部署与Git配置

由于电脑重装了一次&#xff0c;发现之前Hexo与NexT主题版本过于落后&#xff0c;重新部署了下。 1 Node.js与git安装 这一块安装就不赘述了。去两个官网找安装文件安装即可。 node.js git 打开git以后配置的几个关键命令行。 git config --global user.name "你的gi…

ArcGIS水文水环境数据编辑、管理、处理与分析;ArcGIS水文分析及流域特征提取;湖泊水库水环境监测及评价;河道水污染预测与水环境容量计算等案例实践

目录 专题一 ArcGIS&#xff1a;数据管理 专题二 ArcGIS&#xff1a;数据转换 专题三 ArcGIS&#xff1a;地图制作 专题四 水文水环境数据编辑与管理 专题五 水文水环境数据处理与分析 专题六 ArcGIS水文分析及流域特征提取 专题七 湖泊水库水环境监测及评价 专题八 河…

java学习之zip炸弹攻击

一、概述 Zip炸弹是一种特殊类型的Zip文件&#xff0c;它包含了大量的无用数据。Zip文件格式允许使用压缩算法来减小文件的大小&#xff0c;但是如果Zip文件中的某些内容被重复压缩&#xff0c;就会导致文件大小急剧增加。Zip炸弹利用这个特性&#xff0c;将一些无用的数据多次…