Redis的缓存问题

news2024/10/6 2:26:30

        说起Redis的缓存,我们知道前端发出的请求到后端,后端先从Redis中查询,如果查询到了则直接返回,如果Redis中未查询到,就去数据库中查询,如果数据库中存在,则返回结果并且更新到Redis缓存当中,如果数据库中都没有,则返回空结果。流程如下:

 

1.缓存穿透

        假设有一条数据,数据库根本就不存在,比如查询id为-1的数据,如果前端查询id为-1的请求发过来,Redis中没有,又会去数据库中查询,这样的话,如果有人恶意攻击(比如利用测试软件瞬间大量的发出此种请求),数据库就有可能会崩掉,这就是缓存穿透。

解决办法:

  • 对参数进行校验,不合法参数直接拦截。

  • 既然在数据库中查不到,对此种请求我们设置一个空对象放到Redsi中,设置一个较短的过期时间。

2.缓存击穿

        假设此时某一个热点key即将过期了,在刚好过期的这个时间结点,若有大量的访问此热点数据的请求并发发送过来(比如淘宝单点秒杀),Redis中查询不到,又会一瞬间的同时访问数据库,也可能瞬间会将数据库搞崩。

解决办法:

  • 对热点key设置为永不过期(对内存不友好)。

  • 加互斥锁,第一个请求到来先占用此锁,此时其他请求过来拿不到,等第一个请求从数据库查询的结果返回并且存放到Redis中,其余的请求再来访问(即会从Redis中快速拿到数据)。

3.缓存雪崩

        假设此时正在处于淘宝秒杀的时间段,在高并发的情况下,如果此时大量的缓存失效,或者缓存层出现故障,所有的请求也同时访问数据库,也可能会造成数据库崩掉的状况。

解决办法:

  • 随机设置过期时间。

  • 不设置过期时间。

  • 若是集群部署,将热点数据分散到多台Redis服务器当中。

4.缓存总结

        穿透是redis里不存在这个缓存key;击穿是redis某一个热点 key 突然失效,雪崩是大面积的key缓存失效;最终的受害者都是数据库。

5.对于Redis 宕机这种情况我们应该怎么解决:

  • 事发前:实现 Redis 的高可用(主从架构+哨兵),尽量避免 Redis 挂掉这种情况发生。

  • 事发中:万一Redis 真的挂了,我们可以设置本地缓存(ehcache)+限流,尽量避免我们的数据库崩掉(虽然访问慢一些,但起码能保证我们的服务还是能正常工作的) 。

  • 事发后:redis 持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

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

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

相关文章

西贝柳斯Sibelius2023旗舰版曲谱大师必备音乐软件

乐谱太复杂,打起来太费时间?革命性的省时功能,如磁性布局和动态分谱,能够快速创作复杂的乐谱。音色库太简陋,找起来麻烦?收藏丰富的音色库供您直接使用,涵盖最广泛的专业级乐器,支持…

RK3399/RK3588+pcie+Zynq 多核架构可穿戴设备设计方案

在很多领域,人们对可穿戴设备的可靠性有着非常高的要求。这些使用场景 不仅丰富多样,而且复杂多变。这使得可穿戴设备不仅需要应对应用和系统本身 的状态变化,也要考虑到设备所处环境所带来的异常情况。所以,针对不同安全 等级…

Windows搭建SVN环境

VisualSVN Server下载 https://www.visualsvn.com/products VisualSVN Server安装创建仓库创建项目创建用户创建组项目分配组VisualSVN下载 https://www.visualsvn.com/products VisualSVN安装项目检出项目检出路径:https://changwq:8443/svn/dev/InterfaceManage 项…

【C++初阶】类和对象(上)

文章目录 前言一、类的引入二、类的定义三、类的访问限定符及封装四、类的作用域五、类的实例化六、类对象模型七、this指针 前言 📖面向过程 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。以…

linux之Ubuntu系列(-)常见指令

Ubuntu 中文 版本 注意点 通过修改语言改成英文 在终端录入:export LANGen_US 在终端录入:xdg-user-dirs-gtk-update 单用户和多用户 命令格式 command [-选项] [参数] –查看命令的帮助 命令 --help man 命令 |操作键| 功能| |空格键|-显示手册的下…

[LINUX]之字符串去掉前后空格

去掉字符串前后空格通过使用awk $1$1命令实现 echo " test " | awk $1$1

Vulnhub: Momentum: 1靶机

kali:192.168.111.111 靶机:192.168.111.154 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.154 查看目标80端口的main.js发现信息 feroxbuster -k -d 1 --url http://192.168.111.154 -w /opt/zidian/SecLists-202…

白名单配置

白名单配置 关于如何将github-copilot 相关地址设置到白名单中 domain:githubusercontent.com, domain:example-example.com, domain:example-example2.com 选择配置 绕过白名单 结尾 记录自己点点滴滴,学习总结

二叉树题目:二叉树的最大深度

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:二叉树的最大深度 出处:104. 二叉树的最大深度 难度 3 级 题目描述 要求 给定一个二叉树&#xff…

(ceph)CephFS 文件系统 MDS接口

创建 CephFS 文件系统 MDS 接口 //服务端操作 1)在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032)查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 systemctl status cep…

定时器处理非活动连接(五)

1 基础知识 非活跃,是指客户端(这里是浏览器)与服务器端建立连接后,长时间不交换数据,一直占用服务器端的文件描述符,导致连接资源的浪费。 非活跃,是指固定一段时间之后触发某段代码&#xf…

学习率的选择

学会画图去看学习率是否符合 梯度下降算法收敛所需要的迭代次数根据模型的不同而不同,我们不能提前预知,我们可以绘制迭代次数和代价函数的值的图表来观测算法在何时趋于收敛。 -自动测试方法 也有一些自动测试是否收敛的方法,例如将代价函数…

python_day9_继承

继承 单继承 class Phone:id Noneproducer "HW"def call_4g(self):print("4g通话")class Phone2023(Phone):face_id "1001"def call_45g(self):print("4.5g")phone Phone2023() print(phone.producer) phone.call_4g() phone.ca…

Leetcode-每日一题【109.有序链表转换二叉搜索树】

题目 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9]输出: [0,-3,9,-…

【Linux基础】gcc编译器

(꒪ꇴ꒪ ),hello我是祐言博客主页:C语言基础,Linux基础,软件配置领域博主🌍快上🚘,一起学习!送给读者的一句鸡汤🤔:集中起来的意志可以击穿顽石!作者水平很有限,如果发现错误&#x…

【IMX6ULL - psplash应用】修改uboot启动阶段的背景颜色

文件路径:psplash/psplash-colors.h 修改框起来的这两个宏定义就可以改变底部颜色了,参数代表是RGB的16进制颜色

Linux 支持 U盘 NTFS 文件系统格式

Linux 支持 U盘 NTFS 文件系统格式 1、在线(可以连接外网)方式: 1.1、RHEL/CentOS/Anolis/openEuler yum install ntfs-3g1.2、Debian/Ubuntu/Deepin apt install ntfs-3g2、离线方式 下载 ntfs-3g 安装包,离线环境安装 ntfs…

算法通关村第一关--链表青铜挑战笔记

算法通关村第一关–链表青铜挑战笔记 开始时间:2023年7月16日20:45:26 链表 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针&#x…

解决通过request.getParam()方法获取到的值为null的问题~

我们想获取前端表单提交的数据,并在控制台输出,但如下所示控制台输出的值均为null 原因在于: 表单中的name与getParam方法中名称不一致的问题 如下所示为表单内容: 而在getParam方法中我们是根据username和password获取的&#…

【LLM】Langchain使用[四](评估、代理)

note 评估目的:检验LLM是否达到验收标准;分析改动对于LLM应用性能的影响 思路:利用语言模型和链,辅助评估 代理: 代理能方便地将LLM连接自己的信息来源(数据)、API等PythonREPLTool工具&#x…