Redis常见的15个【坑】,避坑指南

一、常见命令

1.1 过期时间意外丢失

原因:

SET命令如果不设置过期时间,那么Redis会自动【擦除】这个key的过期时间

1.2 DEL命令阻塞redis

  • key是String类型时,DEL时间复杂度是O(1)
  • key是List/Hash/Set/ZSet类型,DEL时间复杂度是O(M),M为元素数量

1.3 RANDOMKEY阻塞redis

RANDOMKEY命令会从redis中随机取出一个key,首先会检查这个key是否过期,如果已经过期,那么Redis会删除它,这个过程就是懒惰清理;

清理完之后,redis还要找出一个【不过期】的key,返回给客户端。

整个流程就是这样的:【在master执行RANDOMKEY】

  1. master 随机取出一个 key,判断是否已过期

  2. 如果 key 已过期,删除它,继续随机取 key

  3. 以此循环往复,直到找到一个不过期的 key,返回

如果有大量key已经过期,还没来得及清理,这个循环就卡住了,耗时都花费在了清理过期key+寻找不过期key上。

【slave执行RANDOMKEY】

slave是不会主动清理过期key的,当一个key要过期时,master会先清理删除它,然后向slave发送一个DEL命令,告知slave也需要删除这个key,以此达到主从库的数据一致性。

1.4 SETBIT导致redis OOM

在使用setbit时,需要注意offset的大小,操作过大的offset也会引发redis的卡顿

1.5 MONITOR导致redis OOM

当执行monitor命令时,redis会把每条命令写到客户端的【输出缓冲区】中,然后客户端从这个缓冲区读取服务器返回的结果。

如果redis的QPS很高,会导致这个输出缓冲区内存持续增长,占用redis大量的内存资源,如果机器资源内存不足,将会面临OOM的风险。

二、数据持久化

两种持久化方式,rdb和aof

rdb是数据快照,而aof会记录每一个写命令到日志文件中。

2.1 master宕机,slave数据也跟着丢失

如果redis采用如下模式部署,就会发生数据丢失的问题

  • master-slave+哨兵部署实例
  • master没有开启数据持久化功能
  • Redis进程使用supervisor管理,并配置为【进程宕机,自动重启】

此时,如果master宕机,就会导致如下问题:

  • master宕机,哨兵还未完成切换,此时master进程立即被supervisor自动拉起
  • 但是master没有开启任何数据持久化,启动后是一个【空】实例
  • 此时slave为了跟master保持一致,会自动清空实例中的所有数据,导致slave也成了一个空实例

这样master和slave中的数据就全部丢失了。

这时,业务应用访问redis时,发现缓存中没有任何数据,就会把请求全部打到后端数据库中,进一步引发缓存雪崩,对业务影响非常大。

改进:

  • redis实例不使用进程管理工具自动拉起
  • master宕机后,让哨兵发起切换,把slave提升为master
  • 角色切换完成后,再重启master,使其退化为slave。

2.2 AOF everysec真的不会阻塞主线程吗?

这种方案的工作方式为:

redis后台线程每隔1秒,就会把AOF中的数据刷到磁盘上。【把aof刷盘的耗时操作,放到了后台子线程中去执行,避免了对主线程的影响】

刷盘流程:

  • 主线程在写 AOF page cache(write系统调用)前,先检查后台 fsync 是否已完成?

  • 后台 fsync已完成,主线程直接写AOF page cache

  • 未完成,则检查距离上次fsync过去多久?

  • 距离上次fsync成功在2秒内,那么主线程会直接返回,不写AOF page cache

  • 距离上次fsync成功大于2秒,主线程强制写AOF page cache

  • 由于磁盘IO负载过高,此时后台线程fsync会发生阻塞,那主线程在写AOF page cache时,也会发生阻塞等待(操作同一个 fd,fsync 和 write 是互斥的,一方必须等另一方成功才可以继续执行,否则阻塞等待)

即使配置的AOF刷盘策略是everysec,也依旧会有阻塞主线程的风险。

原因:磁盘IO负载过高导致fsync阻塞,进而导致主线程写AOF page cache也发生阻塞。

2.3 AOF everysec真的只会丢失1秒数据?

参考步骤4,后台线程在执行fsync刷盘时,主线程最多等待2秒不会写AOF page cache.

如果此时 Redis 发生了宕机,那么,AOF 文件中丢失是 2 秒的数据,而不是 1 秒!

为什么主线程会等待2秒不写AOF page cache?

  • 降低主线程阻塞的风险【如果无脑写AOF page cache,主线程会立即阻塞住】
  • 如果fsync阻塞,主线程就会给后台线程留出1秒的时间,等待fsync成功

2.4 RDB和AOF rewrite时,Redis发生OOM

redis在把RDB快照和AOF rewrite时,会采用创建子进程的方式,把实例中的数据持久化到磁盘上。

创建子进程时,会调用操作系统的fork函数,fork执行完成后,父进程和子进程会同时共享同一份内存数据。

此时父进程依旧是可以接收写请求的,而进来的写请求,会采用Copy On Write(写时复制)的方式操作内存数据。【先拷贝再修改,这里需要拷贝原有的内存数据到新内存中

如果业务特点是【写多读少】,且OPS非常高,在RDB和AOF 的rewrite期间,就会产生大量的内存拷贝工作,这期间修改key的范围越广,新申请的内存就越多,如果机器资源不足,就会面临OOM的风险

三、主从库同步

3.1 主从复制会丢数据吗?

会,redis的主从复制时采用【异步】方式进行的。

如果master突然宕机,可能会有部分数据未同步到slave的情况。

3.2 同样命令查询一个key,主从库却返回了不同的结果

如果一个key已经过期,但是这个key还未被master清理,此时在slave上查询这个key,会返回什么结果?

返回结果取决于以下因素:

  • redis版本【3.2以下版本,在slave上查询一个key时,并不会判断这个key是否已经过期,而是无脑返回给客户端结果】
  • 具体执行的命令
  • 机器时钟【根据本机时钟判断是否过期】

slave 查询过期 key,经历了 3 个阶段:

  1. 3.2 以下版本,key 过期未被清理,无论哪个命令,查询 slave,均正常返回 value

  2. 3.2 - 4.0.11 版本,查询数据返回 NULL,但 EXISTS 依旧返回 true

  3. 4.0.11 以上版本,所有命令均已修复,过期 key 在 slave 上查询,均返回「不存在」

3.3 主从切换导致缓存雪崩

如果slave的机器时钟比master快很多,从slave的角度来看,redis中的数据存在大量过期。

此时如果操作【主从切换】,把slave提升为新的master,成为master后就会开始大量清理过期key,就会导致以下结果:

  • master大量清理过期key,主线程发生阻塞,此时无法处理客户端请求
  • redis中数据大量过期,引发雪崩

当 master / slave 机器时钟严重不一致时,对业务的影响非常大!

所以,如果你是 DBA 运维,一定要保证主从库的机器时钟一致性,避免发生这些问题。

3.4 master/slave大量数据不一致

redis的maxmemory配置可以控制整个实例的内存使用上限,超过这个上限,并且配置了淘汰策略,那么实例就开始淘汰数据。

如果master/slave配置的maxmemory不一样,那此时就会发生数据不一致。

5.0版本增加了一个配置项:replica-ignore-maxmemory,默认 yes

3.5 slave竟然有内存泄漏的问题

redis内存泄漏

  • redis使用的是4.0以下版本
  • slave的配置项为read-only=no(从库可写)
  • 向slave写入了有过期时间的key

这时的 slave 就会发生内存泄露:slave 中的 key,即使到了过期时间,也不会自动清理。

如果你不主动删除它,那这些 key 就会一直残留在 slave 内存中,消耗 slave 的内存。

最麻烦的是,你使用命令查询这些 key,却还查不到任何结果!

4.0以上版本修复了这个问题

最好的方案是:

制定一个redis使用规范,slave必须强制设置为read-only,不允许写,这样不仅可以保证master/slave的数据一致性,还避免了slave内存泄漏的问题。

3.6 为什么主从全量同步一直失败

redis的【复制风暴】

主从全量同步失败,又重新开始同步,之后又同步失败,以此往复,恶性循环,持续浪费机器资源。

导致该问题的原因:

  • master的实例数据过大,slave在加载RDB时耗时过长
  • 复制缓冲区配置过小
  • master写请求量很大

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FRM模型十五:净值归因之Fama_French三因子模型

文章目录 一、起源二、构建因子三、投资组合的净值归因1. 市场因子2. 规模因子3.价值因子4. 基于净值的归因方法 三、代码实现 一、起源 在多因子模型推出之前,CAPM模型被视为资产定价的第一标准。随着市场不断发展,发现了越来越多CAPM模型无法解释的现…

Microsoft@ppt@快速掌握核心功能@常用功能培训

文章目录 refs动画动画的用途逐部分显示内容实现问答效果部分地修改页面内容动画效果 常用窗口对象选择窗口👺批量选择对象 如何为重叠的对象高效的命名重命名方式方案1方案2对象重命名原则重命名后如何使用tips 动画窗口👺 幻灯片管理幻灯片母版幻灯片母…

【软件测试】一个扫码支付的二维码怎么测(测试点分析)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 面试的时候&#…

VS统计代码行数

1.使用查找和替换方式 按CTRLSHIFTF (Find in files),勾上支持正则表达式, 然后输入搜索内容:^:b*[^:b#/].*$ 如图所示: 2.查看查询结果 需要注意:#开头和/开头或者空行都不计入代码量。

javascript操作DOM的方法

目录 1. 弹出框 2. 定时器 3. 导航与URL 4. 浏览器信息 5. 窗口控制 6. 屏幕信息 7. 历史对象 1. 弹出框 警告框(Alert) window.alert(这是一个警告消息); 确认框(Confirm) var isConfirmed window.confirm(您确定要执…

【开源】SpringBoot框架开发用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

Java学习笔记002——类的修饰符

在Java语言中,类的访问修饰符决定了其它类能够访问该类的方式。类有如下4种访问修饰符,在创建类时用于类的声明: 1、public: 当一个类被声明为public时,它可以从任何其他类中被访问,无论这些类位于哪个包中。通常&am…

一台服务器,最大支持的TCP连接数是多少?

一个服务端进程最大能支持多少条 TCP 连接? 一台服务器最大能支持多少条 TCP 连接? 一、原理 TCP 四元组的信息:源IP、源端口、目标IP、目标端口。 一个服务端进程最大能支持的 TCP 连接个数的计算公式:最大tcp连接数客户端的IP…

随机森林算法

[1] 随机森林是集成学习中的bagging方法.通过有放回的抽样方法训练模型.再通过对输出求均值的方式得出最终结果。其中,回归树将输入样本分配至其子节点,不同子节点对应不同的取值.再通过损失函数将样本进行训练和分配,直至达到叶子结点。回归…

StarRocks实战——特来电StarRocks应用实践

目录 一、为何引入StarRocks 二、主要应用场景 三、封装或扩展 四、集群监控预警 五、总结规划展望 5.1 使用经验分享 5.2 下一步计划 5.2.1 StarRocks集群自动安装 5.2.2 StarRocks集群高可用架构 原文大佬的这篇StarRocks应用实践有借鉴意义,这里摘抄下来…

1、Ajax、get、post、ajax,随机颜色

一、Ajax初始 1、什么是Ajax? 异步的JavaScript和xml 2、xml是什么? 一种标记语言,传输和存储数据----------现在用JSON传输数据 3、Ajax的作用 局部加载 可以使网页异步更新 4、Ajax的原理或者步骤(6步) 创建Ajax对象 if (window.X…

centos 搭建ftp服务器

项目上需要用到ftp文件服务同步,所以在测试环境进行搭建,其中遇到了一些问题,遂记录。 1、安装vsftpd软件包 打开终端并输入以下命令来安装vsftpd yum install vsftpd -y 2、运行vsftpd systemctl start vsftpd 3、测试匿名连接 我这里…

基于springboot+vue的球队训练信息管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【OBS】obs-websocket实战技巧,让你更快的了解OBS

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ 修改OBS-web源码2️⃣ 常用api汇总获取输入源类型列表获取输入源列表获取属性列表打开输入源属性设置框获取设置输入源静音状态获取特殊输入源设置(全局音频设备)打开输入源属性设置框 🛬 文章小…

HubSpot出海CRM可以为企业带来哪些好处?

HubSpot出海CRM为企业带来了许多好处,包括但不限于以下几点: 优化客户体验: HubSpot出海CRM提供了个性化的客户关系管理功能,使企业能够根据客户的地理位置、偏好和行为等因素,提供个性化的营销和服务。这有助于提高客…

数位dp 笔记

小技巧1:求区间[X, Y]可以转换为求F(Y) - F(X-1) F(X)表示0~X中满足条件的数字个数 小技巧2:可以用树的形式来看 遍历最高位,每一位分为两种情况:未达到上界和达到上界 如果走到右边最底端需加1 度的数量 求给定区间 [X,Y]中满足下列条件的…

linux系统UDP丢包问题分析思路

Linux系统UDP丢包 最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考。 在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。  1,首先网络报文通过物…

软件测试--性能测试工具JMeter

软件测试--性能测试工具JMeter 主流性能测试工具1.主流性能测试工具Loadrunner和Jmeter对比 —— 相同点2.主流性能测试工具Loadrunner和Jmeter对比 —— 不同点JMeter基本使用JMeter环境搭建1.安装JDK:2.安装Jmeter:3.注意点:JMeter功能概要1. JMeter文件目录介绍1.1 bin目…

JavaScript的`call`方法:实现函数间的调用!

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

express+mysql+vue,从零搭建一个商城管理系统10--添加商品

提示:学习express,搭建管理系统 文章目录 前言一、新建models/goods.js二、新建routes/goods.js三、添加goods表四、添加商品总结 前言 需求:主要学习express,所以先写service部分 一、新建models/goods.js models/goods.js con…