Redis 常见缓存问题与解决方案

news2025/1/16 20:01:36

文章目录

    • 1. 缓存穿透
      • 解决方法
    • 2. 缓存击穿
      • 解决方法
    • 3. 缓存雪崩
      • 解决方法

 在 redis 的应用场景中,需要考虑缓存在某些场景下可能出现的问题:

  • 缓存穿透

  • 缓存击穿

  • 缓存雪崩

 以下缓存问题的讨论都是基于以下应用架构讨论的:

1. 缓存穿透

 对应的数据在数据源中并不存在,每次针对此数据的请求从缓存获取不到,请求都会落到数据源,从而给数据源带来巨大的负载。即恶意请求穿透了缓存,落到了数据源,使得 redis 的数据缓存作用失效。

比如用一个不存在的用户 ID 获取用户信息,无论是缓存还是数据库都没有,黑客利用此漏洞进行攻击可能压垮数据库。

解决方法

  1. 缓存空结果。即使 redis 和数据源都不存在该资源,就将请求的数据作为空结果缓存一段时间,且为该数据设置一个较短的过期时间,否则数据的时效性会产生问题;

  2. 检验用户的合法性。对用户请求的合法性进行校验,对重复恶意的请求进行拦截(记录恶意用户或恶意 IP);

  3. 布隆过滤器。布隆过滤器的用途为帮助判断某个值是否存在。布隆过滤器的原理是使用一个 bitmap 数组用作标记,使用多个哈希函数对 key 值进行计算,并将计算值对应的位置在 bitmap 中进行置位,表示该 key 存在:

 布隆过滤器仍存在一定误判的可能性(每个函数计算值都与存在值哈希冲突),但仍可帮助拦截一部分不存在的数据。减少误判的方法:
  1. 增加 bitmap 的程度;

  2. 增加使用的哈希函数


2. 缓存击穿

 即针对某一 特定 数据发起大量并发请求,当该数据在 redis 中过期时,这些请求会导致应用同时发起从数据源加载数据的请求,这时集中的大量并发请求可能会瞬间给数据源带来巨大负载。

解决方法

  1. 设置热点数据永不过期。可以设置定期任务,定期更新热点数据的 expire time;

  2. 使用互斥锁。即使用互斥锁保证只有一个请求会从数据源加载数据,操作逻辑如下:在缓存失效(取出值判断为控股)时,先尝试获取分布式锁:

    • 若获取成功,则发起从数据源加载数据的请求;

    • 若获取失败,则休眠一段时间后,尝试重新获取数据
       此方法的缺点在于会对吞吐量造成影响。



3. 缓存雪崩

 即某个时刻 redis 中的热点数据都消失了(缓存服务器重启或大量数据集中在某个时间段失效),这时也会导致应用从数据源加载数据,给数据源带来很大压力。

解决方法

  1. 保持缓存的高可用性。使用 Redis 哨兵模式或建立 Redis 集群,即使个别节点下线,整个缓存层依然可用;

  2. 缓存永不过期。Redis 中保存的 key 永不失效,这一就能解决大量缓存同时失效的问题,但随之而来的就是 Redis 需要更多存储空间;

  3. 设置随机过期时间。为每个数据设置随机的失效时间,避免

  4. 使用互斥锁重建缓存。即使用互斥锁避免大量的请求到达数据源查询数据,该方法同样会影响高并发场景下的吞吐量。

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

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

相关文章

Python 中的字典顺序

文章目录 Python 中的字典顺序在 Python 中将数字列表按词典顺序排序 我们将介绍 Python 中的字典顺序。 我们还将通过示例讨论实现词典顺序的不同方法。 Python 中的字典顺序 在数学中,词典顺序或词典顺序是对按字母顺序排列的元素列表或元素数组进行排序的过程。…

Java学习之Swing图形界面

Java提供的Swing组件众多,下面列举其中的几种,本章主要讲解顶层容器,其余容器在下面几章会做讲解。 1、顶层容器 1)顶层容器就是不包含在其他容器中的容器,Swing中常见的顶层容器有JFrame,JFrame被称为窗口…

分享78个C 源码,总有一款适合您

C 源码 分享78个C 源码,总有一款适合您 源码下载链接:https://pan.baidu.com/s/1_vslGj8XQUGbUhQFnKZg4g?pwdoe87 提取码:oe87 OpenCV计算机视觉库 v4.7.0 OpenCV计算机视觉库 v3.4.19 Photoflare图像编辑器v1.6.12 开源向量数据库mil…

Lecture 13(Extra Material):PPO

On-policy v.s.Off-policy On-policy: The agent learned and the agent interacting with the environment is the same.Off-policy: The agent learned and the agent interacting with the environment is different. Issue of Importance Sampling: 尽管q可以是任意的&am…

day43—编程题

文章目录 1.第一题1.1题目1.2思路1.3解题 2.第二题2.1题目2.2思路2.3解题 1.第一题 1.1题目 描述: 输入两个整数 n 和 m,从数列1,2,3…n 中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来 输入描述: 每个测试输入包…

Java 基础进阶篇(十二)—— Stream 流常用方法总结

文章目录 一、Stream流概述二、获取Stream流2.1 集合获取 Stream 流2.2 数组获取 Stream 流 三、中间方法四、终结方法五、Stream流的综合应用六、收集Stream流 一、Stream流概述 Stream 流是在 Java8 中,得益于 Lambda 所带来的函数式编程, 引入了一个…

前端技术——css

1.CSS的引入 【1】为什么要学习CSS? 如果只用HEML画页面的话--->这个页面就是页面上需要的元素罗列起来,但是页面效果很差,不好看,为了让页面好看,为了修饰页面。所以我们需要用到CSS。 CSS的作用:修饰HTML页面…

总结844

学习目标: 月目标:5月(张宇强化前10讲,背诵15篇短文,熟词僻义300词基础词) 周目标:张宇强化前3讲并完成相应的习题并记录,英语背3篇文章并回诵 每日必复习(5分钟&#…

密码学:流密码.(对称密码)

密码学:流密码. 流密码(Stream Cipher)属于对称密码算法中的一种,其基本特征是加解密双方使用一串与明文长度相同的密钥流,与明文流组合来进行加解密密钥流通常是由某一确定状态的伪随机数发生器所产生的比特流,双方将伪随机数生…

数据结构-二叉树遍历线索二叉树

目录 一、二叉树的定义 *几种特殊的二叉树 *二、二叉树的性质 三、二叉树的存储结构 *四、二叉树的遍历 *4.1先序遍历 * 4.2中序遍历 * 4.3后序遍历 非递归算法遍历 *4.4层序遍历 *五、遍历序列构造二叉树 六、线索二叉树 6.1逻辑结构: * 6.2构造线索二叉树 一、二…

Mybatis Plus | 快速入门

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Mybatis Plus MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改…

Qt 多语言界面设计概述

1、多语言界面设计概述 有些软件需要开发多语言界面版本,如中文版和英文版,并且在软件里可以方便地切换界面语言。Qt 为多语言界面提供了很好的支持,使用 Qt 的一些规则和工具,可以很方便地为应用程序开发提供多语言界面支持。 …

Shell脚本函数简介及运用(喜欢,适合,能在一起,是三码事)

一、函数的作用 语句块定义成函数约等于别名,定义函数,再引用函数 封装的可重复利用的具有特定功能的代码 二、定义函数 定义函数就是只将一段实现某个任务的命令序列封装进一个函数,便于使用和后期维护。 function 函数名() { 命令序列 }…

快速原型设计工具(Axure)的安装、汉化

〇、一些名词解释: 1. 草图 一般主要用于产品整理思路,寻找灵感,或者在产品团队内部互相讨论碰撞火花时使用。画 给自己看的,想怎么画就怎么画。 2. 低保真 打个比喻来说就像,用于“生产的图纸”,要简单易读…

Postgres:Win/Linux环境安装及一键部署脚本

1.Win安装Postgres (1)下载安装包 (2)开始安装 修改安装目录 选择要安装的组件 data也就是库表及数据的.dba文件存放目录 密码设置 端口设置 next next 开始安装 安装完成,Stack Builder 根据需要选择是否安装。仅仅是…

03-Docker容器命令

新建启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用的参数: --namenew_name:为容器指定一个名称-d:后台运行容器并返回容器ID,即启动守护式容器-i:以交互模式(interactive)运行…

【三十天精通Vue 3】第二十九天 Vue 3中的Mock数据模拟详解

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、Mock数据模拟的概述1.1 为什么需要Mock数据模拟?1.2 Mock数据模拟的优点和缺点二、安装和配置Mock.js库2.1 使用NPM安…

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法

TIA博途Wincc通过区域指针中的作业信箱功能实现自动写入配方数据的具体方法 前面和大家分享了博途Wincc中配方功能的具体使用方法,具体内容可参考以下链接中的内容: TIA博途Wincc中自定义配方画面的具体方法示例 上面的例子中,向PLC写入数据时是通过点击屏幕上的按钮来实现…

scrapy爬虫标准流程

Scrapy爬虫的标准流程一般包括以下几个步骤: 1、明确需求和目标网站的结构,确定需要爬取的数据以及爬取规则。 2、创建一个Scrapy项目,使用命令行工具创建一个新的Scrapy项目。 3、定义数据模型和item,即确定要爬取的数据结构。…

基于SpringBoot开发的仓库管理系统

系统概要 仓库管理系统总共分为两个大的模块,分别是系统模块和业务模块。其中系统模块和业务模块底下又有其子模块。 功能模块 一、业务模块 1、客户管理 客户列表 客户分页和模糊查询 客户添加、修改、删除、批量删除 2、供应商管理 供应商列表 供应商分…