当前位置: 首页 > news >正文

【Redis】-- 缓存

文章目录

  • 1. Redis应用--缓存
    • 1.1 什么是缓存
    • 1.2 使用Redis作为缓存
    • 1.3 缓存的更新策略
      • 1.3.1 定期生成
      • 1.3.2 实时生成
        • 1.3.2.1 内存淘汰策略
    • 1.4 缓存预热
    • 1.5 缓存穿透
    • 1.6 缓存雪崩
    • 1.7 缓存击穿

1. Redis应用–缓存

Redis有三个最主要的用途:

  1. 作为内存数据库存储数据。
  2. 缓存(Redis最常用的场景)。
  3. 消息队列。

1.1 什么是缓存

缓存是一个相对的概念,访问速度快的设备可以作为访问速度慢的设备的缓存。
CPU寄存器 > 内存 > 硬盘 > 网络。

缓存速度虽然快,但是空间小,缓存之所以有意义,是由于二八定律(20%的数据能够应对80%的请求)。

1.2 使用Redis作为缓存

通常是使用Redis作为数据库的缓存(MySQL)

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

  1. 数据库把数据存储到硬盘上,硬盘的IO速度并不快,尤其是随机访问。
  2. 如果查询不能命中索引,就需要进行表的遍历,会大大增加硬盘IO的次数。
  3. 关系型数据库对于SQL的执行会做一系列的解析、校验、优化工作。
  4. 如果是一些复杂的查询,比如联合查询,需要进行笛卡尔积操作,效率降低了很多。

为什么并发量高了就会宕机?
服务器每次处理一个请求,都要消耗一些硬件资源(CPU、内存、硬盘、网络)。任意一种资源的消耗超出了机器能提供的上限,机器就会很容易出现故障。

如何提高MySQL能够承担的并发量?

  1. 开源: 引入更多的机器,构成数据库集群.
  2. 节流: 引入缓存,就是典型的方案,把一些频繁读取的热点数据, 保存到缓存上,后续再查询数据的时候,如果 缓存中已经存在了.就不再访问mysql了.

在这里插入图片描述

1.3 缓存的更新策略

如何知道Redis中应该存储哪些数据呢?如何知道哪些数据是热点数据呢?

1.3.1 定期生成

定期生成策略会把访问的数据以日志的形式记录下来, 然后针对这些日志进行统计,统计一天/一月/一年每个词的出现频率, 再根据频率进行降序排序,取出前20%的词,就可以把这些词认为是热点词.

然后把这些热点词涉及到的搜索结果提前放到Redis这样的缓存中.

但是定期生成的热点数据的实时性不够,如果出现一些突发性事件,有些本来不是热词的内容,突然成了热词.新的热词就可能给后面的数据库带来较大的压力.

1.3.2 实时生成

每次用户查询的时候先再Redis中查询,如果查到了就直接返回;如果Redis中不存在就从数据库中查,同时把查到的结果写入Redis.

但是这样不断的往Redis缓存中写,就会使Redis的内存占用越来越多,逐渐达到上限.此时继续往里面插入数据就会触发问题.为了解决上述情况,Redis就引入了"内存淘汰策略".

1.3.2.1 内存淘汰策略
  1. FIFO先进先出: 把缓存中存在事件最久的淘汰掉.
  2. LUR淘汰最久未使用的: 记录每个key的最艰难访问时间, 把最近访问时间最老的key淘汰掉.
  3. LUF淘汰访问此时最少的: 记录每个key最近一段时间的访问次数,把访此时最少的淘汰掉.
  4. Random随机淘汰: 随机挑选幸运儿进行删除.

在这里插入图片描述

1.4 缓存预热

  1. 定期生成(不涉及预热).
  2. 实时生成.

Redis服务器首次接入之后,服务器里使没有数据的.此时所有的请求都会打给MySQL,随着时间的推移.Redis上的数据越积累越多,MySQL承担是压力就逐渐减小了.

缓存预热就是用来解决这个问题的,把定期生成和 实时生成结合一下,先通过离线的方式,通过一些统计的途径,先把热顶数据找到一批,导入到Redis中.此时导入的这批热点数据,就能棒MySQL承担很大的压力了.随着时间的推移,逐渐就使用新的热点数据淘汰掉旧的数据了.

1.5 缓存穿透

查询某个key, 在Redis中没有,在MySQL中也没有,这个key肯定也不会被更新到Redis中,那么这次查询查不到,下次查询也查不到…

如果存在很多这种查询不到的数据,并且后续还会反复查询,同样会给MySQL带来很大的压力.

解决方案:
1. 如果发现这个key,在Redis和MySQL上都不存在,仍然写入Redis中,value设成一个非法值(比如"").
2. 可以引入布隆过滤器,每次查询之前都先判定一下key是否在布隆过滤器上存在.

1.6 缓存雪崩

由于在短时间内,Redis上大规模的key失效,导致缓存命中率陡然下降,并且MySQL的压力迅速上升,甚至直接宕机
1. Redis直接挂了(Redis宕机/Redis集群模式下大量节点宕机).
2. Redis正常运行,但是可能之前短时间内设置了很多key给Redis,并且设置的过期时间是相同的.

解决方法:
1. 加强监控报警,加强Redis集群的可用性.
2. 不给key设置过期时间/设置过期时间的时候添加随机因子(避免同一时刻过期).

1.7 缓存击穿

针对热点数据,突然过期了,导致大量的请求直接访问到数据库上, 甚至引起数据库宕机.

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


文章转载自:

http://cs7yhTcF.rdsst.cn
http://NCWKeOJp.rdsst.cn
http://i1Z6dD27.rdsst.cn
http://CVTN6bYO.rdsst.cn
http://laOdVWLK.rdsst.cn
http://83sGTLZG.rdsst.cn
http://IjY8SIJp.rdsst.cn
http://AK8C9hga.rdsst.cn
http://WmkPvTQ0.rdsst.cn
http://u8LJ695l.rdsst.cn
http://SzLQDKoq.rdsst.cn
http://4LZ9yrRW.rdsst.cn
http://Vv1Rp6uk.rdsst.cn
http://owP6jrVl.rdsst.cn
http://ahlzeBe8.rdsst.cn
http://9hIj0vKo.rdsst.cn
http://JcXJXKKm.rdsst.cn
http://K2Fasv6o.rdsst.cn
http://MLK8GeUy.rdsst.cn
http://GqpekMwY.rdsst.cn
http://oth00L7q.rdsst.cn
http://UBIl9ILA.rdsst.cn
http://Km5h2vh5.rdsst.cn
http://UzGswtog.rdsst.cn
http://MlB1b0Fi.rdsst.cn
http://2SD2wVoa.rdsst.cn
http://ARHhiCtd.rdsst.cn
http://pmLafG10.rdsst.cn
http://Bt94tUR0.rdsst.cn
http://FSoqSwn4.rdsst.cn
http://www.dtcms.com/a/387921.html

相关文章:

  • 鸿蒙高效数据处理框架全攻略:缓存、并行与流式实战
  • 全网首发! Nvidia Jetson Thor 128GB DK 刷机与测评(五)常用功能测评 - RealtimeSTT 音频转文本 同声传译
  • OpenHarmony 之生态规则管控服务(Ecological Rule Manager Service)源码深度解读
  • 无人机图传是什么意思 应用和趋势是什么?
  • arm coresight
  • Vue3 + vue-draggable-plus 实现可拖拽的数据源选择面板
  • Vue 项目主题切换功能实现:两种方案详解与选型分析
  • 有些软件要求基础环境包含oneAPI组件时带有小版本怎么解释
  • Vue3 基础
  • 处理Element ui输入框类型为Number的时候,中文输入法下回车光标聚焦到了左上角
  • 企业级容器技术Docker 20250917总结
  • 智能艾灸机器人:科技激活千年养生智慧,开启中医现代化新篇章
  • Docker 镜像瘦身实战:从 1.2GB 压缩到 200MB 的优化过程——多阶段构建与 Alpine 的降维打击
  • Unity 性能优化之道(性能问题定位 | 渲染流程分析 | SSAO项优化 | AA优化 | 后处理优化)
  • 进阶内容——BYOT(自带模板,Bring Your Own Template)(99)
  • 算法 七大基于比较的排序算法
  • DeepSeek 分布式部署,配置
  • 蓝凌EKP产品:AI 高效汇总意见,加速决策落地​
  • 在三台GPU服务器上部署分布式deepseek
  • Cpptraj 终极指南:从入门到精通
  • Project Treble和HAL架构
  • 【Linux网路编程】传输层协议-----TCP协议
  • dict电子词典
  • pulsar Error receiving messages.Consumer already closed at
  • 计算机视觉(opencv)实战二十五——摄像头动态轮廓识别
  • 简单易懂的Kafka例子
  • 针对tomcat [/usr/lib64:/lib64:/lib:/usr/lib]上找不到基于APR的Apache Tomcat本机库的处理方法
  • 【js】js实现日期转大写:
  • 番茄时钟小程序版本更新记录(v1.0)
  • css消除图片下的白边