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.rhkb.cn/news/346001.html

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

相关文章

Python通过数据验证功能在Excel文件中创建下拉列表

Excel表格的灵活性和功能性深受各行各业人士的喜爱。在Excel表格中&#xff0c;下拉列表功能是提升数据录入效率与准确性的一个重要利器&#xff0c;能够为用户提供预设的选择项&#xff0c;限制输入范围&#xff0c;避免手动输入错误&#xff0c;还能够简化数据录入过程&#…

深度学习(三)

5.Functional API 搭建神经网络模型 5.1利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.datasets import load_irisfrom sklearn.model_selection import train_test_splitfrom…

Nginx配置详细解释:(3)http模块及server模块,location模块

目录 环境概述&#xff1a; http模块中的全局模块 1. root配置主要是对主web页面的路径访问。 2.server虚拟主机 2.1基于IP&#xff1a; 2.2基于域名&#xff1a; 3.alias别名 4.location匹配 5.access模块&#xff1a; 6.验证模块 7.自定义错误页面 8.日志存放位置…

Clearedge3d EdgeWise 5.8 强大的自动化建模软件

EdgeWise是功能强大的建模软件&#xff0c;提供领先的建模功能和先进的技术&#xff0c;让您的整个过程更快更准确&#xff01;您可以获得使用自动特征提取和对象识别的 3D 建模&#xff0c;ClearEdge3D 自动建模和对象识别软件通过创建竣工文档和施工验证完成该过程。拓普康和…

Python第二语言(七、Python模块)

目录 1. 什么是模块 2. 基本语法 2.1 模块的导入方式 2.2 基本语法 import 模块名 2.3 基本语法 from 模块名 import 功能名 2.4 基本语法as 别名 3. 自定义模块 4. 调用自定义模块时&#xff0c;如何让其模块中的函数不被调用&#xff08;__name__&#xff09; 5. 调…

【数据结构与算法】使用数组实现栈:原理、步骤与应用

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f384;栈&#xff08;Stack&#xff09;是什么&#xff1f; &#x1…

安卓逆向经典案例——XX牛

安卓逆向经典案例——XX牛 按钮绑定方式 1.抓包 2.查看界面元素&#xff0c;找到控件id 通过抓包&#xff0c;发现点击登录后&#xff0c;才会出现Encrpt加密信息&#xff0c;所以我们通过控件找到对应id&#xff1a;btn_login 按钮绑定方法——第四种 public class LoginA…

开源规则引擎LiteFlow项目应用实践

本文介绍基于开源规则引擎LiteFlow&#xff0c;如何开发规则设计器&#xff0c;在低代码平台中集成规则引擎&#xff0c;并在项目中实现应用的效果。由于低代码平台使用规则引擎实现了逻辑编排的需求&#xff0c;所以本文中的叫法为“逻辑设计”、“逻辑编排”、“逻辑流引擎”…

【Android面试八股文】一图展示 Android生命周期:从Activity到Fragment,以及完整的Android Fragment生命周期

图片来源于&#xff1a;https://github.com/xxv/android-lifecycle Android生命周期&#xff1a;从Activity到Fragment 图&#xff1a;android-lifecycle-activity-to-fragments.png 完整的Android Fragment生命周期 图&#xff1a;complete_android_fragment_lifecycle.png…

设置路径别名

一、描述 如果想要给路径设置为别名&#xff0c;就是常见的有些项目前面的引入文件通过开头的&#xff0c;也就是替换了一些固定的文件路径&#xff0c;怎么配置。 二、配置 import { defineConfig } from vite import react from vitejs/plugin-react import path from path…

基础数据结构 -- 堆

1. 简介 堆可以看做是一种特殊的完全二叉树&#xff0c;它满足任意节点的值都大于或小于其子节点的值。 2. 功能 插入元素&#xff1a;插入新元素时&#xff0c;先将元素放至数组末尾&#xff0c;然后通过上浮算法自底向上调整&#xff0c;使堆保持性质。删除堆顶元素&#xff…

App UI 风格,尽显魅力

精妙无比的App UI 风格

动态内存管理(malloc,calloc,realloc,free)+经典笔试题

动态内存管理 一. malloc 和 free1. malloc2. free 二. calloc三. realloc四.动态内存的错误1.对NULL指针的解引用操作2.对动态开辟空间的越界访问3.对非动态开辟内存使用free释放4.使用free释放一块动态开辟内存的一部分5.对同一块动态内存多次释放6.动态开辟内存忘记释放&…

ROS 获取激光雷达数据(C++实现)

ROS 获取激光雷达数据&#xff08;C实现&#xff09; 实现思路 在机器人ROS系统中&#xff0c;激光雷达通常会有一个对应的节点&#xff0c;这个节点一般是由雷达的厂商提供&#xff0c;我们只需要简单的配置以下端口参数&#xff0c;就能和激光雷达的电路系统建立连接&#…

“安全生产月”专题报道:AI智能监控技术如何助力安全生产

今年6月是第23个全国“安全生产月”&#xff0c;6月16日为全国“安全宣传咨询日”。今年全国“安全生产月”活动主题为“人人讲安全、个个会应急——畅通生命通道”。近日&#xff0c;国务院安委会办公室、应急管理部对开展好2024年全国“安全生产月”活动作出安排部署。 随着科…

单臂路由的配置(思科、华为)

#交换设备 不同vlan属于不同广播域&#xff0c;不能互相通信&#xff0c;他们配置的是不同网段的IP地址&#xff0c;针对不同网段的IP地址进行通信&#xff0c;就需要用到路由技术 实现不同vlan之间的通信技术有两种 单臂路由三层交换 单臂路由 一、思科设备的单臂路由配…

AutoCAD Mechanical机械版专业的计算机辅助设计软件安装包下载安装!

AutoCAD机械版作为一款专业的计算机辅助设计软件&#xff0c;不仅具备卓越的二维绘图功能&#xff0c;更是拥有令人瞩目的3D建模工具&#xff0c;为机械设计师们提供了前所未有的创作空间。 在AutoCAD机械版的3D建模环境中&#xff0c;用户可以借助一系列简洁明了的命令&#…

【EDA】SSTA中最慢路径与最快路径统计计算

假设(X1,X2)为二元高斯随机向量,均值(μ1,μ2),标准差(σ1,σ2),相关系数ρ 定义:X=max(X1,X2),Y=min(X1,X2) SSTA中计算setup/hold的worst delay时即求X、Y,路径N对应维度为N维。 X的概率密度函数PDF为f(x)=f1(-x)+f2(-x),f1和f2为: 其中小Φ和大Φ…

在Linux上的Java项目导出PDF乱码问题

在Linux上的Java项目导出PDF乱码问题 场景&#xff1a;一个Java项目导出PDF&#xff0c;在我本地导出是没有问题&#xff0c;但是部署上Linux上后&#xff0c;导出就出现了乱码了。 处理方案 我这里使用的处理方案是在Linux服务器上安装一些PDF需要使用的字体 1.把字体上传到…

Dell服务器根据GPU温度调整风扇转速

前言 dell服务器自动风扇是根据CPU温度来调速的&#xff0c;我跑AI的时候cpu温度不高但是GPU温度很高导致显卡卡死PVE虚拟机直接挂起无法运行&#xff0c;我看了下也没有基于显卡温度调速的脚本&#xff0c;于是我就自己写了一个 基于ipmi工具 乌班图等linux先安装ipmi apt …