Redis 性能管理/优化 双一致性问题 缓存雪崩/击穿/穿透

news2024/12/25 9:33:46

---------------------- Redis 性能管理 ----------------------------------------

----- 查看Redis内存使用 ----- 

info memory

redis-cli -a 'abc123' info memory

----- 内存碎片率 -----

  • used_memory_rss:是Redis向操作系统申请的内存。
  • used_memory:是Redis中的数据占用的内存。
  • mem_fragmentation_ratio:内存碎片率。
    mem_fragmentation_ratio = used_memory_rss / used_memory
  • used_memory_peak:redis内存使用的峰值。

内存碎片如何产生的?
Redis内部有自己的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。
Redis中的值删除的时候,并没有把内存直接释放,交还给操作系统,而是交给了Redis内部有内存管理器。
Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。
Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。

Redis请求了一堆内存空着不用,也不还给操作系统,俗称占着茅坑不拉屎。

跟踪内存碎片率对理解Redis实例的资源性能是非常重要的
●内存碎片率在1到1.5之间是正常的,这个值表示内存碎片率比较低,也说明 Redis 没有发生内存交换。
●内存碎片率超过1.5,说明Redis消耗了实际需要物理内存的150%,其中50%是内存碎片率。
●内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换。需要增加可用物理内存或减少 Redis内存占用。

解决碎片率大的问题
如果你的Redis版本是4.0以下的,需要在 redis-cli 工具上输入 shutdown save 命令,让 Redis 数据库执行保存操作并关闭 Redis 服务,再重启服务器。Redis服务器重启后,Redis会将没用的内存归还给操作系统,碎片率会降下来。

Redis4.0版本开始,可以在不重启的情况下,线上整理内存碎片。

config set activedefrag yes     #自动碎片清理,内存就会自动清理了。
memory purge                    #手动碎片清理

----- 内存使用率 -----

redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。

避免内存交换发生的方法
●针对缓存数据大小选择安装 Redis 实例(内存大多装几个Redis实例,内存小就少装)
●尽可能的使用Hash数据结构存储(hash 散列 占用空间小)
●设置key的过期时间(设置过期时间 用不到的key不让他浪费空间)

----- 内回收key -----

内存数据淘汰策略,保证合理分配redis有限的内存资源

当达到设置的最大阀值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除


配置文件中修改 maxmemory-policy 属性值

vim /usr/local/redis/conf/redis.conf

--1149--
maxmemory-policy noenviction #最大内存时key的淘汰策略
●volatile-lru:从已设置过期时间的数据集合中 使用LRU算法淘汰数据(移除最近最少使用的key,针对设置了TTL的key) 
●volatile-ttl:从已设置过期时间的数据集合中 挑选即将过期的数据淘汰(移除最近过期的key)
●volatile-random:从已设置过期时间的数据集合中 随机挑选数据淘汰(在设置了TTL的key里随机移除)
●allkeys-lru:使用LRU算法从所有数据集合中淘汰数据(移除最少使用的key,针对所有的key)
●allkeys-random:从数据集合中任意选择数据淘汰(随机移除key)
●noenviction:禁止淘汰数据(不删除直到写满时报错)

其它限制相关

●maxclients #最大客户端连接数
设置redis同时可以与多少个客户端进行连接。
默认情况下为10000个客户端。
如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。

●maxmemory #最大内存使用量
Redis使用最大内存量。建议必须设置,否则,将内存占满,造成服务器宕机。
设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等。
但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明redis集群有主从),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素。

●maxmemory-samples #LRU/最小TTL算法的采样数量
设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个。
一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

redis优化(面试题)

性能优化

1)设置 config set activedefrag yes 开启内存碎片自动清理, 或者定时执行 memory purge 清理内存碎片
2)设置 maxmemory 指定redis占用最大内存大小, 设置 maxmemory-samples 指定内存数据淘汰策略的样本数量
3)设置 内存数据淘汰策略 maxmemory-policy 实现保证内存使用率不超过设置的最大内存大小
4)设置 key 的过期时间,精简 键名和键值,及控制键值的大小
5)尽可能使用 Hash 数据类型存储数据,因为 Hash 类型的一个键包含多个字段,该类型的数据占用空间较小
6)合理设置 maxclients 最大客户端连接数(10000),tcp-backlog tcp监控端口的最大连接排队数(1024), timeout 连接超时时间(30000)  

安全优化
7)设置 AOF 持久化

8)部署 主从复制 备份数据,采用 哨兵 或者 集群 模式实现高可用
9)设置 config set requirepass 开启密码验证




缓存和数据库双写一致性问题(面试有几率问)

Redis缓存服务器要与MySQL服务器中数据保持一致。

为了实现数据的一致,可以

先更新数据库,然后再删除缓存  + 缓存做过期时间,数据过期后再有读请求可从数据库直接更新缓存,以保证数据的一致性。

1.读取数据时,先从Redis中读取,如果Redis中没有,再从MvSQL中读取,并将读取到的数据写入到Redis缓存中。
2.更新数据时,先更新MySQL数据库,再更新Redis缓存。
3.删除数据时,同样需要先删除Redis缓存,再删除MvSQL数据库。
4.对于一些关键数据,可以使用MySQL的触发器(Trigger) 来实现同步更新Redis缓存。当MySQL中的数据发生变化时,触发器可以自动将变化同步到Redis中,避免了手动操作的疏漏。
5.定期同步MySQL和Redis中的数据,以确保数据的一致性。可以使用定时任务或者其他方式定期同步两个数据源中的数据,从而保持一致。




缓存的三大问题(需要知道现象原因,解决方案可以不用管,是软件开发的业务逻辑问题)

正常情况下,大量的资源请求都会被redis响应,在redis得不到响应的小部分请求才会去请求DB,这样DB的压力是非常小的,是可以正常工作的。
缓存雪崩/击穿/穿透三大问题的根本原因在于Redis命中率下降,大量请求直接落在数据库上,导致数据库直接崩溃。

  • 缓存雪崩:redis中大量key集体过期
  • 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热点key过期)
  • 缓存穿透:大量请求根本不存在的key

缓存雪崩       

缓存同一时间大面积的过期失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。(软件开发负责)
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

缓存击穿

缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
和缓存雪崩不同的是,缓存击穿指并发查同一条数据缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案
实时调整,监控哪些数据是热门数据,实时的调整key的过期时长
使用锁机制,加互斥锁

缓存穿透

缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案

  • 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
  • 对空值进行缓存。从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
  • 采用布隆过滤器(牠说有的数据不一定有,但是确认过没有的数据肯定没有),将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力

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

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

相关文章

从有序顺序表中删除所有其值重复的元素(用不同的负数代替),使所有元素的值均不同。

题目要求&#xff1a;从有序顺序表中删除所有其值重复的元素&#xff08;用不同的负数代替&#xff09;&#xff0c;使所有元素的值均不同。 0&#xff1a;有序顺序表 1&#xff1a;删除所有其值重复的元素 2&#xff1a;用不同的负数代替 3&#xff1a;顺序表中所有元素的值均…

Maven中依赖使用范围

IDEA中help中show Log in Explorer可以查看idea日志 依赖使用范围 构建包含的流程&#xff1a;编译 &#xff0c;测试 &#xff0c;运行 &#xff0c;打包 &#xff0c;安装 &#xff0c;部署 comile test package install deploy 使用标签 1&#xff1a;compile 缺省值 伴随者…

OpenStack(T版)——块存储(Cinder)服务介绍与安装

文章目录 OpenStack(T版)——块存储(Cinder)服务介绍与安装安装和配置(controller)准备(1)创建数据库(2)加载admin user的环境变量(3)创建Identity服务凭据(4)创建Cinder 块存储服务组件的API endpoint 安装和配置Cinder块存储服务组件(1)安装软件包(2)编辑/etc/cinder/cinder.…

第七章:使用FileZilla搭建FTP服务器详解

目录 一、软件下载 二、服务器安装与配置 三、使用客户端 一、软件下载 到官方网站下载 FileZilla 的服务端和客户端程序 &#xff1a; FileZilla - The free FTP solution 二、服务器安装与配置 1 安装 安装的过程非常简单&#xff0c;直接下一步就可以了&#xff0c;需要…

【热部署】springboot-devtools

目录 pom idea配置 1 2 2021往后的idea版本 之前的idea版本 3 说明 注意 pom <!-- <!&ndash; 热部署 &ndash;>--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devt…

前端开发中的ajax请求、axios封装

目录 浏览器http请求 同步 js标签跨域、url 异步ajax、websock协议 ajax是异步的技术术语&#xff0c;最早的api是xhr&#xff08;XMLHttpRequest&#xff09; fetch es6 api axios 封装axios src/utils/request.ts src/utils/func.ts SSO&#xff08;Single Sign-On…

基于JAVA SpringBoot和Vue UniApp外卖订餐小程序

随着社会的发展和进步&#xff0c;网络信息技术的迅速发展已经渗透到我们生活的各个角落&#xff0c;传统餐饮业也受到了很大的影响&#xff0c;大部分传统中餐馆都开门&#xff0c;最多只能通过一个电话预约。但是在中国春节长假期间&#xff0c;餐厅不能接待这么多顾客。因此…

zabbix6.0LTS 配置proxy分布式监控

一、环境介绍 角色IP备注zabbix_server192.168.1.17zabbix_proxy192.168.1.14rpm包方式安装zabbix_agent192.168.1.18源码包安装 二、部署zabbix_proxy数据库 zabbix_proxy必须要安装一个数据库.zabbix官网推荐使用mariadb数据库&#xff0c;本人尝试过使用mysql8.0。由于内…

一步一步学OAK之十二:DepthAI API中Nodes各节点特性总结

目录 ColorCamera节点EdgeDetector节点FeatureTracker 节点ImageManip节点IMU 节点MobileNetDetectionNetwork节点MobileNetSpatialDetectionNetwork节点MonoCamera节点NeuralNetwork节点ObjectTracker节点Script节点SpatialLocationCalculator节点SPIIn节点SPIOut节点StereoDe…

2023年华中杯数学建模A题新型镇静药物临床实验疗效分析与预测解题全过程文档及程序

2023年华中杯数学建模 A题 新型镇静药物临床实验疗效分析与预测 原题再现 临床研究是新药物研究中的关键环节。本题拟围绕一种新型镇静药物的临床实验数据分析展开。 尝试根据附件中提供的数据和相关材料&#xff0c;研究以下问题&#xff1a;   1. 关于术中、术后 24h 不良…

React V6实现v-if、v-show、v-html

功能背景 在vue中使用v-if、v-show、v-html这些命令得心应手&#xff0c;那么react是否也存在这样的命令呢&#xff1f;似乎是没有的&#xff0c;需要自己实现&#xff0c;也就是用原生的写法直接控制dom。 实际效果 代码实现 const [dialogVisible, setDialogVisible] useSt…

Linux学习之守护进程

守护进程是daemon&#xff08;也称作精灵进程&#xff09;&#xff0c;守护进程不需要终端就可以启动起来&#xff0c;另外它的日志会打印到一些特殊文件中&#xff0c;并且占用的目录是根目录&#xff0c;避免占用其他目录&#xff0c;避免想要卸载其他目录时&#xff0c;报无…

taobao/天猫整店采集(店铺宝贝列表接口)

对于做竟店分析来说&#xff0c;首先要知道店铺有哪些商品&#xff0c;店铺宝贝列表则提供了这样的入口&#xff0c;可以查看该店铺的所有宝贝&#xff0c;也可以通过关键词全局搜索来获取店铺宝贝&#xff0c;但搜索会夹带这很多推荐的结果在里面&#xff0c;会比较混乱。 淘宝…

软件破解专题01

玩脱壳&#xff1f; 破解的功能&#xff1a;可以把收费软件免费使用 推荐论坛&#xff1a;pyg论坛》www.chinapyg.com 逆向&#xff1a;团队合作&#xff0c;有条件可以参加ctf大赛&#xff0c;这个应该是进步最快的途径 一个很强的开源项目&#xff1a;de4dot 作者…

Qt加载百度地图实现地图浏览(一)

一、功能介绍 在使用Qt中的QWebEngineView实现加载百度地图,并提供地图浏览功能。用户可以在Qt应用程序中显示百度地图,并使用常见的地图操作(如缩放、平移等)进行交互。 QWebEngine用于在Qt应用程序中嵌入Web内容。提供了对现代Web技术(如HTML5、CSS3、JavaScript等)的…

【Java高级编程】网络编程

网络编程 1、InetAddress类的使用1.1、实现网络通信需要解决的两个问题1.2、网络通信的两个要素1.3、通信要素一&#xff1a;IP和端口号1.4、通信要素二&#xff1a;网络通信协议1.5、TCP和UDP的区别1.6、TCP三次握手和四次挥手 2、TCP网络编程3、UDP网络编程4、URL编程4.1、UR…

14-上传文件

目录 1.核心方法 1.1.HttpServletRequest 类方法 1.2.Part 类方法 2.代码示例 2.1.通过form表单方式提交文件 2.2.通过Postman来模拟上传文件 2.2.1.简易版文件上传 2.2.2.正式版&#xff0c;可以上传多个图片&#xff0c;不会覆盖 数据提交有3种方式&#xff1a; form…

6.28学习 babel转换,es6的装饰器

6.28学习 babel转换&#xff0c;es6的装饰器 1.babel转换1.1出现问题1.2babel转换 2.装饰器2.1类装饰器2.2方法装饰器 1.babel转换 1.1出现问题 先来一段代码&#xff0c;运行&#xff0c;有可能是会报错的&#xff0c;为什么呢&#xff1f;因为JS以前只能运行在浏览器中&…

Bokeh 绘图基础与常用功能

Reference | Getting started with Bokeh – Medium Post 在 Github 上查看交互式的绘图结果 | Bokeh 绘图入门 – Posted by Paradise 在这篇文章中&#xff0c;从最基本的绘图开始&#xff0c;逐步学习 Bokeh 中常用的绘图功能&#xff0c;目标是能满足大部分基础的绘图需求。…

密码学—Vigenere加密Python程序

文章目录 维吉尼亚加密加密算法解密算法 注意事项 维吉尼亚加密 古典密码&#xff0c;属于多表加密。 怎么就是多表了&#xff1f; 维吉尼亚密码的加密算法实质是凯撒密码&#xff0c;因为他是先分好小组&#xff0c;然后用密钥串对应着分好组的每一个字母进行加密&#xff08…