(二)Redis 数据类型与结构

news/2024/11/19 15:34:08/文章来源:https://www.cnblogs.com/WinterSir/p/17916942.html

1、值的数据类型

Redis “快”取决于两方面,一方面,它是内存数据库,另一方面,则是高效的数据结构。

Redis 键值对中值的数据类型,也就是数据的保存形式有5种:String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)。这5种数据类型由6种底层结构实现:简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。

String 类型的底层实现只有一种数据结构,简单动态字符串,而 List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构,这四种类型称为集合类型,它们的特点是一个键对应了一个集合的数据。

2、键值对数据结构

Redis 使用哈希表来保存所有键值对,实现从键到值的快速访问。哈希表就是一个数组,每个元素称为一个哈希桶,哈希桶中的元素保存的并不是值本身,而是指向具体值的指针。哈希表保存了所有的键值对,也称为全局哈希表,时间复杂度为O(1)
当 Redis 中写入大量数据后,哈希表的冲突问题和 rehash 可能导致操作变慢。
哈希冲突是指,两个 key 的哈希值落在了同一个哈希桶中,毕竟,哈希桶的个数通常要少于 key 的数量。
Redis 通过链式哈希解决哈希冲突,就是指同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。
随着数据量增大,哈希冲突可能也会越来越多,这就会导致某些哈希冲突链过长,链上的元素只能通过指针逐一查找再操作,进而导致查询效率降低。

Redis 会对哈希表做 rehash 操作来解决这个问题,也就是增加现有的哈希桶数量,让逐渐增多的 entry 元素能在更多的桶之间分散保存,减少单个桶中的元素数量,从而减少单个桶中的冲突。

Redis 会将哈希表的数据拷贝到另一个容量更大的哈希表,清空原来的准备下一次 rehash,这样依然会有问题,因为在数据量大的基础上拷贝会造成 Redis 线程阻塞。为了避免这个问题,Redis 采用了渐进式 rehash,就是将拷贝过程的开销分摊到每次请求时进行,从而保证查询效率。

3、集合数据操作效率

对于 String 类型来说,找到哈希桶就能直接增删改查了,所以,哈希表的 O(1) 操作复杂度也就是它的复杂度了。对于集合类型来说,找到哈希桶后,增删改查都是对集合操作的,不同的集合类型时间复杂度是不一样的。

哈希表的特点上面提到了,复杂度是O(1),整数数组和双向链表也很常见,通过数组下标或者链表的指针逐个元素访问,操作复杂度基本是 O(N),操作效率比较低。压缩列表和跳表是 Redis 重要的数据结构,下面介绍一下。

压缩列表类似于一个数组,不同之处在于表头有三个字段 zlbytes、zltail 和 zllen,分别表示列表长度、列表尾的偏移量和列表中的 entry 个数,压缩列表在表尾还有一个 zlend,表示列表结束。
查找第一个元素和最后一个元素,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。而查找其他元素时,复杂度就是 O(N) 了

跳表在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位,当数据量很大时,跳表的查找复杂度就是 O(logN)
按照查找的时间复杂度,这些数据结构分类如下:

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

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

相关文章

高薪线下周末班马上开班,手把手带你提升职业技能

管理学大师彼得德鲁克说“终身学习是现在社会的生存法则”,而现实中,很少有人能清醒地意识到这一点,人们总是习惯在舒适区兜圈,重复做已经掌握的事情,对真正需要突破的职业困境视而不见。 偶尔看到同事跳槽涨薪,技术越来越娴熟,自己也期望着可以跟他们一样,幻想着有一天…

dapr离线安装

dapr离线包下载地址: https://github.com/dapr/cli/releases 下载完以后放到C:\dapr目录下,然后配置上环境变量即可,可以用dapr --version查看是否配置成功 初始化包下载地址: https://github.com/dapr/installer-bundle/releases 下载 daprbundle_windows_amd64.zip 解压以后…

dapr离线初始化

打开地址: https://github.com/dapr/installer-bundle/releases 下载 daprbundle_windows_amd64.zip 解压以后,放到此目录下,注意放的是daprbundle文件夹下内容 D:\daprbundle_v1.13.2指定目录进行初始化: dapr init --from-dir D:\daprbundle_v1.13.2 最后初始化完成,如下图…

LDAP数据备份与恢复

一、命令形式 以整体备份(迁移)来示范 1.1 说明使用命令:导出---slapcat 导入--- slapaddopenldap的数据目录是/var/lib/ldap/备份可以通过直接备份/var/lib/ldap/文件夹,恢复也是直接使用备份的文件夹替换就行,此处不做演示下面使用命令行形式进行演示 1.2 导出数据文件 …

pyqt5 子线程如何操作主线程GUI

一.简介 在使用pyqt5编写gui时遇到两个问题,会导致界面崩溃,今天就围绕这两个问题来简单说明和改进。 1.在主线程中使用while无限循环会导致界面崩溃 2.在子线程中操作主线程gui会导致界面崩溃 二.步骤说明 1.在主线程中使用while无限循环会导致界面崩溃 1)错误代码import s…

BOSHIDA AC/DC电源模块的设计与优化

BOSHIDA AC/DC电源模块的设计与优化 AC/DC电源模块是一种将交流电转换为直流电的设备,广泛应用于各种电子设备中。其设计与优化对于提高电源的效率、稳定性以及可靠性非常重要。在设计与优化AC/DC电源模块时,需要考虑以下几个方面。 首先,设计AC/DC电源模块需要选择合适的开…

Applescript实现无痕检测是否注册iMessage服务,iMessages数据筛选,iMessage蓝号检测完美实现

一、实现iMessage蓝号数据筛选的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号…

SSRF攻击

SSRF服务端请求伪造目录SSRF攻击原理漏洞利用redis未授权访问访问漏洞进行攻击SSRF绕过方式SSRF中URL的伪协议SSRF漏防御手段 SSRF攻击 服务端请求伪造 原理 事故多发地在url分享、收藏、网址翻译功能。 参数通常是:(其实就是参数值是另一个url的地方就有可能有SSRF) share li…

函数计算帮助领健为“看牙”注入AI活力

作者:姜伟,龚杨,周韬,王彬 客户介绍和业务背景 领健成立于2015年,总部位于上海,并在全国设立了20余家分支机构,拥有100项软件著作权、91项注册商标、35项发明专利,致力为口腔诊所、医美机构等消费医疗企业提供经营管理一体化解决方案。 领健拥有 ISO/IEC27001 国内国际…

【Linux】《VMware17搭建Ubuntu.22.04-Rust开发环境》

下载VMware17安装包 下载链接: 创建虚拟机之后都默认就可以了。进入系统设置登录账号和密码以及修改下语言,剩余都默认即可。 设置中文界面设置中文输入法接下来开始设置输入法切换快捷键设置 使用 Ctrl + Alt + T 打开终端,输入 ibus-setup重启,看一下是否有输入法信息尝试…

多线程下使用List中的subList和remove方法产生的 java.util.ConcurrentModificationException 异常

在说多线程操作List之前,我们先看下单线程下产生的问题: 单线程List<Integer> listA=new ArrayList<>(); listA.add(1); listA.add(2); listA.add(3); listA.add(4); listA.add(5); listA.add(6);for(Integer a:listA…