Redis远程字典服务器(3)——常用数据结构和单线程模型

news2024/9/24 15:26:27

目录

一,常用数据结构

1.0 前言

1.1 string

1.2 hash

1.3 list

1.4 set

1.5 zset

1.6 演示

二,关于单线程模型

2.1 关于Redis的单线程

2.2 Redis为什么快

一,常用数据结构

1.0 前言

Redis是采用键值对的方式来存储数据的,key强制为字符串类型,value可以为其它的类型,常用的有5种:string(字符串)、list(列表)、hash(哈希)、set(集合)、zset(有序集合),当前版本的redis支持10个,但除了上面5种的其它5种只在某些特殊场景下才会用到,到时候只需要查阅文档即可~

注意:Redis在实现上述数据结构的时候,会在源码层面,针对上述实现进行特定的优化,来达到节省 时间/空间 的效果;而这个“特定的优化”,就是指Redis内部实现这些数据类型时,会用到其它数据结构的编码方式

例子:Redis承诺,我这个hash表,它进行查询插入删除等操作都保证是O(1),所以Redis的hahs内部可能是其它的数据结构,但是能达到hash的效果,并且达到O(1)

结论:对于上面的5种数据类型,只是Redis承诺给你的,它内部的编码方式是Redis自己实现的,比如我提供一个string的类型,但是它是用字符数组实现的,但是能达到string的效果

1.1 string

数据类型内部编码
stringraw
int
embstr
  • raw:是最基本的字符串,底层就是一个char数组(C/C++)或者byte数组(Java)
  • int:Redis也可以用来实现一些“计数”这样的功能,当value就是一个整数的时候,Redis可能直接用int来存
  • embstr:这个是用来针对短字符串进行的特殊优化

1.2 hash

数据类型内部编码
hashhashtable
ziplist
  • hashtable:就是Redis内部自己的哈希表的实现,虽然实现方式可能不太一样,但是整体思路和我们之前学的差不多
  • ziplist:这个叫做“压缩列表”,也是一种优化策略,在Redis中,如果很多key的value是hash类型,而且hash里面元素比较少的时候,可能就被优化成ziplist了,能节省空间

1.3 list

数据类型内部编码
listlinklist
ziplist
  • linklist:这个就是最基本的链表结构,双向带头循环链表
  • ziplist:和上面一样,是压缩列表

上面的两种方式是老版本Redis中的实现方式,在Redis 3.2 版本后,就用quicklist来实现了

  • quicklist: quicklist本体是链表,但是里面的每个元素是ziplist,同时兼顾了两种类型的优点,把空间和效率都折衷兼顾到。(该类型有点类似于C++的deque,但是Java标准库目前我没有了解到有类似的结构)

1.4 set

数据类型内部编码
sethashtable
intset
  • hashtable:和上面一样的,是Redis自己实现的哈希表
  • intset:这个也是一个set,但是这个set里面存的类似都是int整数

1.5 zset

数据类型内部编码
zsetskiplist
ziplist

这个类型有点特殊,上面四种我们都可以在C++的STL中找到比较相似的容器,skiplist叫做“跳表”,这个结构很像我们之前做过的一道题很像:LCR 154. 复杂链表的复制 - 力扣(LeetCode)

跳表也是链表,不同于普通链表,它每个节点上面有多个指针域,Redis通过巧妙地搭配这些指针域地指向,就可以做到从跳表上查询元素的时间复杂度为O(logN)

1.6 演示

OBJECT encoding key #该命令可以查看value底层具体的数据类型

二,关于单线程模型

2.1 关于Redis的单线程

前面我们说Redis是单线的,其实指的是Redis只用一个线程去处理所有的命令请求,其实Redis内需也是有多个线程的,它们处理的是网络IO等。

场景:假设现在有2个客户端,同时操作Redis服务器,服务器中有键值对,如下图:

然后客户端发送incr counter命令,表示使key的value进行 +1 操作,两个客户端一起发送时就会有线程安全问题

问题:所以这两个客户端“并发”发起了上述的请求,是否意味着服务器那边也会存在类似的线程安全问题呢?

解答:并不会。因为Redis服务器实际上是单线程模型,保证了当前收到的多个请求是串行执行的,多个命令到达Redis后,也要在队列中排队,再等待服务器从里面一个一个取

Redis能够使用单线程模型很好的工作,原因在于Redis的核心业务逻辑,都是短平快的,不太消耗CPU资源,也就不太吃多核了

弊端:Redis就必须要特别小心,如果某个操作占用时间长,就会阻塞其它命令的执行

2.2 Redis为什么快

  1. Redis主要操作是访问内存,MySQL是访问硬盘,访问内存快很多
  2. Redis的核心功能逻辑,比数据库更简单(数据库对于数据的插入删除查询,都有更复杂的功能,从而势必要花非更多的开销
  3. 单线程模型,避免了一些不必要的线程竞争开销,Redis的每个操作都是短平快的,都是不怎么消耗的CPU的内存数据操作
  4. Redis处理网络IO的时候,使用了epoll这样的IO多路复用机制

 下面简单解释下第四点:

  1. 一个线程就可以管理多个socket,针对TCP来说,服务器这边每次要服务一个客户端,就要维护一个socket,一个服务器服务多个客户端,就要维护多个socket。
  2. 但是很多情况下,这些socket也不是一直在传输数据,大部分的socket大部分时间是静默的 --> 同一时刻只有少数socket是活跃的
  3. 我们最开始介绍TCP服务器时,是利用线程池给每个socket分配一个线程的,客户端多了,线程就多了,开销就大了,于是就有了IO多路复用,就可以用一个线程来处理socket,这是操作系统给程序员提供的机制,提供了一套API,内部的功能都是操作系统内核实现的
  4. Linux上提供的IO多路复用,主要是三套API,select,pool,epoll,其中epoll是运行效率最高的机制

举个例子:家里面三个人想吃小吃,三个人分别想吃“饺子”,“炒饭”,“煎饼果子”,下面有三种方案:

  1. 让一个人去买,先买饺子,跟老板说了之后就等着,当拿到饺子的时候再去买炒饭,煎饼果子同理(原始单线程)
  2. 三个人一起去,各去买自己想吃的(多线程)
  3. 让一个人去,先买饺子,跟老板说了之后,在老板准备饺子的期间,我直接去买炒饭和煎饼果子,然后就是三个同时在做,做好了时候老板喊我去拿,然后我就去拿 (epoll多路复用)

用第三种方法,就可以让一个线程同时做三件事前提是 三件事交互都不频繁,大部分时间都是在等,上面标粗体的老板喊我去拿,这种有通知机制的多路复用就叫做epoll,而另一种select和上面差不多,但是“老板不会喊我”,它没有通知机制,只能“我自己来问”,效率不高

如果三件事交互是很频繁的,那还是老老实实搞多线程靠谱

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

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

相关文章

pixel 3a 刷机和root 流程

1、下载镜像文件 官方下载出厂镜像刷入 或者直接下载手机本身自带的镜像。 下载地址:https://developers.google.com/android/images 找到对应手机的版本,可以通过指令 adb shell getprop 找到 [ro.bootimage.build.fingerprint]: [google/sargo/sargo:1…

代码随想录算法训练营第九天|151.翻转字符串里的单词 卡码网:55.右旋转字符串

LeetCode 151 翻转字符串里的单词 题目: 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意…

超声波眼镜清洗机哪个品牌比较好用?四大高赞耐用单品全面测评

随着大家对健康卫生的关注不断提升,超声波清洗机逐渐受到佩戴眼镜人士的青睐。超声波清洗机是一种既方便又高效的智能清洁工具。它利用超声波技术,通过在眼镜表面产生高频振动,将污垢和油脂彻底分离,从而实现卓越的清洁效果。下面…

基于PSO-LSTM的多变量多特征数据分类预测

一、数据集 数据特征:12个多分类:4分类 二、PSO-LSTM网络 PSO-LSTM 网络是一种结合粒子群优化算法(Particle Swarm Optimization, PSO)和长短期记忆网络(Long Short-Term Memory, LSTM)的混合模型。它将 …

好领导都会用三招管好下属!

管不住人,你就当不好官,高明领导管人就靠这3大秘诀! 秘诀一:敢于亮剑 身为领导,,有时候需要有勇气面对挑战和问题,勇于做出决策,拿出魄力,勇于亮剑,向一切宣…

【HarmonyOS NEXT星河版开发学习】小型测试案例11-购物车数字框

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面(暂未发布) 前言 经过一周的学习,我发现还是进行拆分讲解效果会比较好,因为鸿蒙和前端十分的相识。主要就是表达的方式不同罢了…

2024年高教社杯全国大学生数学建模竞赛报名第一次通知!建议收藏!预测类模型及应用场景汇总

对于数学建模而言,算法模型选的对,文章写的顺~其中预测类模型是数模中常用的模型之一,通过预测模型,我们可以对未来的趋势和事件进行合理推测。今天,数模0error给大家汇总一下预测类模型及其应用场景,供大家参考,小伙伴们码住! 2024年高教社杯全大学生数学建模竞赛通知…

docker学习初体验

docker学习初体验 docker是什么 docker 包括三个基本概念: 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 roo…

四款口碑比较好充电宝排名,哪些性价比高?适合入手充电宝推荐

2024年快到下旬了,市场上的充电宝价格也是差不多都沉淀起来了。所以就性价比高的充电宝的入手时间来说,那确实是年底左右的时间挑选入手会比较好一点。而挑选性价比高的充电宝类型呢,那说充电宝,我个人其实也有入手过不少品牌的充…

晶体振荡器的频率容差与温度稳定性

晶体振荡器作为电子设备中不可或缺的频率源,其频率的准确性与稳定性至关重要。本文旨在阐述晶体振荡器的频率容差与温度稳定性的定义、测量单位及其在实际应用中的重要性。 一、频率容差定义及测量单位 频率容差是指晶体振荡器在特定条件下(通常是25C的…

mysql 监控开始时间,结束时间,平均取n个时间点

需求 最近1小时 1分钟 60个点 最近3小时 5分钟 36个点 最近6小时 10分钟 36个点 最近12小时 20分钟 36个点 最近1天 1小时 24个点 最近3天 3小时 24个点 最近1周 6小时 28个点 如果你的递归查询支持递归CTE(如MySQL 8.0),可以使用递归查询来…

[自学记录09*]关于模糊效果降采样优化性能的小实验

一、降采样在模糊中的优化 这两天接手了几个高度定制化的模糊,包括不限于放射和旋转状的径向模糊,移轴模糊,景深的散景模糊等等,这些效果在游戏中非常常见。 其实模糊的原理都差不多,无非就是对UV偏移后重新采样再求…

UI动画设计:提升用户体验的关键

传统的静态 UI 设计正在逐渐被淘汰,UI 动画设计正在脱颖而出。随着技术的成熟,UI 动画正试图超越现有的限制和规则,并通过应用程序形成、网站和其他产品的新互动模式。交互式动画也可以为 UI 设计增添活力,使用户界面更加丰富多彩…

【vue3|第20期】vue3中Vue Router路由器工作模式

日期:2024年8月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方&#xff…

ThreadLocal 详解(三)内存泄露原因,以及强弱引用

1、ThreadLocal内存泄漏 在Threadlocal的内部静态类中Entry将Threadlocal作为一个key,值作为value保存,他继承WeakReference,super(k),代表了Threadlocal对象是一个弱引用; static class Entry extends WeakReference…

mysql中B+树的数据存储

B树索引基础分析 B树的定义 B树是一种自平衡的树形数据结构,常用于数据库和操作系统的索引结构。它具有以下特点: 所有数据都存储在叶子节点,非叶子节点仅存储键值和子节点的指针。 叶子节点之间通过指针相互连接,形成一个有序链…

机器视觉应用基础: 工业镜头

文章转载自机器视觉应用基础: 工业镜头-工业相机镜头选型-少有人走的路 (skcircle.com) 工业镜头相当于人眼的晶状体,如果没有晶状体,人眼看不到任何物体;如果没 有镜头,那么摄像头所输出的图像;就是白茫茫的一片&…

职场办公人必备网站-办公人导航

“办公人导航”是一个综合性的网址导航网站,专门收录和分享各种优质的办公资源和工具。它涵盖了常用网站、在线工具、资源查找、素材查找、在线学习、在线影视、资讯信息、AI工具集等内容,是一个职场办公人必备的网址导航网站。办公人导航-实用的办公生活…

XJTUSE-离散数学-集合

基本概念 集合的包含与相等&#xff0c;如子集幂集&#xff1a;以A的所有子集组成的集合称为A的幂集AB <> 集合的基本运算 基本运算证明会考 交运算并运算补运算差运算&#xff1a;A \ B 环和运算&#xff1a;环积运算&#xff1a; 集合的其他表示方法 文图表示法 …

反向传播与梯度累积

反向传播算法&#xff1a;loss.backward()的实现细节 向前传播&#xff1a;输入数据得到预测结果。向后传播&#xff1a;计算梯度加更新参数。反向传播&#xff1a;计算梯度 计算图 计算图 有向无环图 基本运算 节点&#xff1a;变量节点 & 计算节点有向边&#xff1…