Redis的数据结构与单线程架构

"飞吧,去寻觅红色的流星"


Redis中的五种数据结构和编码        

        Redis是一种通过键值对关系存储数据的软件,在前一篇中,我们可以使用type命令实际返回当前键所对应的数据结构类型,例如: String\list\hash\set等等。  

        但这些所有的数据结构都是对外表现的,也就是底层可能不是真正的列表,不是真正所谓的所谓的哈希!实际上Redis针对每种数据结构都有⾃⼰的底层内部编码实现,而且是每个类型都有多种实现方式,这样Redis能够在不同的场景下,选择使用合适的内部编码。

数据结构: redis承诺给你的,也可以理解为数据类型

编码方式: redis数据类型的底层实现

数据结构内部编码
stringraw        
int
emstr
hashhashtable
ziplist
listlinklist
ziplist
sethashtable
intset
zsetskiplist
ziplist

● string:

raw表示最基本的字符串,底层是持有char类型的数组(C++),或者byte数组(Java)。

int在redis中通常会用来实现一些计数功能。

embstr 针对短字符串的优化。

● hash:
hashtable 最基本的哈希表,由redis内部哈希实现。

ziplist 当哈希表中的元素较少时,可能优化为ziplist了,压缩列表节省空间。

● list:
linkedlist 普通链表,ziplist压缩列表。在redis3.2之后引入了新的实现方式,它兼顾了linkedlist和ziplist的方式——quicklist。quicklist就是一个链表,每一个元素是ziplist,把空间和效率都兼顾到。这个quicklist可以类似C++中的deque。

● set:
inset集合中存储的是整数。

● zset:
skiplist跳表,这是一个用来查找的比较复杂链式结构。它能够做到将查找效率优化到O(logN)。

为什么需要压缩?

        redis中有很多key,某些key中的value类型是一个哈希结构,如果key特别多可是value中的哈希不多时,就会尽量去压缩空间,让其整体占用空间变小。


Redis的单线程架构

        现如今,我们已经学习了redis中的基本命令以及常用的五种数据结构和它们自身内部的编码方式,对redis本身也算有了一定了解。可是你是否有和我一样有一定的疑问,就是redis为什么是一个单线程进程?换句话说,为什么redis只用一个线程来处理、执行命令呢?

        假设有多个客户端同时操作redis服务器:

        所以,单线程模型的好处就在于,执行命令的串行化,能够保障线程安全。另外,redis使用单线程模型的另外的原因在于,redis的核心业务逻辑都是短平快的!不太会占用大量的CPU资源和过多核。     

        当然单线程模型的坏处就在于,比如之前提及到的 "keys *" ,单个操作如果占用太长的时间,会导致其他请求无法得到快速地处理。

redis虽然是一个单线程模型,为啥效率这么高呢?

        这伙同redis为什么快是差不多的。这里的效率高、快都是相对于关系型数据库Mysql、oracle、SQL server等。

● redis访问的内存,而数据库访问的是硬盘。

● redis的核心功能更为简单,比起数据库而言。

        比如数据库需要提供数据插入、删除的各种约束,提供更加复杂的功能支持,这样势必会花费更多开销。

● 单线程模型,避免了线程切换和竞态产⽣的消耗。加之redis处理的场景都是些短平快的业务,不占用太多cpu,就算改成多线程提升也不明显。

● ⾮阻塞IO。Redis使⽤epoll作为I/O多路复⽤技术的实现,再加上Redis⾃⾝的事件处理模型将epoll中的连接、读写、关闭都转换为事件,不在⽹络I/O上浪费过多的时间。

如何理解多路I/O复用技术?

        所谓的多路I/O复用机制,就是指的是一个线程可以管理监测多个socket。针对Tcp而言,每一次连接都需要服务端为客户端安排一个socket。最开始的时候,是为每一个socket分配一个线程, 但一旦客户端持续增多,连接数持续增多,线程也就开的越多,系统开销越大。

        可是,一个服务器上那么多个socket,它们并非时时刻刻都会向客户端传输数据,所以,大多数情况下,tcp上的IO是处于阻塞当中,在等待客户端发送数据过来。所以,同一时刻只有少数的socket是活跃的状态,需要服务端提供服务。

Linux中提供了三套多路复用的AIP:
        select、poll、epoll,其中属epoll使用频率最高,因为它使用起来简单,并且效率是最高的(LT\ET模式) 。

Epoll底层机制:        


本篇到此结束,感谢你的阅读。

祝你好于,向阳而生~

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

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

相关文章

开源项目-数据可视化分析平台

哈喽,大家好,今天给大家带来一个开源项目-数据可视化分析平台。项目通过SpringBoot实现 数据可视化分析平台主要有数据源管理,项目管理,数据集管理,图表管理,看板管理等功能 登录 数据源管理 数据源管理功能可以添加MySQL,Oracle,PostgreSQL等类型的数据源信息 项目…

ResNet详解:网络结构解读与PyTorch实现教程

目录 一、深度残差网络(Deep Residual Networks)简介深度学习与网络深度的挑战残差学习的提出为什么ResNet有效? 二、深度学习与梯度消失问题梯度消失问题定义为什么会出现梯度消失?激活函数初始化方法网络深度 如何解决梯度消失问…

电脑共享文件夹-实现手机和其他电脑的文件同步更新

一、首先是电脑和手机需要处于同一个路由器下 二、创建一个文件夹,随便命名 三、点击属性-共享-Everyone-添加(设置读取/写入)-最后点击共享 四、这里要注意,如果电脑之前没设置过共享文件夹会有一个弹窗,点第一个就好…

OpenAI推出ChatGPT企业版,提供更高安全和隐私保障

🦉 AI新闻 🚀 OpenAI推出ChatGPT企业版,提供更高安全和隐私保障 摘要:OpenAI发布了面向企业用户的ChatGPT企业版,用户可以无限制地访问强大的GPT-4模型,进行更深入的数据分析,并且拥有完全控制…

AI助力智能安检,基于图像目标检测实现危险品X光智能安全检测系统

基于AI相关的技术来对一些重复性的但是又比较重要的工作来做智能化助力是一个非常有潜力的场景,关于这方面的项目开发实践在我之前的文章中也有不少的实践,感兴趣的话可以自行移步阅读即可:《AI助力智能安检,基于目标检测模型实现…

配置uniapp调试环境

目录 uni-app介绍 uni-app开发工具HBuilderX 创建项目前提条件 uni-app项目结构 配置mumu模拟器 uni-app生命周期 1.应用生命周期 小程序规范 2.页面生命周期-小程序规范 3.组件生命周期 vue规范 uni-app登录按钮方法 uni-app发布安卓app uni-app介绍 uni-app 是一个…

湖北咸宁农业三维扫描数字化农业3d打印制造应用-CASAIM中科广电

农业是人类衣食之源、生存之本,是一切生产的首要条件,CASAIM在农业三维扫描和3d打印应用上有丰富经验。 1.三维扫描技术在农业领域的应用 CASAIM三维扫描是集光学、机电和计算机技术于一体的高新无损检测技术,能够对实物的空间外形、结构乃…

【算法与数据结构】513、LeetCode找树左下角的值

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:这道题用层序遍历来做比较简单,最底层最左边节点就是层序遍历当中最底层元素容器的第一个值…

Nacos基础(2)——nacos的服务器和命名空间 springBoot整合nacos 多个nacos配置的情况

目录 引出nacos服务器和命名空间Nacos服务器命名空间 springBoot整合nacosspringcloud Alibaba 版本与springcloud对应关系引包配置maincontroller 报错以及解决【报错】错误:缺少服务名称报错:9848端口未开放 启动测试引入多个nacos配置多个配置的情况没…

【MCU】SD NAND芯片之国产新选择

文章目录 前言传统SD卡和可贴片SD卡传统SD卡可贴片SD卡 实际使用总结 前言 随着目前时代的快速发展,即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问: 大家好,请问有没有SD卡芯片,可以直接焊接到P…

香港服务器怎么打开SSH

​  SSH是一种远程登录协议,可以通过加密方式在网络上安全地传输数据。它允许用户在远程服务器上执行命令,管理文件和目录,并进行其他系统管理任务。 如何打开SSH服务? 1.确认已安装OpenSSH服务器: 你可以通过命令sudoapt-geti…

Excel显示此值与此单元格定义的数据验证限制不匹配怎么办?

总结:1、在编辑excel文档的时候,弹出此时预测单元格定义的数据验证,限制不匹配的提示。2、这是我们点击菜单来的数据菜单。3、然后点击数据工具栏的数据验证下拉按钮。4、在弹出的菜单中选择数据验证的菜单项。5、然后在打开的窗口中点击左下…

Jmeter(二十七):BeanShell PostProcessor跨线程全局变量使用

在性能测试中,两个相关联的接口不一定都在同一个线程组,遇见这种情况时,我们要进行跨线程组传参,此处用登录和查询配送单两个请求举例; 1、登录请求中配置json提取器,将接口返回的token保存在变量中&#…

Python爬虫异常处理实践:处理被封禁和网站升级问题

在这篇文章中,我们将一起探讨Python爬虫异常处理实践,特别关注处理被封禁和网站升级问题。让我们一起来看看如何解决这些问题,提高我们爬虫程序的稳定性和可靠性。   首先,我们要了解为什么会遇到这些问题。网站封禁爬虫的原因主…

从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题

目录 1. 可变参数模板 1.1 展开参数包 1.1.1 递归函数方式展开 1.1.2 逗号表达式展开 1.2 emplace相关接口 2. lambda表达式(匿名函数) 2.1 C11之前函数的缺陷 2.2 lambda表达式语法 2.3 函数对象与lambda表达式 3. 包装器 3.1 function包装器…

不同子网络中的通信过程

从输入www.baidu.com经历了什么 一、DNS(网址->IP) 二、ARP(IP->MAC) A->B:有数据发送,数据封装ip之后发现没有主机B的mac地址。然后ARP在本网段广播:检查目标地址和源地址是否在同一…

【程序猿书籍大放送:第二期】《强化学习:原理与Python实战》

🌹欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 爱书不爱输的程序猿:送书第二期 一、搞懂大模型的智能基因,RLHF系统设计关键问答1.RLHF是什么?2.RLHF适用于哪些任务?3…

Git仓库简介

1、工作区、暂存区、仓库 工作区:电脑里能看到的目录。 暂存区:工作区有一个隐藏目录.git,是Git的版本库,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区&#xf…

vue数字输入框

目录 1.emitter.JS function broadcast (componentName, eventName, params) {this.$children.forEach(child > {var name child.$options.componentNameif (name componentName) {child.$emit.apply(child, [eventName].concat(params))} else {broadcast.apply(child, …

基于Spring Boot的软件缺陷追踪系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频: 基于Spring Boot的软件缺陷追踪系统的设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 微信小程序 后端:Java spri…