Redis 使用键值对存储数据,其中的值(对象)包括 5 种类型,即字符串、列表、哈希、集合、有序集合,这是 Redis 对外提供的,实际上,在 Redis 内部每种类型可能有 2 种或更多的内部编码实现。
1、字符串(string)------用于一些常规计数:微博数,粉丝数等
其中:embstr和raw都是由SDS(简单动态字符串)构成的。
唯一区别是:raw是分配内存时,redisobject和sds各分配一块内存,而embstr是redisobject和raw在同一块内存中。
2、列表(list)------用于存储对象:用户信息,商品信息等
压缩列表是在数据结构中元素较少时采取的数据结构,使用压缩列表节约了内存开支,但是降低了访问的速度,不过对于规模较小的对象,这样的损失可以忽略不记。
3、哈希(hash)------用于储存列表:微博的关注列表,粉丝列表等
4、集合(set)------用于存储不重复的列表:共同关注、共同喜好、二度好友等
一个 value 为 null 的 hash 表,所以添加,删除,查找的复杂度都是0(1)。
5、有序集合(zset)------用于带权重的集合:排行榜,弹幕消息(可理解为按消息维度的消息排行榜)等
简单说来跳跃表)也是链表的一种,只不过它在链表的基础上增加了跳跃功能,正是这个跳跃的功能,使得在查找元素时,跳跃表能够提供O(logN)的时间复杂度。
跳跃表查询、插入、删除的时间复杂度均是O(logN)。
为什么使用跳表作为ZSet实现的索引,而不使用红黑树、B+树?