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

Redis缓存

Redis作为缓存

关系性数据库为什么性能不高:
关系性数据库存储在硬盘上面,所有相对内存而言IO速度并不快。
关系型数据库对于sql语句的的校验工作约束很多,一次查询很复杂。
一些复杂的查询,比如联合查询,笛卡尔积查询,效率降低更多。

为什么高并发就会宕机

服务器每次处理一个请求,都要消耗硬件资源包括cup,宽带,内存,硬盘,本身的资源就是有限的,而关系型数据库这种复杂sql的查询消耗资源相对于redis的操错大很多,一旦高并发上来,就会把资源消耗完,从而导致宕机

如何结局按高并发问题?

开源:多部署几台服务器,集群部署
节流:引入缓存,二八原则,把经常访问的热点数据放在缓存中

利用redis缓存保护MySQL
在这里插入图片描述

缓存的更新策略(那些是热点数据)

定时更新

每个一段时间,对于访问数据的频次进行统计挑选访问最高的前N%的数据,具体根据业务的情况来顶,然后会把这些搜索词的数据放在缓存中

问题:这样实时性不是很高,比如春晚这个词,一般只有过节那几天搜索频率变高,而平时几乎不会去搜索。
实时更新

每次查询会在redis查询,如歌查询到就返回,如果查询不到,就从数据库里面查询,查询到后返回同时也会写入redis缓存。一段时间后结合这淘汰策略,redis基本村粗的数据就是热点数据

问题: redis容易内存满

内存淘汰策略:

给key设置过期时间

FIFO(first in first out) 当新写入数据时候,内存不够,先进先出,优先把存储事件最久的先淘汰

LRU (Least Recently Used)当新写入数据时候,内存不够,淘汰最久未使用的,记录每次key访问最近的时间,根据最近访问时间最久来淘汰

LFU(Least Frequently Used)当新写入数据时候,内存不够, 淘汰访问次数最少的,记录每次key被访问的次数,把访问次数最少的淘汰掉

Random 当新写入数据时候,内存不够, 随机淘汰。

缓存预热, 缓存穿透, 缓存雪崩 和 缓存击穿

缓存预热

:使用redis作为mysql缓存时候,当redis刚刚启动动或者redis大批的key失效,这时候由于redis是空的,为了避免大量请求直接打入mysql中,因此会提前把一些热点数据准备好,放入redis中,这些热点数据不一定精准,但是可以后期慢慢调整,可以为mysql挡住大多数的请求。

缓存穿透

访问的数据在redis和mysql上面都没有,此时也不会向redis上面放入数据,如果这种请求短时间大量访问,就会访问数据库,造成数据库请求太多,造成崩溃。

产生原因:黑客攻击,运维开发误把数据库部分数据删除,业务设计不合理,导致非法key被查询

解决方案:

把查询不到的数据,在缓存也设置key-value值,value设置为一个空字符串,避免后续频繁查询

使用布隆过滤器先判定key是否存在,再真实查询。

对于查询的参数进行校验,比如查询的key是用户手机号,就校验这个手机号是否有效。

缓存雪崩:

1.redis宕机了挂带了,2,大量的key在同一时间过期,导致数据库,压力倍增。

解决方法:对于redis的监控加强,加入哨兵,挂了后立马通知,多部署几台redis,一个挂了别的顶上, 对于热点key不设置过期时间,或者过期时间随机,避免同时过期。

缓存击穿

是缓存雪崩的特殊情况,针对热点数据,突然过期,这时候又有大量请求,直接访问到数据库上面,导致数据库宕机。

解决方法:基于热点key不过期,进行服务降级处理,适当关闭一些不重要的功能的服务器,把资源都分配在访问数据库上面,比如访问数据库时候,使用分布式锁,限制同时请求的并发数。

http://www.xdnf.cn/news/1309789.html

相关文章:

  • 【OpenGL】LearnOpenGL学习笔记09 - 材质、光照贴图
  • 登录与登录校验:Web安全核心解析
  • 【昇腾】单张48G Atlas 300I Duo推理卡MindIE+WebUI方式跑7B大语言模型_20250816
  • 如何在FastAPI中玩转APScheduler,实现动态定时任务的魔法?
  • 【wmi异常】关于taskkill命令提示“错误:找不到” 以及无法正常获取设备机器码的处理办法
  • pytorch例子计算两张图相似度
  • PHP反序列化的CTF题目环境和做题复现第2集_POP链构造
  • 利用Qwen大模型进行c++11并发库的学习,与时俱进!!!!
  • AI安全增强核心技术:提示词防火墙、置信度过滤与知识蒸馏防御
  • 第6问 数据分析领域主要的岗位有哪些?
  • Rust 入门 KV存储HashMap (十七)
  • pdf合并代码
  • 【C++】异常详解(万字解读)
  • FPGA串口通信实现方案
  • Qt QDateTime时间部分显示为全0,QTime赋值后显示无效问题【已解决】
  • 【C++】C++11
  • Maven私服配置模版
  • 深入详解PCB布局布线技巧-去耦电容的摆放位置
  • IOMMU的2级地址翻译机制及多级(2~5)页表查找
  • Python 项目高频设计模式实战指南:从理念到落地的全景剖析
  • 电路方案分析(二十一)笔记本电脑散热风扇参考设计
  • 【运维心得】三步更换HP笔记本电脑外壳
  • 玄机靶场 | 日志分析-Tomcat日志分析
  • Tomcat架构深度解析:从Server到Servlet的全流程揭秘
  • Jenkins常见问题及解决方法
  • js原生实现手写签名与使用signature_pad库实现手写签名
  • 【科研绘图系列】R语言在DOM再矿化数据分析与可视化中的应用
  • 【CF】Day128——杂题 (图论 + 贪心 | 集合 + 贪心 + 图论 | 二分答案 + 贪心)
  • bev 感知算法 近一年来的新进展
  • echarts 画一个饼图,并且外围有一个旋转动画