Skip to content

Commit f6d043e

Browse files
committed
Redis数据结构
1 parent bba94d1 commit f6d043e

2 files changed

Lines changed: 45 additions & 0 deletions

File tree

Interview/sad/Redis数据结构.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#### String
2+
String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存应用; **常规计数:微博数,粉丝数**等。
3+
4+
#### Hash
5+
Hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。 比如我们可以Hash数据结构来**存储用户信息,商品信息**等等。
6+
7+
简单说一下结构
8+
9+
- 字典被广泛用于实现Redis的各种功能,其中包括数据库和哈希键。
10+
- Redis中的字典使用哈希表作为底层结构实现,每个字典带有两个哈希表,一个平时使用,另一个仅在进行rehash时使用。
11+
- Redis使用MurmurHash2算法来计算键的哈希值。
12+
- 哈希表使用链地址法来解决键冲突。
13+
14+
注意:这里和Java的HashMap不同的rehash过程
15+
1. Redis的rehash过程是扩展和收缩,而且还是渐进式的rehash
16+
2. Redis的字典有两个哈希表ht[0]和ht[1]
17+
3. 为字典的ht[1]哈希表分配空间,如果执行的是扩展操作,那么ht[1]的大小为第一个大于等于ht[0].used *2的2^n;如果执行的是收缩操作,那么ht[1]的大小第一个大于等于ht[0].used的2^n。(举个例子,ht[0]的长度为10,那么扩展就是2^5的32,如果是压缩的话2^4=16)
18+
4. 如果ht[0]的键值非常多的话,一次性转移过去,是一个非常耗时的操作哦,因此并非一次性,采取渐进式rehash转移。
19+
20+
#### List
21+
list 就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如**微博的关注列表,粉丝列表, 消息列表**等功能都可以用Redis的 list 结构来实现。
22+
23+
Redis list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。
24+
25+
另外可以通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于 list 实现分页查询,这个很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高。
26+
27+
#### Set
28+
set 对外提供的功能与list类似是一个列表的功能,特殊之处在于 set 是可以自动排重的。
29+
30+
当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在 一个set集合内的重要接口,这个也是list所不能提供的。可以基于 set 轻易实现交集、并集、差集的操作。
31+
32+
比如:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常 方便的实现如**共同关注、共同粉丝、共同喜好**等功能。这个过程也就是求交集的过程,具体命令如下:`sinterstore key1 key2 key3`将交集存在key1内
33+
34+
35+
#### Zset
36+
和set相比,sorted set增加了一个**权重参数score**,使得集合中的元素能够按score进行**有序**排列。
37+
38+
举例: 在直播系统中,实时排行信息包含直播间在线用户列表,各种**礼物排行榜**,弹幕消息(可以理解为按消息维度的消息排行榜)等信息,适合使用 Redis 中的 SortedSet 结构进行存储。
39+
40+
跳跃表,暂时先放一个链接[https://zhuanlan.zhihu.com/p/53975333](https://zhuanlan.zhihu.com/p/53975333)
41+
42+
- 简单来说跳跃表是一种有序数据结构,它通过在**每个节点中维持多个指向其他节点的指针**,从而达到快速访问节点的目的。
43+
- 跳跃表平均O(longN),最坏O(N)复杂度的节点查找
44+
- 跳跃表有个层的概念:层带有两个属性:**前进指针和跨度**,前进指针用于**访问位于表尾方向的其他节点**,而跨度则记录了**前进指针所指向节点和当前节点的距离**。一般情况下,层越多,查找效率越高。

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
- [MySQL数据库结构优化](/Interview/sad/MySQL数据库结构优化.md)
8080
- [MySQL的锁](/Interview/sad/MySQL的锁.md)
8181
- [Redis的模型](/Interview/sad/Redis的模型.md)
82+
- [Redis数据结构](/Interview/sad/Redis数据结构.md)
8283

8384
## 刷题系列
8485
- [推荐:CS-Notes](https://cyc2018.github.io/CS-Notes/#/?id=✏️-算法)

0 commit comments

Comments
 (0)