Redis——缓存

news2024/11/18 17:47:59

什么是缓存?

缓存是计算机中一个经典的概念,其实本质就是将常用的数据放到访问速度快的地方,方便读取。

对于硬件的访问速度来说,通常情况如下:
CPU寄存器 > 内存 > 硬盘 > 网路
但是对于计算机硬件来说,往往访问速度快的设备,成本就会越高,存储空间就会越小。缓存是快,但是空间是不足的,所以,缓存大部分就是放一些热点数据

在一个网站中,通常使用像MySQL这样的关系型数据库来存储数据。关系型数据库虽然功能强大,但是有一个缺陷就是性能不高(这里是相对于redis来说)

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

  • 数据库将数据存储到硬盘上,硬盘上的IO速度并不快,尤其是随机访问
  • 如果查询不能命中索引,就需要进行表的遍历,这会大大增加硬盘IO次数
  • 如果涉及到了一些复杂的查询,需要用到笛卡尔积,效率就会下降很多

而且,在面对并发量大的情况下,数据库可能会宕机

为什么并发量大的情况下会宕机?

  • 服务器每次处理一个请求,都是需要消耗一定的硬件资源的(CPU、内存、硬盘、网络带宽)
  • 一个服务器的资源是有限的,一个请求消耗一份资源,请求多了,后续的请求就没有资源可用了,无法得到处理,就有可能会宕机

如何让数据库承担更大的并发量呢?

  • 开源:引入更多的机器,部署更多的数据库实例,构成集群。比如:分库分表、主从复制等
  • 节流:引入缓存,使用其他的方式保存经常访问的数据,从而降低数据库的压力

其中Redis就是缓存的一个经典案列,Redis的访问速度比MySQL快,或者说处理同一个访问请求,Redis消耗的系统资源比MySQL少很多,因此Redis能支持的并发量大

  • Redis数据在内存中,访问速度比硬盘快
  • Redis只支持key-value的形式,不涉及复杂查询的限制规则

在这里插入图片描述

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

那么问题来了如何知道Redis应该存储哪些数据呢?

定期生成

每隔一定的周期,对于访问的数据频次做统计,挑选出访问最高的前N%的数据,这些数据就是热点数据。

比如:用户来搜索引擎中输入一个关键字,有些关键字就是高频出现的,搜索引擎的服务器中可以通过日志的方式记录下来,然后每隔一定的时间将结果统计出来,就可以得到热点数据了。

但是想过没有,如果面对像一个节假日的突发情况,某个词会出现的很频繁,但是过了这段时间,就不会有人搜索这个词。 这种情况下,如果采取了定期生成的方式,是不是就不合适了呢??

所以基于上面的场景,有了实时生成的策略

实时生成

先给缓存设定容量上限(可以通过Redis中的maxmemory参数来设定)
接下来用户的每次查询:

  • 如果Redis存在,就直接返回
  • 如果Redis不存在,就从数据库中查询,将查询到的结果写入到Redis中

但是,如果缓存达到了上限,就会发出淘汰机制,将一些“相对不热门的”的数据淘汰掉。

通常的淘汰策略有如下几种

  • FIFO(First In First Out)先入先出:将缓存时间最久的数据淘汰掉
  • LRU(Least Recently Used)淘汰最久没使用的:记录每个key的最近访问时间,将最近的访问时间最老的key淘汰掉
  • LFU(Least Frequently Used)淘汰访问次数最少的:记录每个key最近一段时间的访问次数,将访问次数最少的key淘汰掉
  • Random随机淘汰:从所有的key中随机淘汰一个key

淘汰策略,用户可以自己实现,当然Redis也提供了内置的淘汰策略,以便直接使用。

Redis的内置淘汰策略如下:

  • volatile-lru: 当内存不足以容纳新写入的数据时,从设置了过期时间的key中使用LRU算法进行淘汰
  • allkeys-lru:当内存不足以容纳新写入的数据时,从所有的key中使用LRU算法进行淘汰
  • volatile-lfu:当内存不足以容纳新写入的数据时,在过期的key中,使用lfu算法进行淘汰
  • allkeys-lru:当内存不足以容纳新写入的数据时,从所有的key中使用lfu算法进行淘汰
  • volatile-random:当内存不足以容纳新写入的数据时,从所有的key中随机淘汰一个key
  • volatile-ttl:在设置了过期时间的key中,根据过期时间来淘汰。 (越早的过期key,越早被淘汰)
  • noeviction:这是Redis采用的默认策略,当内存不足的时候,写入操作会报错

缓存预热

什么是缓存预热

  • 使用Redis作为MySQL的缓存,当MySQL刚刚启动的时候,或者Redis大批量的key失效以后,由于Redis自身没啥数据,会直接访问到MySQL中,就会对MySQL造成巨大的压力。

所以要将热点数据准备好,直接写入到Redis中。

缓存穿透(Cache penetration)

什么是缓存穿透

  • 当一个key在Redis中不存在,并且也不在MySQL中,那么如果这时候并发量很大,就会造成巨大的压力。 这就叫做缓存穿透

为何产生:

  • 业务设计的不合理,比如缺少必要的参数校验,导致非法的key进行查询
  • 开发/运维误操作:将部分的key删除掉了

如何解决

  • 针对要查询的参数进行严格的校验,比如查询的key是用户的手机号,那么就需要校验当前的key是否满足一个合法的手机号的格式
  • 针对数据库也不存在的key,也存储到Redis中,比如value就随便设置为一个“”,避免后续频繁的访问数据库
  • 在应用程序中使用布隆过滤器,先进行一次判断,降低Redis的压力

缓存雪崩

什么是缓存雪崩

  • 短时间内大量的key在缓存上失效,导致数据库压力剧增,甚至是宕机了

为何产生:

大规模的key失效有两种情况

  • Redis挂了
  • Redis设置了大量的key同时过期了

如何解决?

  • 部署高可用的Redis集群,采用完善的监控报警系统
  • 不给key设置过期时间 或者 设置过期时间的时候随机添加随机时间因子

缓存击穿(Cache breakdown)

什么是缓存击穿

  • 相当于缓存雪崩的特殊场景,针对热点的key,突然过期了,导致大量的请求打到了数据库上,引发了宕机

如何解决?

  • 基于统计的方式发现热点key,并设置永不过期
  • 进行服务降级,例如采用分布式锁,限制同时请求数据库的并发量。 或者进行分流操作,将流量分到其他的服务器中

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

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

相关文章

李沐深度学习-多层感知机、模型选择、过拟合、欠拟合

3.8.1 隐藏层 多层感知机在单层神经网络的基础上引入了一到多个隐藏层(hidden layer)。隐藏层位于输入层和输出层之间。图3.3展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。 图3.3 带有隐藏层的多层感…

JavaSE篇之String类

1.字符串的构造 常用的有三种方法: 1.使用常量串构造 2.直接newString对象 3.使用字符数组进行构造 2.String对象的比较 2.1比较是否引用同一个对象 对于基本类型变量, 比较两个变量中存储的值是否相同。 对于引用类型变量,比较两个引用…

使用 MongoDB 在 Spring Boot 中构建安全的 RBAC 系统

介绍 您是否曾经构建过应用程序,然后突然意识到需要以更精细的方式管理用户访问权限?也许您已经硬编码了一些管理检查或在整个代码库中分散了权限逻辑。相信我,我经历过这种情况,维护起来并不好玩。 这就是基于角色的访问控制 (…

Unity3D地形系统一口气讲完!谢啦!!☆⌒(*^-゜)v

Unity 3D 地形系统概述 在三维游戏世界中,通常会将丰富多彩的游戏元素融合在一起,比如游戏中起伏的地形、郁郁葱葱的树木、蔚蓝的天空、、凶恶的猛兽等,营造出身临其境的游戏沉浸感,让玩家置身游戏世界,忘记现实。 地…

定时任务上云改造方案

优质博文:IT-BLOG-CN 一、Job单元化 什么Job需要单元化:所有会往单元化DB更新/删除/插入数据的Job都需要进行单元化改造。 什么是单元化DB 【1】指配置为DRC双向复制的DB; 【2】单元化的DB部署在多个Zone,每个Zone内的实例都会…

【含文档】基于Springboot+Vue的高校失物招领平台(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

物体实例分割,机器人拾取

物体实例分割是计算机视觉领域的一个关键任务,它旨在从图像中分割出每个独立物体,并且为每个物体实例提供一个独特的标识。这一任务不仅识别出图像中的物体,还能区分出多个同类物体的不同实例,例如在一张桌子上摆放的多个相同的杯…

『功能项目』宠物的攻击巨型化【80】

本章项目成果展示 我们打开上一篇79宠物的召唤跟随的项目, 本章要做的事情是实现在战斗中有几率触发宠物巨型化攻击将怪物击飞的效果 首先在主角预制体中增加隐藏的宠物巨型化 制作巨型化宠物的攻击效果 将该动画控制器放置在隐藏的巨型化宠物的动画控制器上 首先查…

新160个crackme - 065-Eternal Bliss

运行分析 选择验证方式,破解字符串标题提示为vb程序 PE分析 VB程序,32位,无壳 静态分析&动态调试 使用VB Decompiler进行分析,发现Command1_Click_403604为check按钮事件,需要使Me 1 CBool(expression) 将表达…

传输层协议 --- UDP

序言 在之前的文章 Socket 编程 中,我们只是简单的知道了怎么利用 UDP协议 或者是 TCP协议 来发送我们的数据,并且我们还知道 UDP 是不可靠的,TCP 是可靠的。但这是为什么呢?底层的构造和策略决定他们的属性!这篇文章中…

从环境部署到开发实战:消息队列 RocketMQ

文章目录 一、消息队列简介1.1 什么是消息队列1.2 常见消息队列对比1.3 RockectMQ 核心概念1.4 RockectMQ 工作机制 (★) 二、RocketMQ 部署相关2.1 服务器单机部署2.2 管控台页面 三、RocketMQ 的基本使用3.1 入门案例3.2 消息发送方式3.2.1 同步消息3.…

微服务-流量染色

1. 功能目的 通过设置请求头的方式将http请求优先打到指定的服务上,为微服务开发调试工作提供便利 请求报文难模拟:可以直接在测试环境页面上操作,流量直接打到本地IDEA进行debug请求链路较长:本地开发无需启动所有服务&#xf…

前端常见算法题集

很久没练算法了,打算接下来一段时间每天坚持写题和写题解 这是一篇前端常用算法题集,题目从从简到难,编程语言主要为JavaScript,顺便练习和熟记js的各种方法... 目录 字符串类 1.字符串相加 字符串类 下图为js中常用的字符串方…

神经网络介绍及其在Python中的应用(一)

作者简介:热爱数据分析,学习Python、Stata、SPSS等统计语言的小高同学~ 个人主页:小高要坚强的博客 当前专栏:Python之机器学习 本文内容:神经网络介绍及其在Python中的线性回归应用 作者“三要”格言:要坚…

使用python爬取豆瓣网站?如何简单的爬取豆瓣网站?

1.对python爬虫的看法 首先说说我对python的看法,我的专业是大数据,我从事的工作是java开发,但是在工作之余,我对python又很感兴趣,因为我觉得python是一门很好的语言,第一:它可以用来爬取数据…

fmql之字符驱动设备(2)

例行的点灯来喽。 之前是寄存器读写&#xff0c;现在要学习通过设备树点灯。 dtsled.c 寄存器写在reg 把用到的寄存器写在设备树的led节点的reg属性。 其实还是对寄存器的读写。 &#xff08;不推荐&#xff09; 头文件 #include <linux/kernel.h> #include <li…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-26 1. LLMs Still Can’t Plan; Can LRMs? A Preliminary Evaluation of OpenAI’s o1 on PlanBench Authors: Karthik Valmeekam, Kaya Stechly, Subbarao Kambhampati LLMs仍然无法规划&#xff1b;LRMs可以…

【通俗易懂】FFT求解全过程,各参数详细解释

在进行FFT全过程讲解之前&#xff0c;小编先给大家解释一下&#xff0c;在FFT中出现的一些参数名词解释。 &#xff08;1&#xff09;采样频率 Fs Fs 1 / 采样间隔 根据奈奎斯特定理&#xff1a;Fs ≥ 最高频率分量的两倍&#xff0c;这样才能避免混叠 &#xff08;2&…

解决macOS安装redis以后不支持远程链接的问题

参考文档:https://blog.csdn.net/qq_37703224/article/details/142542179?spm1001.2014.3001.5501 安装的时候有个提示, 使用指定配置启动: /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf那么我们可以尝试修改这个配置文件: code /opt/homebrew/…

傅里叶级数在机器人中的应用(动力学参数辨识)

B站首发&#xff01;草履虫都能看懂的【傅里叶变换】讲解&#xff0c;清华大学李永乐老师教你如何理解傅里叶变换&#xff0c;辨清美颜和变声原理&#xff0c;&#xff01;&#xff01;_哔哩哔哩_bilibiliB站首发&#xff01;草履虫都能看懂的【傅里叶变换】讲解&#xff0c;清…