当前位置: 首页 > 网络应用技术

您真的了解Redis的五个基本数据结构吗?

时间:2023-03-08 02:14:31 网络应用技术

  REDIS中的所有数据结构均通过唯一的字符串键获得相应的值数据。REDIS具有5个基本数据结构,即:

  其中,列表,集合,哈希和ZSET的四个数据结构是容器型数据结构。他们分享以下两个通用规则:

  本文将在Redis的五个基本数据结构中详细介绍。

  1.1字符串(字符串)字符串(字符串)的内部结构是最简单,最广泛使用的数据结构。这是内部的角色数组。如图所示:

  REDIS中的字符串(String)是一个动态字符串,允许修改;它的结构化实现类似于Java中的Arraylist(最初的数组,大小为10),这是分配内存的想法,也称为分配内存的想法,也称为前分布;这个想法可以减少扩张引起的性能消耗。

  1.2当字符串(字符串)的大小达到容量扩展阈值时,字符串(字符串)的容量达到膨胀阈值时,将扩展字符串(字符串)。字符串(字符串)的扩展主要具有以下几点:

  2.1添加,删除,修改,检查操作设置 - >键的单个键值不存在,然后添加。

  设置钥匙值

  获取 - >查询,返回相应的钥匙值,无返回(nil)

  获取钥匙

  del->删除指定的键(键可以是多个)

  del键[键...]

  例子:

  2.2批次钥匙值在批处理密钥值中读取和写作的最大优势是保存网络传输开销

  mset->批量插入

  MSET钥匙值[钥匙值...]

  mget->批次获取

  mget键[键...]

  例子:

  2.3到期设置命令过期集合是一种机制,可以自动删除缓存键到期后到期的缓存键。

  到期密钥秒

  例子:

  方法两个:

  setEx键秒值

  例子:

  2.4没有创建不会更新设置操作。没有创建,并且存在更新。目前,如果需要更新一个场景,则可以使用以下说明setnx-> no Creation不会更新无更新的存在。

  setnx键值

  例子:

  2.5计数字符串(string)也可以用于计数,只要值是整数,因此可以执行自我提示操作。必须在签名长的间隔内访问自我侵蚀的范围,[-9222372036854777775808,92222222222372037203720372037203685475888]]]]

  递增 - >自我提示1

  递增键

  例子:

  cormby->自定义累加添加值

  递增密钥增量

  测试值作为整数的自我提示间隔

  最大值:

  最小值:

  1.1列表(列表)内部结构redis列表等效于Java语言中的linkedlist。这是一个两条链接的链接数据结构(但是此结构设计相对聪明,将在稍后引入)。链接的列表结构被插入并迅速删除,时间复杂性为O(1),查询很慢,很慢,时间复杂性为o(n)。

  1.2列表(列表)使用方案基于REDIS的两条路列表的特征,因此它也用于使用异步队列。在实际开发中,需要延迟的任务结构将被序列化为一个弦,放置在retis队列中,另一个线程从此列表中获取数据以进行以下处理。该过程类似于下图:

  2.1右 - 左 - 标题队列是一个结构化的数据结构(例如排队票的顺序)。它通常用于类似的功能,例如消息队列,例如消息队列和异步处理。

  lpush键值[值...]

  rpush->添加右侧的元素

  rpush键值[值...]

  llen->获得列表的长度

  llen键

  

  LPOP键

  2.2在右边和右边 - 堆栈是高级背部 - out(例如Filo)的数据结构(例如将弹匣按在子弹中,并且子弹的顺序是堆栈。该数据结构通常用于输出反订单输出。

  lpush->从左侧添加元素

  lpush键值[值...]

  rpush->添加右侧的元素

  rpush键值[值...]

  rpop->从右侧弹出的选举元素

  RPOP代码

  2.3慢操作列表(列表)是链接的数据结构。它的遍历是缓慢的操作,因此涉及遍历的性能将增加并增加整个遍历间隔的增加范围。请注意列表的索引行为的负数,-1代表倒数第二,-2代表倒数第二和其他是相同的。lindex->遍历外围列表中指定索引的值

  Lindex键SE

  lrange->从索引开始到停止

  lrange键开始停止

  ltrim-> Terry索引的全部值开始停止,其他索引将被删除

  ltrim钥匙开始停止

  REDIS的基础存储列表(列表)不是一个简单的linkedlist,而是QuickList-“快速列表”。重新确定QuickList是什么,将简要介绍以下内容。我仍在研究特定的源代码,每个人都会稍后讨论。QuickList是多个Ziplist(压缩列表)的两条路列表;这个Ziplist(压缩列表)是什么?Ziplist是指连续的内存存储空间。REDIS的底层用于列表(列表)存储。当元素很小时,它将使用连续的内存空间来存储它,这可以减少每个元素以增加上前,而下一个最重要的是,指针带来的内存消耗是减少了马卡龙碎片。

  3.1通用链接列表结构示意图每个节点节点元素将保持一个prev->执行先前的节点节点和下一个指针,指向后一个节点节点(引用)。将大量的存储器开放。如果节点节点只是int类型的值,则可以想象引用的内存比率将更大。

  3.2 Ziplist示意图Ziplist是一个连续的内存地址。他们不需要持有上一条和下一个指针,并且可以按地址订单访问。

  3.3 QuickList示意图Quicklist是由多个Ziplist组成的两条链接列表。

  1.1哈希(字典)内部结构redis hash(词典)等同于Java语言的哈希图。它是根据耗散值的分布分布的无序词典。内部元素由键值对存储。

  哈希(词典)的实现也与Java中的哈希图(JDK1.7)的结构一致。它的数据结构也是由数组+链接列表组成的两维结构。链接列表连接在数组节点上。

  1.2 hash(字典)哈希(词典)存储在retis中只能是字符串值。此外,扩展与Java中的hashmap不同,Java的Hashmap一次在扩展容量时完成了,Redis考虑到其核心访问是单个线程的性能问题。为了追求高性能,采用了逐步的重新策略。

  渐进式重新指的是一个时间完成,它已完成多次,因此需要旧的哈希结构,因此将存在redis中的哈希(词典)。在所有哈希的值都重新安置到新哈希之后,新哈希将在功能方面完全替换先前的哈希。

  1.3哈希(词典)相关用法方案可用于存储对象的相关信息。哈希(字典)代表一个对象,哈希的键代表对象对象的属性,而键的值表示属性的值,属性。要序列化整个对象并存储它。可以以这种方式部分获得。因此,哈希(词典)具有以下优点和缺点:

  2.1哈希(字典)常用的指令hset-> hash(字典)插入值,词典不存在,创建一个键名,字段等同于键,值是键的值

  HSES密钥字段值

  hmset->批处理设置值

  HMSET键字段值[字段值...]

  例子:

  hget->在字典中获取指定的键

  hget键字段

  hgetall->获取字典中的所有键和值,更改输出

  hgetall键

  例子:

  hlen->获取指定字典的键数

  hlen键

  例子:

  2.2哈希(字典)使用字符串(字符串)中的提示,您可以使用engry和递增。

  hincrby->将集成操作添加到哈希(字典)中的密钥的整数值中

  Hincrby键字段增量

  请注意,如果不是整数,将报告错误。

  1.1集(集合)内部结构redis集(集合)等效于Java语言的标签。它内部的关键值是无序且独特的。它的内部实现具有所有值为无效的特殊词典。删除了集合中的最后一个元素后,将自动删除数据结构并回收内存。

  1.2集(集合)使用方案集(集合)由于其特殊重复功能,因此我们可以在活动中使用用户的ID,这可以确保用户不会赢两次。

  sadd->添加收集成员,关键集合名称,成员值集元素,无法重复该元素

  SADD主要成员[成员...]

  smembers->查看集合中的所有元素,请注意它是无序的

  Smembers Key

  sismember->某个元素是否包含查询集中的某个元素

  Simismember关键成员

  scard->获得收藏的长度

  scard键

  spop-> pop -up元素,计数是指pop -up元素的数量

  Spop键[count]

  1.1 ZSET(有序收集)内部结构ZSET(有序收集)是Redis中最常见的数据结构。它类似于Java语言中SortedSet和Hashmap的组合。一方面,它可以通过设置确保内部值的唯一性,另一方面,它通过Value的分数进行排序。此类功能是通过跳过列表(跳跃列表)实现的。删除ZSET的值,自动删除数据结构,并回收内存。

  1.2相关使用方案(有序收集)使用ZSET的重量和有序效应,可以在许多用法方案中使用。两个例子:

  1. zadd->将元素添加到集合中。如果没有收藏品,它将是新建的。键代表ZSET集合的名称。得分代表元素的重量。成员表示元素zadd键[nx |xx] [ch] [Incore manber ...]

  2. zrange->根据从小到大排序输出集的小到大的输出集,按价值词典顺序(词典订单)对相同的权重进行排序。例如,当开始的值较大时比升级集的最大竞标或开始>停止的最大竞标,zrange命令只需返回一个空列表。另一方面,如果停止参数的值大于ISTIST集合的最大竞标,则Redis Treats停止作为最大子标签。

  通过使用wathsscores选项让成员及其得分值返回,该列表由Value1,Score1,...,Valuen,Scoren表示。客户端库可以返回一些更复杂的数据类型,例如数组,金属组,ETC。

  zrange键启动停止[withscores]

  3. zrevrange->根据从大量到小输出集的得分权重元素,根据Value的字典反阶排序对相同的权重进行排序。成员的位置是根据得分值(从大到小)进行排列的。具有相同得分值的会员根据反向词典订单进行排列。在分数的排列下降的外加,Zrevrange的其他方面的排列降低了命令与zrange键启动stop [withscores]命令相同。

  zrevrange键启动停止[withscores]

  4. zcard->当密钥存在并且是升级类型时,返回升级的底部。当键不存在时,返回0zcard键

  5. ZSCORE->返回到设备密钥,成员成员的分数值。

  6. Zrank->返回设备键中成员的排名。最小的分数值排名0

  Zrank关键成员

  7. zrangebyscore->返回升级密钥中的分数值的所有成员。升级键中的所有成员。淘汰成员以分数值(从小到大)的顺序排列。be -inf和 +inf。通过这种方式,您可以使用[ZrangeBysCore]之类的命令,而不必知道升级的最低和最高分数值。

  默认情况下,间隔的值在封闭范围内使用,您也可以在参数之前添加(该符号用于使用小于或大于或大于)的可用[开放间隔]

  ZrangeBysCore密钥最小最大[withscores] [限制办公室计数]

  8. ZREM->删除升级密钥中的一个或多个成员,不存在的成员将被忽略ZREM密钥会员[成员...]

  跳台的全名称为跳台,称为跳台,简称为跳台。跳线是随机数据结构。从本质上讲,这是一个有序链接列表,可以在dual -point search.multi-级索引中添加到原始订购链接列表中,可以通过索引快速找到。还可以提高插入和删除操作的性能。

  跳过列表(跳跃列表)此随机数据结构可以视为二进制树的变体。就性能而言,它类似于红树和黑树和AVL树。但是,要简单得多。目前,REDIS的ZSET使用跳过列表(跳跃列表)(其他LevelDB等。它也使用跳跃列表)。

  RBT红色和黑树和跳过列表的简单比较(跳跃列表):

  RBT红色黑树

  跳过列表跳跃列表

  2.1 Skip List Paper在此处在跳过列表上发布了一篇论文。有关详细研究,请阅读论文。下面的一些公式,代码和图片来自纸张。Skip列表:平衡树的概率替代品

  https://www.cl.cam.ac.uk/teaching/2005/algorithms/skiplists.pdf

  2.2跳过列表动态地图首先了解通过运动图片插入跳过列表的节点元素的过程。这张照片来自维基百科。

  2.3跳过列表算法性能分析2.3.1计算随机数算法首先分析执行插入操作时计算随机数的过程。这个过程将涉及层数的计算,因此非常重要。他具有以下节点的特征:

  计算随机层的伪代码:

  论文中的示例

  Java版本

  该代码包含两个变量P和Maxlevel。redis中这两个参数的值是:

  2.3.2节点中包含的平均指针数

  跳过列表是空间更改时间的数据结构。这里的空间是指每个节点中包含的指针数。该部分是一个额外的内存开销,可用于测量空间复杂性。random()是一个随机数,因此节点层的数量越高,概率越低(REDIS标准源代码中的促销数据为1/4,相对平坦。介绍定量分析如下:

  节点的平均层数(节点中包含的平均指针数):

  因此,在redis p = 1/4中计算的平均指针数为1.33

  2.3.3时间复杂度计算

  以下计算来自论文的内容

  假设p = 1/2,在p = 1/2中生成的16个元素的跳过列表中,我们碰巧有9个元素,级别1 3个元素,3个元素3个元素和1个元素14,14个元素14 level(这是不太可能,但可能会发生)。我们应该如何处理这种情况?如果我们使用标准算法并在14级开始搜索,我们将做很多无用的工作。因此,我们应该在哪里开始搜索?此时,我们假设Skiplist中有N元素,而L级元素数量为1/P;每个元素出现在L层上的概率为p^(l-1),那么L级元素的数量是L级级别元素的元素数量。期望为n *(p^l-1);获得1 / p = n *(p^l-1)

  因此,我们应该选择maxlevel = log(1/p)^n定义:maxlevel = l(n)= log(1/p)^n

  要计算跳过列表的时间复杂性,您可以使用反向思维。从带有I层数的节点X中,返回了起点的背面 - 和 - forth时间复杂性。节点X点有两种情况:

  令C(k)= k(k)到无限列表的搜索路径的预期成本(即长度),然后扣除如下:

  上面推断出的结果表明,攀爬K水平的预期长度为k/p,A级的长度为1/p。

  由于maxlevel = l(n),c(k)= k / p,因此期望值为:(l(n)-1) / p;可以获得L(n)= log(1 / p)^n :( log(1 / p)^n -1) / p;合并p = 1/2生成:2 * log2^n -2,即o(logn)的时间复杂性。

  3.1跳过列表功能跳过列表跳跃列表通常具有以下功能

  3.2跳过列表查询假设这些元素已经存在于初始跳过列表中的跳跃列表中,其分布的结构如下:

  目前,查询节点88,其查询路由如下:

  3.3跳过列表的初始结构插入跳过列表与2.3中的初始结构一致。此时

  3.4跳过列表删除删除过程是查询节点,然后删除它,然后以链接列表的形式重新删除节点的左侧和右侧节点。

  实现跳过列表很容易,主要分为两个步骤:

  4.1定义节点节点节点节点类主要包括以下重要属性:

  4.2 Skiplist节点元素的Skiplist主要包括以下重要属性:

  作者:李Ziyi。