Redis与数据库的爱恨纠葛

news2024/10/7 6:47:25

Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

早期数据库只要有数据库的操作---增--删--改--查

当用户量特别多的情况下,数据库的数量一定是跟不上用户的数量,对数据库来说是特别繁忙的

 看着每天都累趴下的数据库,顿时有种心疼的感觉。

对数据库操作进行了分析,发现读取的业务大于其它业务的总和,那为给数据库介绍了一个专门干缓存的对象----redis

redis

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 

自从给数据库分配了对象之后,大量的读取内容都登记在redis中,后续有相同的读取可以直接找redis要了,不用再跑数据库进行I/O操作了,数据库顿时感觉到了工作轻松了不少

redis缓存过期

      Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,而内存是有限的,如果一直存下去,迟早会有溢满的情况

     那能不能清理掉一些老旧过期的数据呢?好像是可行了,那怎么让redis知道它们是老旧的数据呢?

    如果我们给这个数据加上标识,那不就可以知道了吗,那又出来一个问题,我们这个数据要使用多久什么时候过期,----------不如就把这个标识改成它的过期时间,只要到了过期时间我们就去把这个数据给删除掉

    那redis清理缓存最简单的就是定期清理的比如1000ms去清理一次这个已经过期的缓存,但是如果redis有1000个缓存,redis没有办法一次性清理完毕否则会影响到其它业务的正常存取,为了兼容redis每次只能随机清理100个,能保证缓解一定的内存压力

   那么又出来了一个问题既然是随机删的话,我一边删一边又有新的数据过期,那有没有一种可能,redis有一部分数据已经不需要了也长时间没有随机到它,成了漏网之鱼,又霸占着内存

 如果再做个一旦遇到查询请求,发现已经超期了,就立即删除,惰性删除,被动触发时发现就删除,但是也会存在一直不被请求到但是也一直在随机之外的过期数据(缓存数据几千上万是非常大概率出现这种漏中漏的漏网之鱼)

缓存淘汰

    缓存过期这种情况非常有可能把我们的内存溢满,就算能非常好的处理完这些过期数据,但是还是有一种情况

    redis还没过期的时候,数据量redis的内存就给溢满了,怎么办?

volatile-lru:针对设置了过期时间的key,使用LRU算法进行淘汰
allkeys-lru:针对所有key使用LRU算法进行淘汰
volatile-lfu:针对设置了过期时间的key,使用LFU算法进行淘汰
allkeys-lfu:针对所有key使用LFU算法进行淘汰
volatile-random: 从设置了过期时间的key中随机删除
allkeys-random: 从所有key中随机删除
volatile-ttl:删除生存时间最近的一个键
noeviction(默认策略):不删除键,返回错误OOM,只能读取不能写入

LRU 

 Least Recently Used 最近很少使用(最长时间)

LFU

Least Frequently Used最少使用(最少频率)  在LRU的算法上加了次数

图1:

当我输入为5的时候,我需要删除一个数字,我这个时候按LRU算法来  我应该删出的是2,因为3在2出现之后再出现了一次距离5出现的时间比2近

如果按LFU算法 我应该删除的是4 因为3我使用了3次,2我使用2次,4只出现了一次,频率最低

图2:

当图2情况下 输入到5的情况下,我需要删除一个数字 

LRU    删除2

LFU     这个删除的就是4了,首先按频率来3出现最多  4和1出现次数相同,但是 还会按LRU算法来算一次,1距离5比4距离5的时间短

 

 缓存穿透

    当查询的数据不存在时,redis里面也没有缓存,就会去数据库里面查询,但是也有可能数据库也不存在,导致同样的请求来了每次都要去让 MySQL 白忙活一场。作为缓存的价值就没得到体现啦!这就是人们常说的缓存穿透

 

解决方案

(1)布隆过滤器

在控制层对请求先进行校验,不符合条件的请求则被丢弃,从而避免对持久层数据库造成的查询压力。

(2)缓存空对象

当查询的数据不存在于redis中时,请求到了持久层数据库中去查询数据,但查询不出数据,这时会返回空对象,同时把该空对象缓存到redis里,然后设置一个过期时间,往后只要再次请求查询该条数据,该条数据都会从redis中获取(获取redis返回的空对象),从而保护了后端的数据源。


缓存击穿

redis里面有一个高频的热点key,可能有大量的访问针对这个key进行访问,如果这个key在某个时间过期了,会导致大量的请求越过redis直接作用在数据库上,而数据库连接资源有限,直接导致其它业务宕机

 解决方案:

(1)设置热点key永不过期。

(2)加锁对redis与数据库中间加锁,保证每次只有可控的线程数量访问,其它线程等待

 缓存雪崩

这个相对缓存击穿更加严重,多个key在统一时间批量失效或者redis直接宕机,导致大批量/所有访问直接作用在数据库上,导致数据库直接挂掉,或者其它大量服务宕机

解决方案:

  (1)redis高可用

        1.主从

        2.哨兵

        3.集群

(2)限流降级:通过加锁或队列来控制读取持久层数据库的线程数量

(3)数据预热:预先把可能被大量访问的数据加载到缓存中,并给这些key设置不同的过期时间,让key失效的时间点尽量均匀开来。
 

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

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

相关文章

String_JavaScript

String_JavaScript 学习路线:JavaScript基础语法(输出语句)->JavaScript基础语法(变量)->JavaScript基础语法(数据类型)->JavaScript基础语法(运算符)->Jav…

海外推广运营的技巧汇总

海外电商运营推广?做海外电商,重点在于运营推广。如果运营推广能做好,那么在行业内分一杯羹并不难。但问题是,在运营推广上,很难做海外电商。 这年头,相信大家都知道海外电商出问题了。很多人的账号都被亚…

动态链接库dll详解

动态链接库概述 DLL就是整个Windows操作系统的基础。动态链接库不能直接运行,也不能接收消息他们是一些独立的文件。 Windows API中的所有函数都包含在DLL中。 其中有三个最重要的DLL kernel32.dll,它包含用于管理内存、线程和进程的各个函数&#xff1b…

[附源码]SSM计算机毕业设计学生实习管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

超详细的商业智能BI知识分享,值得收藏

在数据为王的时代,获取数据和处理数据,成为企业必备的生存手段。哪个企业能在数据信息中汲取到更多的有效价值,就能抢占先机,获得市场的主动权。数据分析将不再是专业技术人员或数据分析师的专利,商业智能 BI 可以帮助…

华为机试 - 最大股票收益

目录 题目描述 输入描述 输出描述 用例 题目解析 算法源码 题目描述 假设知道某段连续时间内股票价格,计算通过买入卖出可获得的最大收益。 输入一个大小为 n 的数 price(p1,p2,p3,p4…….pn),pi 是第i天的股票价格。 pi 的格式为股票价格(非负整型)加上货…

基于风控特征相关度,挖掘贷中等场景中的存量客户价值|来看看相关实操

在数据建模流程中,都会涉及一个样本特征的相关性的分析,这个是建模流程中重要一环。通过量化特征字段之间的相关程度,可以将其作为一个重要信息维度,便于我们对模型训练的特征变量池进行有效筛选,不仅有简化模型且保证…

NLTK下载使用问题

一开始想要执行如下语句,结果运行不了 from textblob import TextBlob text Today is a beautiful day. Tomorrow looks like bad weather. blob TextBlob(text) print(blob) print(-*10) print(blob.sentences)原因是没有下载NLTK的语料库,调用如下语…

【创建VUE3新项目】从零开始如何创建一个干净的vue3项目【基于前端详细介绍】

【写在前面】基于安装完node和npm基础上来实现的,没安装的可以看我之前的文章,如何验证呢?npm -v / node -v 两个命令行解决! 一、创建文件(脚手架安装) 此处值得注意的是不能包括大写字母,不…

图库 | 图计算的适用场景有哪些?

图计算适用的场景非常广泛。在其肇始的早期阶段,图计算仅限于学术界以及工业界资深的研究机构内部,随着计算机体系架构的发展,图计算也在更广泛的行业和场景中得到应用。按照时间维度我们大体可以把图计算的发展及适用范围分为如下几个阶段&a…

微服务框架 SpringCloud微服务架构 5 Nacos 5.1 认识和安装Nacos

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构5 Nacos5.1 认识和安装Nacos5.1.1 认识Nacos5.1.2 安装Nacos5 Nacos 5.1 …

ARM架构与编程 · 基于IMX6ULL

一、嵌入式系统硬件介绍 cpu RAM(内存) FALSH 集成(flash存储设备) MCU/单片机 AP/ MPU 进化之后可以外接内存和存储设备,跑复杂的操作系统,比如手机 cpu一上电就会执行程序,程序存放在片内的ROM中&…

Apollo 应用与源码分析:Monitor监控-软件监控-时间延迟监控

目录 代码 分析 RunOnce 函数分析 UpdateState函数分析 发送时间延迟报告函数分析 备注 代码 class LatencyMonitor : public RecurrentRunner {public:LatencyMonitor();void RunOnce(const double current_time) override;bool GetFrequency(const std::string& ch…

原型设计模式

一、原型模式 1、定义 原型模式(Prototype Pattern)指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象,属于创建型设计模式。 原型模式的核心在于复制原型对象。 2、结构 (1)模式的结构 …

doris 动态分区

添加分区 ALTER TABLE v2x_olap_database.government_car ADD PARTITION p20221203 VALUES LESS THAN ("2022-12-04");动态分区表不能添加分区&#xff0c;需要转为手动分区表 查看分区 show paritions from <表名>删除分区 alter table <表名> dro…

[附源码]Python计算机毕业设计SSM隆庆祥企业服装销售管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

短信的信令过程

目录 1 短消息的信息流程&#xff1a; 1.1消息一次成功发送时的情况MO上行-MT下行 方式&#xff1a;1&#xff0e; MO&#xff08;主叫移动用户发给sp短消息中心&#xff09;编辑好短消息&#xff0c;键入发送号码&#xff08;被叫移动用户号码&#xff09;&#xff0c;按发送…

Java基于springboot+vue的摄影作品展示交流系统 计算机毕业设计

随着时代的发展&#xff0c;人们的精神世界也在不断的丰富&#xff0c;尤其是在当下电子设备发展迅速的背景下&#xff0c;人们通过数码相机或者手机随后就可以拍下每一个美丽的瞬间&#xff0c;但是人们更希望将这些摄影作品传到网上和更多的人进行分享&#xff0c;同时也希望…

决策树算法、随机森林算法

一、决策树 1、什么是决策树&#xff1f;如何进行高效的决策&#xff1f; 最早的决策树就是利用程序设计中的if-else结构分割数据的一种分类学习法。决策树的思想就是&#xff1a;如何高效的进行决策。而我们决策是有顺序的&#xff0c;即&#xff1a;我们在看不同的特征的时…

SSE AVX 发展简单介绍

SIMD全称是"Single Instruction, Multiple Data". SSE1是Pentium III引入的&#xff0c;它操作于16 bytes寄存器。在C和C中&#xff0c;这些寄存器以__m128的形式作为数据类型(128 bits16 bytes)。每个寄存器包含4个单精度浮点数float&#xff0c;指令集一共有8个这…