Redis 单线程问题 BigKey问题

前言

简单的redis基础类型以及常用操作我们都也已经介绍过了

现在今天我们来谈谈redis对于单线程是需要怎么理解的

以及redis假设遇见大key我们需要怎么去查询和删除呢???

redis单线程

假设有个人现在问你一个问题:redis是单线程的还是多线程的

这个问题本身就不严谨

就像问java有没有泛型是一样的

这和版本有关,redis在4之前是不存在多线程的

那么为什么呢,我们接下来聊

redis4也是仅仅在一些操作中简单支持了多线程

但是还是在redis6/7中才完全支持多线程

我们先说说这个单线程是什么意思吧

这里的单线程主要是说对于网络IO和键值对读写是由一个线程来完成的

可以理解为redis的工作线程是单线程的

但是redis的整体还是多线程的

比如aof集群复制数据等等    

单线程为啥快??

我们可以从两点来答

1.Redis使用内存操作,没有大量耗时的磁盘IO操作,性能较高

2.redis底层的数据结构使得他的大部分查找和操作都是O(1)的时间复杂度

3.redis使用了多路复用的技术来监听多个socket客户端,这样就可以避免IO阻塞的操作了

4.避免了上下文切换,省去了多线程竞争的开销,不会存在死锁的问题

IO多路复用

这里再介绍一下IO多路复用

其实我们理解的万事万物皆为文件是因为比如说各种网卡什么的都可以以文件形式表示

这里的IO多路复用我们可以理解为此时假设有三个用户和我建立连接,像做一些事情

但是如果其中某个资源迟迟没有结束就会出现对应的阻塞

这里IO多路复用就是一个线程监听多个socket

将返回的fd文件描述符丢给内核

当其中的任何一个文件描述符具备读写条件的时候就放进就绪队列

直接执行就绪队列的操作即可

就避免了线程的阻塞等等

那单线程这么好,为啥还用多线程呢???

1.时代的发展

2.比如通常删除一个key非常的快

但是删除一个大key就会导致这里卡顿或者阻塞

这里使用惰性删除就可以很好的解决这个问题

使用unlink来进行删除大key

3.还有就是对redis的主要瓶颈其实是内存和网络带宽

但是这里就有可能出现单个线程处理网络请求的速度比不上硬件处理的速度

所以现在对于读写还是使用单线程来操作

但是对于网络IO就使用多线程来操作了

归根结底还是硬件的发展使然

下面我们介绍一下一个redis请求的全线路流程吧

首先是主线程建立连接

放入等待队列

将socket分配给IO线程 

然后IO线程和对应的socket进行绑定  这里就是多线程

然后解析请求等操作也是多线程来完成的

执行结束之后交给主线程使用IO多路复用技术进行对应的操作

执行完成之后不是直接返回而是刷进缓冲区,等待IO线程回写socket

这里我们就可以发现这里的IO线程也是多线程的

只有主线程是单线程的操作

IO线程其实是多线程的操作 

redis默认的配置是不开启多线程的

我们可以通过对应的配置文件来开启多线程

 什么时候开启呢

假设这个时候redis出现了吞吐量不大,但是cpu此时占用率又不高,这个时候就可以开启多线程来提升效率

常用配置

BigKey问题

我先抛出几个常见的面试题

1.海量数据中查询出某个固定的前缀的key如何操作

2.你如何限制keys */flushdb/flushall等危险操作的误用?

3.memory usage命令是啥意思

4.多大算BigKey呢,如何发现并删除呢

5.BigKey的调优如何解决,惰性释放了解过嘛?

6.生产上有一千万个记录,怎么遍历

我们这里先写100w个数据进去

使用pipe管道写入数据库

for((i=1;i<=100*10000;i++)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;


cat /tmp/redisTest.txt | /opt/redis-7.0.0/src/redis-cli -h 127.0.0.1 -p 6379 -a 111111 --pipe


注意这里的地址端口都需要修改

这里假设需要查询不建议使用keys *

我们可以使用一个新命令

scan命令

对应的危险的命令我们可以在conf文件中将其标注注释掉

类似这样

我们可以尝试一下禁用keys *等操作

禁用完了就可以看到对应的指令已经无法使用了

假设我们正常使用keys * 来查询很可能造成一个阻塞,业务一接不上就缓存雪崩了

所以是非常危险的

这里我们就引入了scan命令来查询数据

主要就是几个参数

scan  游标  模糊查询表达式  查询的数量

这里的游标是迭代器返回的

我们使用这个指令会返回一个游标和一个数组

游标作为下一个查询的输入,从0开始,结束也是0

然后可以支持前缀查询等等

最后的查询数量类似于limit

下面我们做一个简单的操作

查询5条数据

默认是查询十条数据

比如

scan 0

或者是前缀查询

对于删除也是一样,下面我们引入对应的删除操作

不可以使用flushdb 即使有异步选项进行补充

我们还是推荐使用渐进删除的方式来删除大量数据

多少数据算大key?

阿里文档写的是字符串超过10K算大key

这里的大key当然不是指key 而是键值对的value

对应的其他类型的hash list set等都是不超过5000个元素算大key

大key有什么坏处呢?

大key很可能导致内存分布不均

集群迁移困难

超市删除慢 

网络流量阻塞等等

常见的实际案例?

某个明星的粉丝列表    某个月突然剧增

或者是日积月累的汇总报表等等

怎么发现大key?

使用 --bigkey参数来发现

redis-cli  -a  password -p port   --bigkey

这里就会扫描出来当前实体

最大占用的是什么类型

占用多大字节数等等

这里我们就会发现最大的key是我们上次使用springboot存放的值

或者可以使用

memory usage key
查看大key的占用内存情况

渐进式删除

对于string数据类型来说,只要不是特别大可以使用del来删除

如果特别大可以使用unlink来删除对应的数据

unlink是后台启动了其他的线程去做一个异步的删除策略,也是不会产生阻塞的,较为安全

我们再演示一种hash数据类型如何删除?

我们这里就用到渐进式删除的策略了

其实就是我们一次删除一部分的值

在值被掏空之后

直接整个删除即可

下面展示对应的代码示例

对于其他的数据类型也是类似的,这里不做过多讲解

简单生产调优

这里是对于惰性释放的一些参数配置

配置了之后就可以导致redis删除的时候是开一个线程做异步删除的,无需阻塞

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

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

相关文章

植物大战僵尸杂交版2.0.88最新版+防闪退工具V2+修改工具+高清工具

植物大战僵尸杂交版&#xff0c;不仅继承原作的经典玩法&#xff0c;而且引入了全新的植物融合玩法&#xff0c;将各式各样的植物进行巧妙的杂交&#xff0c;孕育出前所未有、功能各异的全新植物。 创新的杂交合成系统 游戏引入了创新的杂交合成系统&#xff0c;让玩家可以将不…

每天CTF小练--ctfshow新手村

easy_base 密文&#xff1a;0XezFWZfNXafRjNlNXYit3dvh2cmR3Y 等号在前面&#xff0c;直接倒序后解码 ctfshow{base64_is_easy} 代码解&#xff1a; s 0XezFWZfNXafRjNlNXYit3dvh2cmR3Y print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转字符串 print(s[::-1]) #翻转…

LLaSM:Large language and speech model

1.Introduction 级联方法使用ASR将语音输入转化为文本输入,语音到文本会导致信息损失,本文提出LLaSM,一个具有跨模态对话能力的大型语音与语言模型,能够理解和遵循语音与语言指令,借鉴LLaVA,利用预训练的语音模态编码器和大语言模型,使用Whisper作为语音编码器,将语音…

iOS18 新变化提前了解,除了AI还有这些变化

iOS 18即将在不久的将来与广大iPhone用户见面&#xff0c;这次更新被普遍认为是苹果历史上最重要的软件更新之一。据多方报道和泄露的消息&#xff0c;iOS 18将带来一系列全新的功能和改进&#xff0c;包括在人工智能领域的重大突破、全新的设计元素以及增强的性能和安全性。现…

Linux之文件操作

目录 第1关&#xff1a;文件的创建 任务描述 相关知识 文件的创建 编程要求 答案&#xff1a; 第2关&#xff1a;文件打开与关闭 任务描述 相关知识 文件的打开 文件的关闭 编程要求 答案&#xff1a; 第3关&#xff1a;文件读写操作 任务描述 相关知识 文件的写操作 文件的读…

Meta Llama 3 残差结构

Meta Llama 3 残差结构 flyfish 在Transformer架构中&#xff0c;残差结构&#xff08;Residual Connections&#xff09;是一个关键组件&#xff0c;它在模型的性能和训练稳定性上起到了重要作用。残差结构最早由He et al.在ResNet中提出&#xff0c;并被广泛应用于各种深度…

项目-双人五子棋对战:匹配模块的实现(3)

完整代码见: 邹锦辉个人所有代码: 测试仓库 - Gitee.com 模块详细讲解 功能需求 匹配就类似于大家平常玩的王者荣耀这样的匹配功能, 当玩家点击匹配之后, 就会进入到一个匹配队列, 当匹配到足够数量的玩家后, 就会进入确认页. 在这里, 我们主要实现的是1 - 1匹配功能, 首先先…

【Git】分支管理 -- 详解

一、理解分支 分支就是科幻电影里面的平行宇宙&#xff0c;当你正在电脑前努力学习 C 的时候&#xff0c;另一个你正在另一个平行宇宙里努力学习 JAVA。 如果两个平行宇宙互不干扰&#xff0c;那对现在的你也没啥影响。不过&#xff0c;在某个时间点&#xff0c;两个平行宇宙…

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

作者&#xff1a;文婷 引言 如何正确使用消息队列保证业务集成链路的稳定性&#xff0c;是消息队列用户首要关心的问题。ApsaraMQ Copilot for RocketMQ 从集成业务稳定性、成本、性能等方面帮助用户更高效地使用产品。 背景 消息队列产品通过异步消息的传递&#xff0c;来…

使用Qt对word文档进行读写

目录 开发环境原理使用的QT库搭建开发环境准备word模板测试用例结果Gitee地址 开发环境 vs2022 Qt 5.9.1 msvc2017_x64&#xff0c;在文章最后提供了源码。 原理 Qt对于word文档的操作都是在书签位置进行插入文本、图片或表格的操作。 使用的QT库 除了基本的gui、core、…

Bond网卡

一、Bond网卡 1.1 Bond网卡概述 Bond网卡是指使用 Linux 系统中的 Bonding 技术创建的虚拟网络接口。 Bonding 技术允许将多个物理网卡&#xff08;也称为接口或端口&#xff09;绑定在一起&#xff0c;形成一个虚拟的网络接口&#xff0c;以增加网络带宽、提高网络容错性和…

【ARM Cache 及 MMU 系列文章 6 -- Cache 寄存器 CTR | CLIDR | CCSIDR | CSSELR 使用详解 1】

文章目录 Cache 常用寄存器Cache CSSELR 寄存器Cache CSSELR 使用场景Cache CSSELR 操作示例 Cache CLIDR 寄存器LoUU 介绍LoUU 使用 LoUIS 介绍CLIDR 使用 Cache CCSIDR 寄存器 Cache 常用寄存器 ARM Cache 常用到寄存器有以下几个&#xff1a; CSSELR, Cache Size Selectio…

VS2022,lib调用dll工程的一个函数

lib工程本身是一个静态库工程&#xff0c;没有链接器设置。然而&#xff0c;我们依然可以在lib工程中调用DLL工程中的函数&#xff0c;只需要确保头文件正确导入&#xff0c;并在最终使用lib的可执行文件项目中正确链接DLL的.lib文件。下面是一个详细的步骤说明&#xff1a; 假…

Windows 宿主机访问 VirtualBox 虚拟机中创建的 docker 容器中的 mysql8.0 的数据

一、场景需求 在开发环境中&#xff0c;一般使用 windows 系统进行开发&#xff0c;但需要在 linux 系统中创建运行 mysql8.0 的 docker 容器中进行测试&#xff08;win10特定版本或win11才能安装 docker&#xff09;&#xff0c;为了方便还需要在 windows 系统中通过 SQLyog …

python ---requests

python包管理工具 pip 若发现报错&#xff0c;则可以通过 -i 命令指定软件源 requests库安装 通过 pip &#xff0c;如上 或通过 pycharm 搜索 requests &#xff0c;并安装即可 下载成功的证明 requests库使用 模拟 http 重要参数如下 如何模拟发包 支持模拟各种 http meth…

前端_防抖节流

目录 一、防抖&#xff08;debounce&#xff09; 1.使用场景 2.js代码实现 3.lodash工具库使用 二、节流&#xff08;throttle&#xff09; 1.使用场景 2.js代码实现 3.lodash工具库使用 前端做项目&#xff0c;为了防止用户因为网络不好数据响应慢&#xff0c;导致进行…

ARM的工作模式

ARM的几种工作模式 User : 非特权模式&#xff0c;大部分任务执行在这种模式 FIQ : 当一个高优先级&#xff08;fast) 中断产生时将会进入这种模式IRQ : 当一个低优先级&#xff08;normal) 中断产生时将会进入这种模式 Supervisor&#xff08;SVC&#xff09; : 当复位或软中断…

利用短视频平台,轻松引流获客:自动私信评论策略全解析

在数字化时代&#xff0c;短视频已成为互联网流量的新蓝海&#xff0c;其独特的视觉吸引力和高度的用户粘性为各行各业提供了前所未有的营销机遇。无论是初创企业还是成熟品牌&#xff0c;都能通过短视频平台有效触达目标客户&#xff0c;实现高效引流与获客。本文将深入探讨如…

高通开发系列 - 借助libhybris库实现Linux系统中使用Andorid库(2)

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅&#xff01; 你的喜欢就是我写作的动力&#xff01; 返回&#xff1a;专栏总目录 目录 参考上一篇文章&#xff1a;高通开发系列 - 借助libhybris库实现Linux系统中使用And…

高并发短视频系统设计:架构、存储与性能优化全解

1. 系统概况与需求分析 1.1 短视频系统简介 当前短视频行业的快速发展&#xff0c;加上用户对高清、流畅观看体验的需求不断提升&#xff0c;对系统的并发处理能力、视频处理速度、存储效率等多方面都提出了极高的要求。那么&#xff0c;我们首先需要了解一个完整的短视频系统…