redis的应用----缓存

redis的应用----缓存

    • 一、缓存的概念
    • 二、使用redis作为缓存
      • 2.1使用redis作为缓存的原因
      • 2.2缓存机制的访问步骤
    • 三、缓存的更新策略
      • 3.1定期更新
      • 3.2实时更新
      • 3.3淘汰策略
    • 四、缓存常见的问题
      • 4.1缓存预热(Cache preheating)
      • 4.2缓存穿透(Cache penetration)
      • 4.3缓存雪崩(Cache avalanche)
      • 4.4缓存击穿(Cache breakdown)

一、缓存的概念

缓存(Cache)是一种存储机制,旨在提供高速访问已保存的数据或计算结果。通过将数据存储在临时存储位置,当再次需要这些数据时,可以迅速从缓存中检索,而不是重新进行原始数据的获取和计算过程。缓存可以存在于各种层次,如硬件,CPU缓存、软件(如Web浏览器缓存)和专门的存储系统(如内存中的分布式缓存)‌

举例说明

比如我们需要去⾼铁站坐高铁,我们知道坐⾼铁是需要反复刷身份证的 (进⼊⾼铁站,检票,车,乘车过程中,出站…). 正常来说,我们的⾝份证是放在⽪箱⾥的(⽪箱的存储空间大,足够能装). 但是每次刷⾝份证都需要开⼀次⽪箱找⾝份证, 就非常不方便. 因此我就可以把身份证先放到⾐服⼝袋⾥. ⼝袋虽然空间小, 但是访问速度比皮箱快很多. 这样的话每次刷身份证我只需要从⼝袋⾥掏⾝份证就行了, 就不必开⽪箱了. 此时 “口袋” 就是 “皮箱” 的缓存. 使⽤缓存能够大大提高访问效率

对于计算机硬件来说, 往往访问速度越快的设备, 成本越高, 存储空间越小. 缓存是更快, 但是空间上往往是不⾜的. 因此⼤部分的时候, 缓存只放⼀些 热点数据 (访问频繁的数据), 就非常有用了

二、使用redis作为缓存

2.1使用redis作为缓存的原因

在⼀个⽹站中, 我们经常会使⽤关系型数据库 (⽐如 MySQL) 来存储数据. 关系型数据库虽然功能强⼤, 但是有⼀个很⼤的缺陷, 就是性能不⾼. (换⽽⾔之, 进⾏⼀次查询操作消耗的系统资源较多)

为什么说关系型数据库性能不⾼?

数据库把数据存储在硬盘上,硬盘的 IO 速度并不快,尤其是随机访问,如果查询不能命中索引,就需要进⾏表的遍历,这就会⼤⼤增加硬盘 IO 次数。关系型数据库对于 SQL 的执⾏会做⼀系列的解析,校验,优化⼯作, 如果是⼀些复杂查询,⽐如联合查询,需要进⾏笛卡尔积操作,效率更是降低很多

因此, 如果访问数据库的并发量⽐较⾼, 对于数据库的压⼒是很⼤的, 很容易就会使数据库服务器宕机

为什么并发量⾼了就会宕机?

服务器每次处理⼀个请求, 都是需要消耗⼀定的硬件资源的. 所谓的硬件资源包括不限于 CPU, 内存, 硬盘, ⽹络带宽…

⼀个服务器的硬件资源本⾝是有限的,⼀个请求消耗⼀份资源,请求多了,⾃然把资源就耗尽了,后续的请求没有资源可⽤,⾃然就⽆法正确处理。更严重的还会导致服务器程序的代码出现崩溃

如何让数据库能够承担更⼤的并发量呢?

  1. 开源: 引⼊更多的机器,部署更多的数据库实例,构成数据库集群(主从复制, 分库分表等…)

  2. 节流: 引⼊缓存,使⽤其他的⽅式保存经常访问的热点数据,从⽽降低直接访问数据库的请求数量

一般情况下,这两种方案都是搭配使用的

为什么使用redis作为缓存?

Redis 访问速度⽐关系型数据库 (⽐如 MySQL) 快很多,或者说处理同⼀个访问请求,Redis 消耗的系统资源⽐MySQL少很多,因此 Redis 能⽀持的并发量更⼤,Redis 数据在内存中, 访问内存⽐硬盘快很多,Redis 只是⽀持简单的 key-value 存储,不涉及复杂查询的那么多限制规则

2.2缓存机制的访问步骤

  1. 客⼾端访问业务服务器,发起查询请求

  2. 业务服务器先查询Redis,看想要的数据是否在Redis中存在

  3. 如果已经在Redis中存在了,就直接返回,此时不必访问MySQL了

  4. 如果Redis中不存在,再查询 MySQL

在这里插入图片描述

理论上,一般只需要在 Redis 中放 20% 的热点数据,就可以使 80% 的请求不再真正查询数据库了。当然,实践中究竟是 “⼆⼋”, 还是 “⼀九”, 还是 “三七”, 这个情况可能会根据业务场景的不同,存在差异,但是⾄少绝⼤多数情况下,使⽤缓存都能够⼤⼤提升整体的访问效率降低数据库的压⼒

注意:缓存是⽤来加快 “读操作” 的速度的. 如果是 “写操作”, 还是要⽼⽼实实写数据库, 缓存并不能提⾼性能

三、缓存的更新策略

根据网络中的梗我们就能够知道,哪些是热点数据,哪些非热点的数据,那么缓存是怎么区分的呢?这时就引入了更新策略

3.1定期更新

每隔⼀定的周期(⽐如⼀天/⼀周/⼀个⽉),对于访问的数据频次进⾏统计,挑选出访问频次最⾼的前 N% 的数据

以搜索引擎为例进行说明

⽤⼾在搜索引擎中会输⼊⼀个 “查询词”, 有些词是属于⾼频的, ⼤家都爱搜(鲜花, 蛋糕, 同城交友…),有些词就属于低频的,⼤家很少搜索的。搜索引擎的服务器会把哪个⽤⼾什么时间搜了啥词,都通过⽇志的⽅式记录的明明⽩⽩,然后每隔⼀段时间对这期间的搜索结果进⾏统计 (⽇志的数量可能⾮常巨⼤,这个统计的过程可能需要使⽤ hadoop 或者 spark 等⽅式完成),从⽽就可以得到 “⾼频词表”

但是这种方式实时性非常的低,对于一些突发情况处理起来不是很好,比如春节时经常出现的春节晚会,这就属于突然出现的高频词

3.2实时更新

先给缓存设定容量上限(可以通过 Redis 配置⽂件的maxmemory参数设定),此时的查询步骤为:

  • 如果在 Redis 查到了, 就直接返回.

  • 如果 Redis 中不存在, 就从数据库查, 把查到的结果同时也写⼊ Redis中

  • 如果缓存已经满了(达到上限),就触发缓存淘汰策略,把⼀些 “相对不那么热⻔” 的数据淘汰掉,按照上述过程,持续⼀段时间之后 Redis 内部的数据⾃然就是 “热⻔数据” 了

3.3淘汰策略

下列策略并⾮局限于 Redis, 其他缓存也可以按这些策略展开:

  • FIFO (First In First Out) 先进先出:把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉
  • LRU (Least Recently Used) 淘汰最久未使⽤的:记录每个 key 的最近访问时间. 把最近访问时间最⽼的 key 淘汰掉
  • LFU (Least Frequently Used) 淘汰访问次数最少的:记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉
  • Random 随机淘汰:从所有的 key 中抽取幸运⼉被随机淘汰掉

这⾥的淘汰策略, 我们可以⾃⼰实现. 当然 Redis 也提供了内置的淘汰策略, 也可以供我们直接使⽤

Redis 内置的淘汰策略如下:

  • volatile-lru:当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中使⽤LRU(最近最少使⽤)算法进⾏淘汰
  • allkeys-lru:当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LRU(最近最少使⽤)算法进⾏淘汰
  • volatile-lfu:4.0版本新增,当内存不⾜以容纳新写⼊数据时,在过期的key中,使⽤LFU算法进⾏删除key
  • allkeys-lfu:4.0版本新增,当内存不⾜以容纳新写⼊数据时,从所有key中使⽤LFU算法进⾏淘汰
  • volatile-random:当内存不⾜以容纳新写⼊数据时,从设置了过期时间的key中,随机淘汰数据.
  • allkeys-random:当内存不⾜以容纳新写⼊数据时,从所有key中随机淘汰数据.
  • volatile-ttl:在设置了过期时间的key中,根据过期时间进⾏淘汰,越早过期的优先被淘汰. (相当于 FIFO, 只不过是局限于过期的 key)
  • noeviction:默认策略,当内存不⾜以容纳新写⼊数据时,新写⼊操作会报错

整体来说 Redis 提供的策略和我们上述介绍的通⽤策略是基本⼀致的,只不过 Redis 这⾥会针对 “过期 key” 和 “全部 key” 做分别处理

四、缓存常见的问题

4.1缓存预热(Cache preheating)

使⽤ Redis 作为 MySQL 的缓存的时候,当 Redis 刚刚启动,或者 Redis ⼤批 key 失效之后,此时由于Redis⾃⾝相当于是空着的,没啥缓存数据,那么 MySQL 就可能直接被访问到,从⽽造成较⼤的压⼒,因此就需要提前把热点数据准备好, 直接写⼊到 Redis 中,使 Redis 可以尽快为 MySQL 撑起保护伞

热点数据可以基于之前介绍的统计的⽅式⽣成即可. 这份热点数据不⼀定⾮得那么 “准确”, 只要能帮助 MySQL 抵挡⼤部分请求即可. 随着程序运⾏的推移, 缓存的热点数据会逐渐⾃动调整, 来更适应当前情况

4.2缓存穿透(Cache penetration)

什么是缓存穿透?

访问的 key 在 Redis 和 数据库中都不存在,此时这样的 key 不会被放到缓存上, 后续如果仍然在访问该 key,依然会访问到数据库,这就会导致数据库承担的请求太多, 压⼒很⼤

为什么会产生缓存穿透?

  1. 业务设计不合理. ⽐如缺少必要的参数校验环节, 导致⾮法的 key 也被进⾏查询了
  2. 开发/运维误操作. 不⼩⼼把部分数据从数据库上误删了
  3. ⿊客恶意攻击

解决方案

  1. 针对要查询的参数进⾏严格的合法性校验. ⽐如要查询的 key 是⽤⼾的⼿机号, 那么就需要校验当前 key 是否满⾜⼀个合法的⼿机号的格式
  2. 针对数据库上也不存在的 key , 也存储到 Redis 中, ⽐如 value 就随便设成⼀个 “”. 避免后续频繁访问数据库
  3. 使⽤布隆过滤器先判定 key 是否存在, 再真正查询

将数据库中的能够唯一标识某个数据保存在布隆过滤器中,当我们需要查找某个key的时候,就先到布隆过滤器中查询,如果存在那就去数据库中查找,如果不存在,那就直接返回了,不去数据库中查找了。

4.3缓存雪崩(Cache avalanche)

什么是缓存雪崩?

短时间内⼤量的 key 在缓存上失效, 导致数据库压⼒骤增, 甚⾄直接宕机,比如:本来 Redis 是 MySQL 的⼀个护盾,帮 MySQL 抵挡了很多外部的压⼒. ⼀旦护盾突然失效了, MySQL ⾃⾝承担的压⼒骤增, 就可能直接崩溃

为什么会产生缓存雪崩?

  1. Redis服务器挂了
  2. Redis 上的⼤量的 key 同时过期

redis中key同时过期的情况一般是由于某一时间段内redis存储了大量的key,并设置了相同的过期时间

解决方案

  1. 部署⾼可⽤的 Redis 集群, 并且完善监控报警体系
  2. 不给 key 设置过期时间 或者 设置过期时间的时候添加随机时间因⼦,避免大量key过期时间一样

4.4缓存击穿(Cache breakdown)

什么是缓存击穿?

当前key是一个热点key(例如一个秒杀活动),并发量非常大,重建缓存不能在短时间完成,可能是一个复杂计算,例如复杂的SQL、多次IO、多个依赖等。 在缓存失效的瞬间,有大量线程来重建缓存,造成后端负载加大,甚至可能会让应用崩溃

解决方案

  1. 基于统计的⽅式发现热点 key, 并设置永不过期
  2. 进⾏必要的服务降级. 例如访问数据库的时候使⽤分布式锁, 限制同时请求数据库的并发数

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

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

相关文章

2025年Java面试八股文大全

很多人会问Java面试八股文有必要背吗? 我的回答是:很有必要。你可以讨厌这模式,但你一定要去背,因为不背你就进不了大厂。 国内的互联网面试,恐怕是现存的、最接近科举考试的制度。 而且,我国的八股文确…

JiaJia-CP-1,2,3的WP(2)

一.JiaJia-CP-2 一看题目,聊天软件,用的什么聊天软件直接userassist看运行过什么程序 vol -f JiaJia_Co.raw --profileWin7SP1x64 userassist 发现Telegram.exe(小飞机) 可能性很大啊(真是个摸鱼大神) 除此之外,filescan也能看到&#xff0…

小F的矩阵值调整

问题描述 小F得到了一个矩阵。如果矩阵中某一个格子的值是偶数,则该值变为它的三倍;如果是奇数,则保持不变。小F想知道调整后的矩阵是什么样子的。 测试样例 样例1: 输入:a [[1, 2, 3], [4, 5, 6]] 输出&#xff1a…

Docker Buildx 与 CNB 多平台构建实践

一、Docker Buildx 功能介绍 docker buildx 是 Docker 提供的一个增强版构建工具,支持更强大的构建功能,特别是在构建多平台镜像和高效处理复杂 Docker 镜像方面。 1.1 主要功能 多平台构建支持 使用 docker buildx,可以在单台设备上构建…

uni-app 使用笔记

1.缓存用法 (1)uni-app 存值取值删除 官网:https://uniapp.dcloud.net.cn/api/storage/storage.html#setstorage 存值 uni.setStorageSync(storage_key, hello);取值 uni.getStorageSync(storage_key)删除 uni.removeStorageSync(storag…

Unity的GPU Instancing技术

首先新建一个场景,添加一个相机,并创建一个Render Texture给相机。 然后在相机上挂载以下脚本TestBatches ,同时脚本的Inspector面板的Mesh中选择Cube,另外创建一个新的材质拖动给mat: public class TestBatches : M…

你真的会用饼图吗?JVS-智能BI饼图组件深度解析

在数据可视化的世界里,饼图是我们常见的一种可视化图形。在JVS-智能BI中提供了数据可视化饼图组件,接下来我通过这篇文章详细介绍,从配色方案到图形配置,从显示数据到提示信息,饼图的每一个细节配置。 饼图类图表概述…

IOS ARKit进行图像识别

先讲一下基础控涧,资源的话可以留言,抽空我把它传到GitHub上,这里没写收积分,竟然充值才能下载,我下载也要充值,牛! ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…

golang debug调试

1. 本地调试 1:Add Configurations 添加配置文件(Run kind :Directory) 2:进入run运行窗口 3:debug断点调试模式 1. Resume Program (继续运行) 图标: ▶️ 或 ► 快捷键: F9(Windows/Linux&a…

联想YOGA Pro 14s至尊版电脑找不到独立显卡(N卡)问题,也无法安装驱动的问题

问题描述 电脑是联想YOGA Pro 14s至尊版,电脑上装的独立显卡是4060,一直是能够使用独立显卡的。然而有两次突然就找不到显卡了,NVIDIA CONTROL PANEL也消失了,而且也无法安装驱动。具体表现如下: 无法连接外接显示器…

Python酷库之旅-第三方库Pandas(250)

目录 一、用法精讲 1181、pandas.tseries.offsets.BusinessMonthEnd.is_on_offset方法 1181-1、语法 1181-2、参数 1181-3、功能 1181-4、返回值 1181-5、说明 1181-6、用法 1181-6-1、数据准备 1181-6-2、代码示例 1181-6-3、结果输出 1182、pandas.tseries.offse…

【机器学习】机器学习的基本分类-监督学习-逻辑回归-Sigmoid 函数

Sigmoid 函数是一种常用的激活函数,尤其在神经网络和逻辑回归中扮演重要角色。它将输入的实数映射到区间 (0, 1),形状类似于字母 "S"。 1. 定义与公式 Sigmoid 函数的公式为: 特点 输出范围:(0, 1),适合用…

点云处理中obb算法原理和法向量求解方法

主要数学原理PCA PCA(Principal Component Analysis,主成分分析)是数据分析中的一种重要技术,通过它可以将高维数据投影到低维空间,找到数据的主要结构。在点云分析中,PCA 可以帮助我们提取点云数据中的主…

四:工具、环境准备-compute node

一:工具、环境准备-controller node 二:OpenStack环境准备-controller node 三:安装服务-controller node 四:工具、环境准备-compute node 五:OpenStack环境准备-compute node 六:安装服务-compute node 七…

力扣1382:将二叉搜索树便平衡

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。 如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二…

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…

微信小程序Webview与H5通信

背景 近期有个微信小程序需要用到web-view嵌套H5的场景,该应用场景需要小程序中频繁传递数据到H5进行渲染,且需要保证页面不刷新。 由于微信小程序与H5之间的通信限制比较大,显然无法满足于我的业务场景 探索 由于微信小程序与webview的环境是…

18. C++STL 4(vector的使用, 空间增长, 迭代器失效详解)

⭐本篇重点:vector容器的使用详解 ⭐本篇代码:c学习/08.vector_test 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) 目录 一. vector的介绍 二. vector的使用 2.1 vector的定义 * 2.2 vector的迭代器和遍历 a operator[]访问 b vect…

NAT拓展

NAT ALG(NAT应用级网) 为某些应用层协议,因为其报文内容可能携带IP相关信息,而普通NAT转化无法将这些IP转化,从而导致协议无法正常运行 例如FTP,DHCP,RSTP,ICMP,IPSEC…

私有库gitea安装

一 gitea是什么 Gitea是一款自助Git服务,简单来说,就是可以一个私有的github。 搭建很容易。 Gitea依赖于Git。 类似Gitea的还有GitHub、Gitee、GitLab等。 以下是安装步骤。 二 安装sqilite 参考: 在windows上安装sqlite 三 安装git…