redis中的不同线程

redis单线程是指什么?

redis的所有命令处理都在同一个线程中完成

redis为什么采用单线程?

redis中存在多种数据结构存储value,如果采用多线程,加锁会很复杂、加锁力度不阿红控制,同时,采用多线程涉及频繁的cpu上下文切换,抵消多线程的优势。

redis 存储结构

redis采用hashtable组织其存储的kv数据

hashtable字典实现

redis 中 hashtable 组织是通过字典来实现的;hash 结构当节点超过 512 个或者单个字符串长度大于 64 时,hash 结构采用字典实现

数据结构

typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next;} dictEntry;typedef struct dictht {dictEntry **table;unsigned long size;// 数组长度
unsigned long sizemask; //size-1unsigned long used;//当前数组当中包含的元素
} dictht;typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx; /* rehashing not in progress if rehashidx == -1 */int16_t pauserehash; /* If >0 rehashing is paused (<0 indicates coding error) 
用于安全遍历*/} dict;

冲突

抽屉原理 :n+1个苹果放在 n 个抽屉中,苹果最多的那个抽屉至少有 2 个苹果;64位整数远大 于数组的长度,比如数组长度为 4,那么 1、5、9、1+4n 都是映射到1号位数组;所以大概 率会发生冲突

抽屉就是hashtable,苹果就是对应k-v对。

负载因子

负载因子 = used / size ;

used 是数组存储元素的个数,size是hashtable大小

负载因子越小,冲突越小;负载因子越大,冲突越大;

redis 的负载因子是 1;

扩容

如果负载因子 > 1,为了避免频繁的hash冲突,则会发生扩容,即申请一个新的的数组;扩容的规则是翻倍;

如果正在 fork(在 rdb、aof 复写以及 rdb-aof 混用情况下)时,会阻止扩容;但是此时若负载 因子 > 5,索引效率大大降低, 则马上扩容;这里涉及到写时复制原理

扩容后的渐进式rehash

rehash的原因

扩容后,hashtable的size发生改变,基于原来size的映射规则不在适用

rehash步骤

将 ht[0] 中的元素重新经过 hash 函数生成 64 位整数,再对 射到 ht [1] ;

渐进式rehash的原因

当 hashtable 中的元素过多的时候,不能一次性 rehash 到 ht[1] ;这样会长期占用 redis,其他 命令得不到响应;所以需要使用渐进式 rehash;

渐进式规则

 1. 分治的思想,将 rehash 分到之后的每步增删改查的操作当中;

2. 在定时器中,最大执行一毫秒 rehash ;每次步长 100 个数组槽位;

处于渐进式 rehash 阶段时,不会会发生扩容缩容

缩容

如果负载因子 < 0.1 ,则会发生缩容;缩容的规则是恰好包含 used 的 2^n

恰好的理解:假如此时数组存储元素个数为 9,恰好包含该元素的就是2^{4} ,也就是 16;

redis-value存储转换

跳表

理想跳表到概率跳表

redis跳表

redis IO多线程处理

为什么要采用IO多线程?

多个连接同时发送数据到redis时,会导致IO密集操作(read和send)和cpu密集型操作(decode和encode),如果采用单线程处理,就只能串行的处理每个连接的数据,但是read、decode、encode和send是可以并行执行的。

处理流程

1.主线程将IO密集型任务和cpu密集型任务放入全局队列中,并分配给每个IO线程并行执行。

2.所有的命令处理由一个线程单独执行

3.结果处理再交由每个IO线程执行。

redis的单线程为什么高效?

1.采用hashtable,使其增删改查操作时间复杂度为O(1),同时采用渐进式rehash,避免长时间对redis的占用。

2.对不同value采用高效的数据结构,同时基于节点数量会对数据结构进行切换。

3.采用高效的reactor网络模型,基于IO多路复用,实现对网络多客户端连接的快速响应。

柔性数组

https://github.com/0voice

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

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

相关文章

基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统

基于微信小程序的家教服务平台的设计与实现/基于asp.net/c#的家教服务平台/基于asp.net/c#的家教管理系统

安全审计-iptales防火墙设置

文章目录一、iptales防火墙设置1.ip规则设置2.ip端口规则设置3.删除规则4.INPUT默认设置5.ping、本地访问规则6.保存还原规则7.查看清除规则一、iptales防火墙设置 1.ip规则设置 #允许ip访问本服务器 iptables -I INPUT -s 192.168.205.129 -p tcp -j ACCEPT#允许某IP或某网段…

Linux小白加油站,第二周

1.grep命令中哪个选项可以忽略大小写进行搜索?grep -i 2.如何用grep命令查找包含”error关键字的日志文件并返回文件名?grep -lr3.解释grep命令中^f...d$这个表达式的含义^f&#xff1a;以f开头..&#xff1a;任意两个字符d$&#xff1a;以d结尾4.如何过滤掉文件中的注释行以…

【前端基础】19、CSS的flex布局

一、FlexBox概念 FlexBox翻译为弹性盒子。 弹性盒子是一种用于按行或按列布局元素的一维布局方式。元素可以膨胀以填充额外的空间&#xff0c;收缩以适应更小的空间。我们使用FlexBox来进行布局的方案称为flex布局。二、flex布局的重要概念 两个重要的概念 开启flex布局的元素叫…

Effective C++ 条款46:需要类型转换时请为模板定义非成员函数

Effective C 条款46&#xff1a;需要类型转换时请为模板定义非成员函数核心思想&#xff1a;当模板类需要支持隐式类型转换时&#xff0c;应将非成员函数声明为友元并定义在类内部&#xff08;或通过辅助函数实现&#xff09;&#xff0c;以绕过模板参数推导的限制&#xff0c;…

用Python对机器学习数据进行缩放

许多机器学习算法期望数据被一致地缩放。 在为机器学习扩展数据时&#xff0c;你应该考虑两种常用的方法。 在这个教程中&#xff0c;您将了解如何为机器学习重新缩放您的数据。阅读完这个教程后&#xff0c;您将知道&#xff1a; 如何从头开始对您的数据进行标准化。如何从…

Application-properties 配置大全

SpringBoot - application.properties 配置大全 SpringBoot项目最重要也是最核心的配置文件就是application.properties&#xff0c;所有的框架配置都需要在这个配置文件中说明&#xff0c;以下配置不会的可以进行查阅并修改 &#xff03;SPRING CONFIG&#xff08;ConfigFileA…

MXFP4量化:如何在80GB GPU上运行1200亿参数的GPT-OSS模型

大型语言模型&#xff08;Large Language Models, LLMs&#xff09;如GPT-OSS、GPT-4、LLaMA和Mixtral的快速发展显著提升了人工智能的能力边界&#xff0c;但同时也带来了严峻的内存资源挑战。以1200亿参数的模型为例&#xff0c;在FP16精度下仅权重存储就需要约240GB的内存空…

Unity进阶--C#补充知识点--【Unity跨平台的原理】了解.Net

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找一.什么是.Net.Net是指微软一整套技术体系的统称与代号包含的内容有&#xff1a;框架体系&#xff1a;.Net Frameword&#xff0c; .Net Core&#xff0c; Mono开发语言&#xff1a;C#&a…

论文浅尝 | 提高大型语言模型的数学推理能力的学习定理基本原理(AAAI2025)

笔记整理&#xff1a;兰雅榕&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱、大语言模型论文链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/33662发表会议&#xff1a;AAAI 20251. 动机提高开源大型语言模型&#xff08;LLM&#xff09;的数学…

母猪姿态转换行为识别:计算机视觉与行为识别模型调优指南

母猪姿态转换行为识别&#xff1a;计算机视觉与行为识别模型调优指南 1. 引言 1.1 研究背景与意义 母猪姿态转换行为识别是智能养殖领域的重要研究方向&#xff0c;通过计算机视觉技术自动识别母猪的站立、躺卧、行走等姿态变化&#xff0c;对于监测母猪健康状态、评估福利水平…

K8S集群环境搭建(一)

虚拟机镜像 ubuntu 24 虚拟机网络 虚拟网络–配置 nat模式主机ip配置宿主机ip配置 10.0.0.12 master 2c 10.0.0.15 node1 10.0.0.16 node2 10.0.0.17 node3 10.0.0.20 registersudo vi /etc/netplan/00-installer-config.yaml # 替换为实际文件名 sudo netplan applynetwork:v…

css预编译器实现星空背景图

打造梦幻星空背景&#xff1a;用CSS预处理器轻松实现动态效果 星空背景能为网页增添神秘感和视觉吸引力。通过CSS预处理器&#xff08;如Sass/Less&#xff09;可以高效实现可定制化的星空效果&#xff0c;避免重复编写纯CSS代码。以下是 Vue3 组件皮肤具体实现方法和代码示例。…

焊接机器人保护气体效率优化

在现代工业制造领域&#xff0c;焊接机器人的应用日益广泛&#xff0c;而保护气体在焊接过程中起着至关重要的作用。如何优化保护气体的效率&#xff0c;成为焊接技术发展的一个关键考量因素。WGFACS节气装置的出现&#xff0c;为焊接机器人在保护气体效率优化方面带来了显著的…

Portkey-AI gateway 的一次“假压缩头”翻车的完整排障记:由 httpx 解压异常引发的根因分析

笔者最近在本地搭建了Portkey AI Gateway&#xff08;模型路由网关&#xff09;&#xff0c;然后按照文档中的方式进行测试。结果发现&#xff0c;网关能够接收到请求&#xff0c;但是Python测试的程序却运行报错。Python代码报错信息如下&#xff1a; Traceback (most recent …

什么是Session? PHP编程中Session用法详解

一、Session的基本概念 Session 是 Web 开发中用于在服务器端存储用户临时数据的一种机制&#xff0c;它允许服务器在不同的 HTTP 请求之间识别和跟踪特定用户的状态&#xff0c;本质上是‌服务器为每个用户开辟的临时私有存储空间‌。由于 HTTP 协议本身是无状态的&#xff…

【大模型】AI平台 joyagent 2.0 的部署与测试

github链接&#xff1a;https://github.com/jd-opensource/joyagent-jdgenie 本篇博客记录下自己在配置joyagent的过程&#xff0c;以【手动初始化环境&#xff0c;启动服务】为例&#xff0c;后端调用的deepseek-chat大模型。 前言 JoyAgent是由京东云开源的企业级多智能体系统…

计算机视觉(一):nvidia与cuda介绍

背景与意义 计算机视觉 (Computer Vision, CV) 需要对图像和视频进行处理、特征提取和模型训练&#xff0c;计算量巨大。GPU (图形处理单元) 擅长并行计算&#xff0c;非常适合深度学习、卷积操作、矩阵乘法等场景。NVIDIA 作为 GPU 领域的领导者&#xff0c;推出了 CUDA (Comp…

阿里云杭州 AI 产品法务岗位信息分享(2025 年 8 月)

&#xff08;注&#xff1a;本岗位信息已获jobleap.cn授权&#xff0c;可在 CSDN 平台发布&#xff09; 一、基本信息 招聘方&#xff1a;阿里云工作地点&#xff1a;杭州信息收录时间&#xff1a;2025 年 08 月 14 日 二、职位主要职责 为 AI 相关产品全流程提供法务支持&…

医疗智慧大屏系统 - Flask + Vue实现

下面我将实现一个完整的医疗智慧大屏系统&#xff0c;使用Flask作为后端框架&#xff0c;前端使用Vue.js结合ECharts进行医疗数据的可视化展示&#xff0c;文章末尾提交源码下载。 系统设计思路 前端部分&#xff1a; 使用Vue.js构建响应式界面 使用ECharts实现各类医疗数据可…