Redis应用缓存

news2024/11/26 0:23:41

目录

前言

关于“二八定律” 

使用Redis作为缓存

为什么关系型数据库性能不高

为什么并发量高了就容易宕机

Redis就是一个用来作为数据库缓存的常见方案

缓存更新策略 

定期生成 

搜索引擎为例 

实时生成

淘汰策略

FIFO(First In First Out) 先进先出 

lRU(Least Recently Used) 淘汰最久未使用的

LFU(Least Frequently Used) 淘汰访问次数最少的 

Ramdom 随机淘汰

 Redis内置淘汰策略 

缓存预热、缓存穿透、缓存雪崩、缓存击穿

缓存预热 

缓存穿透

产生的原因可能有以下几种

解决方式 

 缓存雪崩

产生的原因可能有以下几种

为什么会出现大量的key同时过期? 

如何解决

缓存击穿 

如何解决


前言

缓存(cache)是计算机中的一个经典的概念,在很多场景中都会涉及到

核心思路就是把一些常用的数据放到触手可及(访问速度更快)的地方,方便读取

举个例子:

比如我去坐动车,那么我会选择将我的身份证放在口袋里,而不是我的背包中的某个夹层中

虽然我的口袋小,但是掏出来很快,并且在坐动车时身份证的使用还是比较频繁的~~

此时口袋就是背包的缓存

 这里的速度快,是一种相对的快的概念~

通常情况下,OS对于硬件的访问速度是这样的:

CPU寄存器 > 内存 > 硬盘 > 网络

那么相对于网络,硬盘反倒是显得很快

而对于硬盘来说内存又更加的快~~

  • 对于计算机硬件来说,往往越快的设备,价格越高昂,空间越小
  • 即缓存虽然很快,但是空间往往是不足的,因此大部分时候,缓存只能存放一些热点数据

热点数据:频繁访问的数据 

关于“二八定律” 

即百分之 20 的数据,能够应对 百分之80 的访问场景

所以只需要将这少量的热点数据缓存起来,就能够应对百分之80的业务场景,从而在整体上有明显的性能提升

使用Redis作为缓存

在一个网站中经常会使用MySQL关系型数据库,来存储数据

关系型数据库虽然很强大,但是有一个很大的缺点,就是性能不高,即每一次查询的系统资源消耗高

为什么关系型数据库性能不高

  •  数据库把数据存储在硬盘上,硬盘上的IO速度并不快,尤其是随机访问
  • 如果查询不能命中索引,就需要进行表的遍历,会大大增加硬盘的IO次数
  • 关系型数据库对于SQL的执行会做一系列的解析,校验,优化工作
  • 如果是一些复杂的查询,比如联合查询,就需要进行笛卡尔积操作,效率更是低
  • 事务处理和数据一致性:关系型数据库支持事务的原子性、一致性、隔离性和持久性(ACID)要求,这需要对数据进行更多的处理和管理,对性能产生一定的影响。

因此如果访问数据库的并发量高,那么数据库的压力很大的,很容易就宕机了~~

为什么并发量高了就容易宕机

服务器每处理一个请求,都是需要消耗一定的硬件资源,cpu、内存、硬盘、网络带宽....

一个服务器的硬件资源本身就是有限的。一个请求就会消耗一份资源,当资源耗尽。后续的请求没有资源可用,那么就无法正确的处理,更严重的还会导致服务器程序的代码出现崩溃

 那么如何让数据库能够承受更大的并发量呢?

  1. 开源:引入更多机器,部署更多数据库实例,构成数据库集群
  2. 节流:引入缓存,使用其他方式保存经常访问的热点数据,从而降低直接访问数据库的请求数量
Redis就是一个用来作为数据库缓存的常见方案

Redis的访问速度比MySQL快很多,Redis能够接受的并发量更大

  • Redis数据在内存中,访问速度远大于硬盘
  • Redis只是简单的支持了key value的存储,不涉及复杂的查询 

  • 客户端访问业务服务器,发起查询请求
  • 业务服务器先查询Redis,看看数据是否存在Redis
  1. 如果存在,直接返回
  2. 如果不存在,再查询MySQL 

上述讨论了二八定侓,只需要在Redis中存放20%的热点数据,就能够保证日常80%的请求不用再去查询数据库了~

TIPS:缓存是用来加速"读" 操作,写操作还得老老实实的写数据库,并不能提高性能

缓存更新策略 

定期生成 

每隔一定的周期(一天,一周,一个月),对于数据的频次进行统计,挑选出访问频次最高的前N%的数据。

搜索引擎为例 

用户在搜索引擎中输入一个"查询词",有些词是属于高频的(例如:30天速成C++,7天精通JAVA等)

此时搜索引擎的服务器就会把用户所搜索的词都通过日志的方式记录的明明白白,然后隔段时间就对该结果进行统计并得到一个"高频词表"

 当然这种做法实时性低,对于突发情况应对的不是很好

比如春节时间大家最多的搜索可能是,春晚、高速免费时间段等 

实时生成

先给缓存设定一个荣来给你上限(配置Redis中的 maxmemory 参数) 

接下来的查询:

  • 如果Redis查询到了,直接返回
  • 如果Redis不存在,就从数据库查,把查到的结果同时也写入Redis

如果缓存满了,就出发淘汰策略,把一些不太热门的数据给淘汰掉。

淘汰策略

FIFO(First In First Out) 先进先出 

 把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉.

lRU(Least Recently Used) 淘汰最久未使用的

记录每个key的最近一次的访问时间,把最近访问时间最老的key淘汰掉

LFU(Least Frequently Used) 淘汰访问次数最少的 

记录每个key 最近一段时间的访问次数,把访问次数最少的淘汰掉 

Ramdom 随机淘汰

从所有的 key 中抽取幸运⼉被随机淘汰掉

 Redis内置淘汰策略 

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

缓存预热、缓存穿透、缓存雪崩、缓存击穿

缓存预热 

使⽤ Redis 作为 MySQL的缓存的时候, 当 Redis 刚刚启动,或者Redis⼤批 key失效之后,此时由于 Redis ⾃⾝相当于是空着的,没啥缓存数据,那么MySQL就可能直接被访问到,从⽽造成较⼤的压⼒.

此时就需要提前把热点数据准备好,直接写入到Redis中,使Redis可以尽早保护MySQL

缓存穿透

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

产生的原因可能有以下几种
  • 业务设计不合理,缺少必要的参数校验环节,导致非法的key也被进行查询了
  • 开发/运维的失误操作,不小心删除了某部分数据
  • 被黑客攻击
解决方式 
  • 针对要查询的参数进行严格的合法性校验,例如如果要查询手机号,那么就要检验当前的key是否符合一个手机号码的格式
  • 针对数据库上不存在的key,也存到Redis上,并将Value随便设置成一个'.',避免后续频繁访问数据库
  • 使用布隆过滤器先判定key是否存在,再真正进行查询

 缓存雪崩

 短时间内大量的key在缓存上失效,导致数据库的压力倍增,甚至直接挂了

本来Redis就是MySQL的护盾,此时护盾失效了,MySQL的压力就会骤增

产生的原因可能有以下几种
  • Redis挂了

  • Redis上同时出现大量的key同时过期 

为什么会出现大量的key同时过期? 

 可能是短时间呢设置了大量的Reids缓存,并且设置相同的过期时间

如何解决
  • 部署高可用的Redis集群,并且完善监控报警体系
  • 不给key设置过期时间 或者 设计过期时间的时候添加随机时间因子 

缓存击穿 

 相当于缓存雪崩的特殊情况,即针对热点key过期了,导致大量的请求访问直接到MySQL上,甚至 导致数据库挂了

如何解决
  • 基于统计的方式发现热点key,并设置永不过期
  • 进行必要的服务降级,例如访问数据的时候使用分布式锁,限制同时请求数据的并发数

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

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

相关文章

106. Dockerfile通过多阶段构建减小Golang镜像的大小

我们如何通过引入具有多阶段构建过程的Dockerfiles来减小Golang镜像的大小? 让我们从一个通用的Dockerfile开始,它负责处理基本的事务,如依赖项、构建二进制文件、声明暴露的端口等,以便为Go中的一个非常基础的REST API提供服务。…

YoloV8实战:YoloV8-World应用实战案例

摘要 YOLO-World模型确实是一个突破性的创新,它结合了YOLOv8框架的实时性能与开放式词汇检测的能力,为众多视觉应用提供了前所未有的解决方案。以下是对YOLO-World模型的进一步解读: 模型架构与功能 YOLO-World模型充分利用了YOLOv8框架的…

剑指offer面试题34:在二叉树中和为某一值的路径

面试题34:在二叉树中和为某一值的路径 题目: LCR 153. 二叉树中和为目标值的路径 - 力扣(LeetCode) 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路…

C语言 - 各种自定义数据类型

1.结构体 把不同类型的数据组合成一个整体 所占内存长度是各成员所占内存的总和 typedef struct XXX { int a; char b; }txxx; txxx data; typedef struct XXX { int a:1; int b:1; …

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RichText)

富文本组件,解析并显示HTML格式文本。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。该组件无法根据内容自适应设置宽高属性,需要开发者设置显示布局。 子组件 不包含子组…

封装的echarts子组件使用watch监听option失效的问题

项目场景: 我在项目里面封装了一个echarts组件,组件接收一个来自外部的option,然后我用了一个watch函数去监听这个option的变化,option变化之后,销毁,然后再新建一个charts表 碎碎念 问题如标题所示,这篇…

ubuntu 安装 infiniband 和 RoCE 驱动

下载驱动程序 驱动程序地址 https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/ 安装 安装参考文档 https://docs.nvidia.com/networking/display/mlnxofedv24010331/installing+mlnx_ofed#src-2571322208_InstallingMLNX_OFED-InstallationProced…

十五、计算机视觉-sobel算子

文章目录 前言一、sobel算子的概念二、sobel算子的计算方式三、具体实现 前言 上节课我们学习了梯度的知识,学习了如何去计算梯度,本节我们继续学习计算梯度的方法,本节我们学习使用Sobel算子计算梯度,这与上节课梯度计算方法有所…

Java客户端调用elasticsearch进行深度分页查询 (search_after)

Java客户端调用elasticsearch进行深度分页查询 (search_after) 一. 代码二. 测试结果 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 具体的Search_after解…

科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」

2024年3月7日~8日,第八届瑞芯微开发者大会(RKDC2024)在福州举行,本届大会以“AI芯片AI应用AloT”为主题,邀请各行业的开发者共启数智化未来。 本届大会亮点颇多,不仅有13大芯片应用展示、9场产品和技术论坛…

28 批量归一化【李沐动手学深度学习v2课程笔记】(备注:这一节讲的很迷惑,很乱)

目录 1.批量归一化 1.1训练神经网络时出现的挑战 1.2核心思想 1.3原理 2.批量规范化层 2.1 全连接层 2.2 卷积层 2.3 总结 3. 代码实现 4. 使用批量规范化层的LeNet 5. 简明实现 1.批量归一化 现在主流的卷积神经网络几乎都使用了批量归一化 批量归一化是一种流行且…

面向对象【static关键字】

文章目录 Java中的static关键字1. 静态变量2. 静态方法的特点3. 静态块4. 静态导入5. 单例模式中的应用 Java中的static关键字 在Java中,static是一个关键字,用于定义类级别的成员,这些成员与类的实例无关。static成员属于类而不是类的实例&…

怎么查看电脑是不是固态硬盘?简单几个步骤判断

随着科技的发展,固态硬盘(Solid State Drive,简称SSD)已成为现代电脑的标配。相较于传统的机械硬盘,固态硬盘在读写速度、稳定性和耐用性等方面都有显著优势。但是,对于不熟悉电脑硬件的用户来说&#xff0…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的水下目标检测系统(深度学习模型+UI界面+训练数据集)

摘要:本研究详述了一种采用深度学习技术的水下目标检测系统,该系统集成了最新的YOLOv8算法,并与YOLOv7、YOLOv6、YOLOv5等早期算法进行了性能评估对比。该系统能够在各种媒介——包括图像、视频文件、实时视频流及批量文件中——准确地识别水…

唯众物联网+地理科学交付云南师范大学地理学部教学实验室项目

近日,云南师范大学地理学部教学实验室建设项目顺利交付。该项目的成功落地,标志着物联网技术与地理科学教育的深度融合,为云南师范大学的地理教学提供了全新的教学平台与资源。该项目以物联网技术为核心,结合地理科学的特点&#…

新一代实时数据集成框架 Flink CDC 3.0 —— 核心技术架构解析

本文整理自阿里云开源大数据平台吕宴全关于新一代实时数据集成框架 Flink CDC 3.0 的核心技术架构解析,内容主要分为以下四部分: Flink CDC 演进历程 Flink CDC 3.0 的架构设计 Flink CDC 3.0 的核心实现 未来规划 一、Flink CDC 演进历程 Flink CD…

Web——HTML

一.HTML概述 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。可以使用 HTML 来建立自己的 WEB 站点,HTML 运行在浏览器上,由浏览器来解析。 二.…

相机模型Omnidirectional Camera(全方位摄像机)

1. 背景 大多数商用相机都可以描述为针孔相机,通过透视投影进行建模。然而,有些投影系统的几何结构无法使用传统针孔模型来描述,因为成像设备引入了非常高的失真。其中一些系统就是全方位摄像机。 有几种方法可以制作全向相机。屈光照相机(D…

【Linux】yum及vim

目录 在Linux中安装软件(以centos7为例) Linux中的安装方式 安装的理解 什么是软件包? yum的一般使用流程 Linux开发工具 vi/vim 什么是vi/vim? vim的三大主要模式(实际上还有很多模式,此篇不做介绍…

一款好用的AI工具——边界AICHAT(三)

目录 3.23、文档生成PPT演示3.24、AI文档翻译3.25、AI翻译3.26、论文模式3.27、文章批改3.28、文章纠正3.29、写作助手3.30、文言文翻译3.31、日报周报月报生成器3.32、OCR-DOC办公文档识别3.33、AI真人语音合成3.34、录音音频总结3.35、域方模型市场3.36、模型创建3.37、社区交…