首页 > 其他分享 >02 数据结构

02 数据结构

时间:2024-02-19 18:57:19浏览次数:28  
标签:02 复杂度 元素 Redis 列表 哈希 数据结构

02 数据结构

Redis接收到一个键值对操作后,能以微秒级别的速度找到数据,并快速完成操作。

因为一方面,这是因为它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快;另一方面,这要归功于它的数据结构。

redis的数据结构

String 类型的底层实现只有一种数据结构,也就是简单动态字符串。而List、Hash、Set 和 Sorted Set 这四种数据类型,都有两种底层实现结构,我们会把这四种类型称为集合类型

Redis 使用了一个哈希表来保存所有键值对,实现从键到值的快速访问。

一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶,每个哈希桶中保存了键值对数据,哈希桶中的元素保存的并不是值本身,而是指向具体值的指针

哈希表 O(1) 的时间复杂度来快速查找到键值对,只需要计算键的哈希值,就可以知道它所对应的哈希桶位置,然后就可以访问相应的 entry 元素。哈希桶中的 entry 元素中保存了*key*value指针,分别指向了实际的键和值。

因为这个哈希表保存了所有的键值对,把它称为全局哈希表


哈希冲突

两个 key 的哈希值和哈希桶计算对应关系时,两个 key 的哈希值正好落在了同一个哈希桶中,因为哈希桶的个数通常要少于 key 的数量。

解决方法:链式哈希。同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。

若某些哈希冲突链过长,进而导致这个链上的元素查找耗时长,故Redis 会对哈希表做rehash 操作。

rehash 增加现有的哈希桶数量,让逐渐增多的 entry 元素能在更多的桶之间分散保存,减少单个桶中的元素数量,从而减少单个桶中的冲突。

渐进式 rehash

Redis 仍然正常处理客户端请求,每处理一个请求时,从哈希表 1 中的第一个索引位置开始,顺带着将这个索引位置上的所有 entries 拷贝到哈希表 2 中,如此等待下一个请求做同样操作。

巧妙地把一次性大量拷贝的开销,分摊到了多次处理请求的过程中,避免了耗时操作,保证了数据的快速访问。

对于 String 类型来说,找到哈希桶就能直接增删改查了,所以,哈希表的 O(1) 操作复杂度也就是它的复杂度

对于集合类型来说,即使找到哈希桶了,还要在集合中再进一步操作


集合数据操作效率

集合类型的底层数据结构主要有 5 种:整数数组、双向链表、哈希表、压缩列表和跳表。

整数数组和双向链表:

操作特征都是顺序读写,通过数组下标或者链表的指针逐个元素访问,操作复杂度基本是 O(N),操作效率比较低。

压缩列表:

压缩列表实际上类似于一个数组,数组中的每一个元素都对应保存一个数据。

压缩列表在表头有三个字段 zlbytes、zltail 和 zllen,分别表示列表长度、列表尾的偏移量和列表中的 entry 个数;压缩列表在表尾还有一个 zlend,表示列表结束。

在压缩列表中,如果我们要查找定位第一个元素和最后一个元素,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。

而查找其他元素时,只能逐个查找,此时的复杂度就是 O(N) 了。

跳表:

跳表在链表的基础上,增加了多级索引,通过索引位置的几个跳转,实现数据的快速定位。

当数据量很大时,跳表的查找复杂度就是 O(logN)。


不同操作的复杂度


问:整数数组和压缩列表在查找时间复杂度方面并没有很大的优势,那为什么 Redis 还会把它们作为底层数据结构呢?

答:整数数组和压缩列表的设计,充分体现了 Redis“又快又省”特点中的“省”,也就是节省内存空间。整数数组和压缩列表都是在内存中分配一块地址连续的空间Redis 之所以采用不同的数据结构,其实是在性能和内存使用效率之间进行的平衡

标签:02,复杂度,元素,Redis,列表,哈希,数据结构
From: https://www.cnblogs.com/itiancong/p/18021745

相关文章

  • 2024 SICTF Round#3出题 crypto misc osint
    有幸参与了本次比赛cryptomiscOSINT出题,难易程度循序渐进,下面记录一下本人题目题解(( 比赛网址:https://yuanshen.life/CRYPTOSuperbRSA(85支队伍攻克)题目CRYPTO真的很难吗?Ö_O不会吧不会吧!,一定要相信自己咩~出题人:Kicky_Mu#user:mumu666fromCrypto.Util.number......
  • 【专题】2022数字化转型指数年度报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33471原文出处:拓端数据部落公众号数字化转型指数报告2022合集根据“基础设施-平台-应用”三层指标体系,对全国300余个城市、10余个行业的数字化发展规模进行了评估。该报告提供了覆盖全国范围的季度数字化转型指数,为各行各业推进数字化转型提供了有益......
  • 2024-02-19 闲话
    2019-06CET4-2你怎么知道我听力都对了Vocabularyrevenuen.收入aslumpinoilrevenue石油收入的下跌workers'strike工人罢工Theynestonthevolcano'sslopes.它们在火山山坡上筑巢。slope这里是另译idleabout游手好闲/虚度时光(贬义)闲逛(中性)acquirev.1.(通......
  • 2024,立一些flag
    关于2023进入了一些新的领域ANC:前半年一直再弄ANC,折腾折腾,好不容易原理搞懂,有了初步的优化结果,结果公司砍了需求,感觉现在处于半吊子水平。没有需求也没有理由去深入,就此搁置。nnAEC:后面做了nnAEC的数据增强,借助这个项目,对整个AEC的处理流程和某些卡喉的难点(非线性失真,延时抖动)......
  • 9.【2024初三集训模拟测试1】
    \(\Huge打了一场模拟赛,又垫底了。qwq\)2024初三集训模拟测试1T1edit\(30pts\)前言被签到题薄纱了。由于没看清题面以为是个数字就要输出空格然后\(\Large④\)了\(qwq\Huge......
  • 【linux新手起步02】vi编辑时出现E325:ATTENTION。
    vi编辑时出现E325:ATTENTION一、原因二、解决方法:rm+swap文件路径以及名称一.原因:出现这个问题,是因为由于在编辑该文件的时候异常退出,因为vim在编辑文件时会创建一个交换文件swapfile以保证文件的安全性。点击查看代码E325:ATTENTIONFoundaswapfilebythen......
  • USACO 2024 February Contest, Bronze Problem 1. Palindrome Game
    1.猜结论2.证明如果\(s<=9\)则\(Bessie\)必赢。如果\(s=10\)则\(Elsie\)必赢。如果\(10<s<=19\)则\(Bessie\)可以减去\(s-10\),使自己必赢。如果\(s=20\)则\(Bessie\)无论如何减去一个回文数都会离\(10\)差一个个位数,\(Elsie\)减去这个个位......
  • 20240219总结
    P9994[YnoiEasyRound2024]TEST_132根号分治。考虑修改操作。如果修改的x数量大于阙值B,那么打上操作次数标记,否则直接各自修改对应的\(y_i\)答案。查询时对于一个y,记录下所有使得xi数量大于B且yi=y的i,这一些贡献是没有加上的。显然xi的数量<=n/B,对于每一个这样的xi快速......
  • MindSponge分子动力学模拟——定义Collective Variables(2024.02)
    技术背景在前面的几篇博客中,我们介绍了MindSponge分子动力学模拟框架的基本安装和使用和MindSponge执行分子动力学模拟任务的方法。这里我们介绍一个在增强采样领域非常常用的工具:CollectiveVariable(CV),或者我们也可以直接称呼其为一个物理量。因为像化学反应或者是蛋白质折叠等......
  • 2024/1/26
    lambda匿名函数函数的定义中·def关键字,可以定义带有名称的函数·lambda关键字,可以定义匿名函数(无名称)有名称的函数,可以基于名称重复使用,无名称的匿名函数,只可临时使用一次。匿名函数定义语法:lambda传入参数:函数体(一行代码)lambda是关键字,表示定义匿名函数传入参数表示匿名......