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

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写请求量很大

相关文章:

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

一、常见命令 1.1 过期时间意外丢失 原因: SET命令如果不设置过期时间,那么Redis会自动【擦除】这个key的过期时间 1.2 DEL命令阻塞redis key是String类型时,DEL时间复杂度是O(1)key是List/Hash/Set/ZSet类型,DEL时间复杂度是…...

04. Nginx入门-Nginx WEB模块

测试环境 此处使用的yum安装的Nginx路径。 此处域名均在本地配置hosts。 主配置文件 路径:/etc/nginx/nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connection…...

Python在信息安全领域中具有重要的作用

Python在信息安全领域中具有重要的作用。下面是几个方面的说明: 网络安全:Python提供了一系列用于网络安全的库和工具,例如Scapy、Nmap等。这些工具可以应用于漏洞扫描、网络流量分析、数据包嗅探等操作,帮助检测和防御网络攻击。…...

Linux 定时备份文件到另一台服务器

1. 需求 用户要求将 Tomcat 的日志文件定时备份到另一台服务器。同事给我提供了一个写好的 java 框架,但实在不想给用户再维护另一个服务了,所以另寻他法。 2. 问题 使用 scp 等跨服务器传输命令时需要手动输入用户名的密码才可进行文件传输&#xff…...

C++输入输出(I\O)

我们知道C是由C语言发展而来的,几乎完全兼容C语言,换句话说,你可以在C里面编译C语言代码。如下图: C语言是面向过程的语言,C在C语言之上增加了面向对象以及泛型编程机制,因此C更适合中大型程序的开发,然而C…...

基本设计模式

单例模式 ES5 function Duck1(name:string){this.namenamethis.instancenull }Duck1.prototype.getNamefunction(){console.log(this.name) }Duck1.getInstancefunction(name:string){if(!this.instance){this.instance new Duck1(name)} } const aDuck1.getInstance(a) const…...

双通道音频功率放大电路,外接元件少, 通道分离性好,3V 的低压下可正常使用——D2025

D2025 为立体声音频功率放大集成电路,适用于各类袖珍或便携式立体声 收录机中作功率放放大器。 D2025 采用 DIP16 封装形式。 主要特点:  适用于立体声或 BTL 工作模式  外接元件少  通道分离性好  电源电压范围宽(3V~12V &#xff…...

Linux 内核获取函数size

方式一:通过objdump -t直接从目标文件中获取函数size #objdump -t file_unread.o | grep hook 0000000000000030 l F .text 000000000000012f hook_vfs_read0000000000000030 l F .text 000000000000012f hook_vfs_read各个字段说明 0000000000000030&#x…...

Python+neo4j构建豆瓣电影知识图谱

文章目录 数据来源数据整理导入节点和关系导入使用Subgraph批量导入节点和关系多标签实体和实体去重数据来源 http://www.openkg.cn/dataset/douban-movie-kg 该网址拥有丰富的中文知识图谱数据集,OpenKG(Open Knowledge Graph),可供研究人员使用研究。 数据整理导入 impor…...

DolphinScheduler——介绍及架构设计

目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…...

【Python】约瑟夫环问题

任务描述 据说著名历史学家 Josephus有过以下的故事:Josephus及他的朋友共41人围成一个圆圈,由第1个人开始报数,每数到3该人就必须出去,然后再由下一个人重新报数,直到圆圈上少于3人为止。Josephus 将朋友与自己安排在…...

Python成功解决AttributeError: ‘Series‘ object has no attribute ‘set_value‘

Python成功解决AttributeError: ‘Series‘ object has no attribute ‘set_value‘ 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…...

基于springboot+vue的医院药品管理系统

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

Python爬虫——Urllib库-1

这几天都在为了蓝桥杯做准备,一直在刷算法题,确实刷算法题的过程是及其的枯燥且枯燥的。于是我还是决定给自己找点成就感出来,那么Python的爬虫就这样开始学习了。 注:文章源于观看尚硅谷爬虫视频后笔记 目录 Urllib库 基本使…...

瑞_Redis_短信登录(一)

文章目录 项目介绍1 项目准备1.1 导入SQL1.2 导入后端项目1.2 导入前端项目 🙊 前言:本文章为瑞_系列专栏之《Redis》的实战篇的短信登录章节的项目准备小节。由于博主是从B站黑马程序员的《Redis》学习其相关知识,所以本系列专栏主要是针对该…...

《剑指 Offer》专项突破版 - 面试题 70 : 排序数组中只出现一次的数字(C++ 实现)

题目链接:LCR 070. 有序数组中的单一元素 - 力扣(LeetCode) 题目: 在一个排序的数组中,除一个数字只出现一次之外,其他数字都出现了两次,请找出这个唯一只出现一次的数字。例如,在…...

Linux安全加固功能

提示:工具下载链接在文章最后 目录 一.加固功能介绍二.配置加固功能1.配置安全加固功能1.1 开放目前设备监听的所有端口1.2 只开放80、443、20、21、22端口1.3 防火墙配置工具1.3.1 开放允许访问的端口1.3.2 删除允许访问的端口1.3.3 添加IP地址允许访问规则1.3.4 添加IP地址禁…...

最新AI系统ChatGPT网站H5系统源码,支持Midjourney绘画

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…...

【服务器数据恢复】昆腾存储中raid5磁盘阵列数据恢复案例

服务器数据恢复环境&故障: 10个磁盘柜,每个磁盘柜配24块硬盘。9个磁盘柜用于存储数据,1个磁盘柜用于存储元数据。 元数据存储中24块硬盘,组建了9组RAID1阵列1组RAID10阵列,4个全局热备硬盘。 数据存储中&#xff0…...

企业微信变更主体怎么改?

企业微信变更主体有什么作用?现在很多公司都用企业微信来加客户,有时候辛辛苦苦积累了很多客户,但是公司却因为各种各样的原因需要注销,那么就需要通过企业微信变更主体的方法,把企业微信绑定的公司更改为最新的。企业…...

idea大量爆红问题解决

问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...