Redis 使用键值对存储数据,其中的值(对象)包括 5 种类型,即字符串、列表、哈希、集合、有序集合,这是 Redis 对外提供的,实际上,在 Redis 内部每种类型可能有 2 种或更多的内部编码实现。

1、字符串(string)------用于一些常规计数:微博数,粉丝数等

java redis有序列表 redis的有序集合底层实现_字符串

其中:embstr和raw都是由SDS(简单动态字符串)构成的。

唯一区别是:raw是分配内存时,redisobject和sds各分配一块内存,而embstr是redisobject和raw在同一块内存中。

2、列表(list)------用于存储对象:用户信息,商品信息等

java redis有序列表 redis的有序集合底层实现_字符串_02

压缩列表是在数据结构中元素较少时采取的数据结构,使用压缩列表节约了内存开支,但是降低了访问的速度,不过对于规模较小的对象,这样的损失可以忽略不记。

3、哈希(hash)------用于储存列表:微博的关注列表,粉丝列表等

java redis有序列表 redis的有序集合底层实现_底层实现_03

4、集合(set)------用于存储不重复的列表:共同关注、共同喜好、二度好友等

java redis有序列表 redis的有序集合底层实现_跳跃表_04

一个 value 为 null 的 hash 表,所以添加,删除,查找的复杂度都是0(1)。

5、有序集合(zset)------用于带权重的集合:排行榜,弹幕消息(可理解为按消息维度的消息排行榜)等

java redis有序列表 redis的有序集合底层实现_跳跃表_05

简单说来跳跃表)也是链表的一种,只不过它在链表的基础上增加了跳跃功能,正是这个跳跃的功能,使得在查找元素时,跳跃表能够提供O(logN)的时间复杂度。

跳跃表查询、插入、删除的时间复杂度均是O(logN)。

 

为什么使用跳表作为ZSet实现的索引,而不使用红黑树、B+树?