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删除的时候是开一个线程做异步删除的,无需阻塞

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

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

相关文章

I.MX6ULL 串口格式化函数移植实验

系列文章目录 I.MX6ULL高精度延时实验 I.MX6ULL高精度延时实验 系列文章目录一、前言二、串口格式化函数简介三、硬件原理分析四、实验程序编写五、编译下载验证 一、前言 上一节实验实现了 UART1 基本的数据收发功能&#xff0c;虽然可以用来调试程序&#xff0c;但是功能太单…

蒙层(css)

如何在 Vue 中实现一个包含图像和蒙层效果的组件&#xff1f;这个组件根据某个条件显示或隐藏蒙层&#xff0c;用于表示图像是否已读。 1. 创建基础模板 首先&#xff0c;我们在模板中使用 div 包裹我们的图像组件 GraphImage&#xff0c;并为最外层 div 设置 position: relat…

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱

使用Hadoop MapReduce分析邮件日志提取 id、状态 和 目标邮箱 在大数据处理和分析的场景中&#xff0c;Hadoop MapReduce是一种常见且高效的工具。本文将展示如何使用Hadoop MapReduce来分析邮件日志&#xff0c;提取邮件的发送状态&#xff08;成功、失败或退回&#xff09;和…

Rethinking overlooked aspects in vision-language models

探讨多模态视觉语言模型的一些有趣结论欢迎关注 CVHub!https://mp.weixin.qq.com/s/zouNu-g-33_7JoX3Uscxtw1.Introduction 多模态模型架构上的变化不大,数据的差距比较大,输入分辨率和输入llm的视觉token大小是比较关键的,适配器,VIT和语言模型则不是那么关键。InternVL-…

Ubuntu 20.04 LTS配置JDK、Git

一、配置JDK 1.1 更新系统 执行以下命令 sudo apt update 出现以下界面即为安装成功 1.2 安装openjdk-11-jdk Ubuntu20.04中没有默认JDK&#xff0c;执行以下指令安装&#xff0c;默认会自动配置一些必要环境变量 sudo apt install openjdk-11-jdk 1.3 配置环境变量&…

每天五分钟深度学习PyTorch:Tensor张量的索引和切片

本文重点 有时候当我们拥有一个Tensor张量的时候,我们可能需要获取它某一维度的信息,那么此时我们就需要索引和切片的技术,它们可以帮助我们解决这些问题。 切片操作 a是四维的,然后默认是从第一维开始取,逗号表示取不同的维度 a[:2]表示第一维取0,1,后面三维取所有 …

场外个股期权交易最新指南

场外个股期权交易最新指南 场外个股期权作为一种灵活的衍生品工具&#xff0c;允许投资者在特定条件下对交易所指定的股票进行买卖。相较于标准化的场内个股期权&#xff0c;场外个股期权为投资者提供了更大的自由度。以下是关于场外个股期权交易的基本步骤和要点&#xff1a;…

通信技术振幅键控(ASK)调制与解调硬件实验

一、实验目的 1. 掌握用键控法产生ASK信号的方法&#xff1b; 2. 掌握ASK非相干解调的原理。 二、实验内容 1. 观察ASK已调信号的波形&#xff1b; 2. 观察ASK解调信号的波形。 三、实验器材 1. 双踪示波器&#xff1b; 2. 通信原理实验箱信号源模块、③、④、⑦号模块。…

全息之镜,未来的眼镜

全息之镜&#xff0c;作为未来眼镜的一种设想和展望&#xff0c;凭借其独特的全息技术&#xff0c;将在未来带来全新的视觉体验和应用场景。以下是关于全息之镜未来的详细分析和展望&#xff1a; 一、技术原理与特点 全息之镜利用全息技术&#xff0c;通过干涉、衍射和折射等…

【踏雪无痕的痕六】——数学中有意思的问题

一、背景介绍 提出一个问题往往比解决一个问题更有意义&#xff0c;因为提出一个问题相当于提出了一个思考问题的维度&#xff1b;而解决一个问题是沿着这个维度将已有的知识串起来的过程 三、过程 1.数人数你会吗&#xff1f; 小名再第10位&#xff0c;小李再第15位&#…

Linux下SpringBoot项目部署(centos系统)

一、首先找到自己的sql文件&#xff0c;没有就从数据库挪进来 二、在Maven下打包一下&#xff08;点击package&#xff09;&#xff0c;看到BUILD SUCCESS就是打包好了 三、将上面两个文件分别挪到 linux 中对应的文件&#xff0c;没有就创建一个&#xff08;我的是spring_blog…

【微机原理与汇编语言】并行接口8255实验

一、实验目的 掌握可编程并行接口芯片8255的工作原理及初始化方法掌握8255在实际应用中的硬件连接及编程应用 二、实验要求 根据实验室现有条件&#xff0c;针对实验任务&#xff0c;设计实验方案并进行实现。 三、实验内容 启动0#计数器&#xff0c;每计5个数&#xff08…

攻防世界—webbaby详解

1.ssrf注入漏洞 ssrf&#xff08;服务端请求伪造&#xff09;是一种安全漏洞&#xff0c;攻击者通过该漏洞向受害服务器发出伪造的请求&#xff0c;从而访问并获取服务器上的资源&#xff0c;常见的ssrf攻击场景包括访问内部网络的服务&#xff0c;执行本地文件系统命令&#…

Linux基础指令磁盘管理002

LVM&#xff08;Logical Volume Manager&#xff09;是Linux系统中一种灵活的磁盘管理和存储解决方案&#xff0c;它允许用户在物理卷&#xff08;Physical Volumes, PV&#xff09;上创建卷组&#xff08;Volume Groups, VG&#xff09;&#xff0c;然后在卷组上创建逻辑卷&am…

双指针: 盛水最多的容器

目录 描述 解法 盛水最多的容器_牛客题霸_牛客网 描述 给定一个数组height&#xff0c;长度为n&#xff0c;每个数代表坐标轴中的一个点的高度&#xff0c;height[i]是在第i点的高度&#xff0c;请问&#xff0c;从中选2个高度与x轴组成的容器最多能容纳多少水 1.你不…

【python】ModuleNotFoundError: No Module Named ‘openyxl’

成功解决“ModuleNotFoundError: No Module Named ‘openyxl’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No Module Named openyxl这样的错误通常意味着Python解释器无法找到名为openyxl的模块。然而&#xff0c;这里存在一个常见的拼写错误&#…

计算机发展史 | 从起源到现代技术的演进

computer | Evolution from origins to modern technology 今天没有参考资料哈哈 PPT&#xff1a;&#xff08;评论区&#xff1f;&#xff09; 早期计算工具 算盘 -算盘是一种手动操作的计算辅助工具&#xff0c;起源于中国&#xff0c;迄今已有2600多年的历史&#xff0c;是…

实验9 静态路由配置

实验9 静态路由配置 一、 原理描述二、 实验目的三、 实验内容四、 实验配置五、 实验步骤 一、 原理描述 网络中的每个路由器都会维护一张路由表或转发表。路由表的表项记录着目的网络信息以及下一跳I 地址。路由表可以手动配置&#xff0c;也可以通过路由算法动态生成。静态…

使用 MDC 实现日志链路跟踪,包教包会!

在微服务环境中&#xff0c;我们经常使用 Skywalking、Spring Cloud Sleut 等去实现整体请求链路的追踪&#xff0c;但是这个整体运维成本高&#xff0c;架构复杂&#xff0c;本次我们来使用 MDC 通过 Log 来实现一个轻量级的会话事务跟踪功能&#xff0c;需要的朋友可以参考一…

官宣!2024 MongoDB Developer Day来了!北上深三场等你集结!

北上深开发者 专为你们打造的 MongoDB Developer Day 来了&#xff01; 动手实操工作坊➕模型设计优化专场 学习 NoSQL 数据建模的最佳实践 深入探索 MongoDB 的各种可能性 和开发者同行和 MongoDB 技术专家 一起度过充实的一天&#xff01; 北京&#xff08;6/22&…