赞
踩
String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。首先,表面上它是字符串,但其实他可以灵活的表示字符串、整数、浮点数3种值。Redis会自动的识别这3种值。
实际上是一个链表,before Node after , left,right 都可以插入值
如果key 不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~
消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!
哈希的描述:
哈希的底层数据结构:
下面举个例子:
当你插入一条数据到哈希中时,它的存储过程如下:
假设你要执行以下命令将一条数据插入到哈希中:
HSET myhash field1 value1
计算哈希值:对键 myhash
进行哈希运算,得到一个哈希值,该哈希值将确定数据在哈希表中的存储位置。
映射到桶:根据计算得到的哈希值,确定数据存储在哈希表的哪个桶中。
存储键值对:在确定的桶中,存储键值对数据 {field1: value1}
。
让我们假设经过哈希计算后,得到的哈希值为 0x12345678
,那么这条数据将存储在哈希表中的桶 0x1234
中。假设该桶中已经有一些数据存在,哈希表和桶的存储可能如下所示:
- Hash Table:
- Bucket 0x1234: --> {field2: value2} --> {field1: value1}
- --> {field3: value3} --> {field4: value4}
- --> ...
-
- Bucket 0x5678: --> {field5: value5}
- --> ...
-
- Bucket ... --> ...
在这个示例中:
0x1234
中存储了一些键值对数据,其中包括 {field1: value1}
。这个桶可能使用链表等数据结构来存储数据,以处理哈希冲突,确保每个键值对都可以被正确地存储和检索。注意:哈希和下面要介绍的set的底层数据结构有点相似,但是哈希里面存储的是键值对,偏向于键值对;set中偏向于值的集合。
集合的描述:
集合(Set)的底层数据结构可以有两种形式:整数集合(IntSet)和哈希表(Hash Table)。整数集合主要用于存储数字类型的元素,而哈希表则用于存储其他类型的元素或者大数量的元素。
整数集合(IntSet):
哈希表(Hash Table):
在插入数据时,底层数据结构可能会发生变化,具体取决于当前集合的类型和大小:
对于整数集合(IntSet):
对于哈希表(Hash Table):
当插入非整数类型的元素到哈希表时,Redis 会通过一系列步骤将该元素插入到哈希表中。下面是这个过程的简要描述:
计算哈希值:对于要插入的元素,Redis 首先会计算其哈希值,以确定在哈希表中的存储位置。
映射到桶:根据计算得到的哈希值,Redis 确定了元素应该存储在哈希表的哪个桶中。
处理哈希冲突:由于不同的元素可能具有相同的哈希值,所以可能会发生哈希冲突。在这种情况下,Redis 会采取适当的方法来解决冲突,例如使用开放定址法、链地址法等。
存储元素:一旦确定了存储位置并解决了哈希冲突,Redis 就会在哈希表的相应桶中存储该元素。
开放定址法和链地址法是解决哈希冲突的两种常见方法。
开放定址法:
链地址法:
总的来说,开放定址法通过不断寻找空槽位来解决冲突,而链地址法通过维护链表来存储冲突的元素。
有序集合(Sorted Set,通常简称为 ZSET)是 Redis 中的一种数据结构,它类似于集合(SET),但每个成员都关联了一个分数(Score),从而实现了元素的有序存储。
ZSET 的底层数据结构主要由两部分组成:跳跃表(Skip List)和哈希表(Hash Table)。
跳跃表(Skip List):跳跃表是一种随机化数据结构,用于有序元素的快速查找和插入。它是通过在元素的层级之间建立索引来实现快速查找的。跳跃表中的每个节点都包含一个成员(Member)和一个分数(Score),以及若干个指向其他节点的指针,这些指针用于在不同层级之间快速跳跃。通过跳跃表,ZSET 可以实现基于分数的范围查询、快速的成员查找和插入操作。
哈希表(Hash Table):除了跳跃表外,ZSET 还使用了一个哈希表,用于存储成员到分数的映射关系。在哈希表中,键是成员,值是分数。通过哈希表,可以快速地查找指定成员的分数,或者更新成员的分数。哈希表使得 ZSET 可以在常数时间内完成成员与分数之间的映射操作,而不需要遍历跳跃表。
让我们来看一个示例,假设我们有一个 ZSET,存储了一些成员及其对应的分数。
假设我们有以下 ZSET:
- ZADD myzset 10 member1
- ZADD myzset 20 member2
- ZADD myzset 30 member3
在底层,这个 ZSET 的数据可能会被存储如下:
跳跃表(Skip List):
- Level 2: member3 ---------------> NULL
- Level 1: member2 -------> member3
- Base Level: member1 -> member2 -> member3
在跳跃表中,每个节点包含成员和分数信息,并且包含指向同一层级下一个节点的指针。较高层级的节点包含更多的指针,以实现更快的跳跃。
哈希表(Hash Table):
- Key: Value:
- member1 10
- member2 20
- member3 30
在哈希表中,键是成员,值是成员对应的分数。通过哈希表,Redis 可以快速地查找成员对应的分数,或者更新成员的分数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。