Redis基础数据结构
...大约 2 分钟
Redis基础数据结构
Redis有哪些数据结构?底层分别是如何实现的?适合哪些场景?
- 字符串(String):Redis中最基本的数据结构,底层是简单的动态字符串,适合储存简单的键值对数据
- 列表(List):底层实现的双向链表和压缩链表,可以进行快速的插入和删除操作,适合用于实现消息队列、最新消息排行等场景
- 集合(Set):底层实现是哈希表和数组,可以实现高效的插入、删除和查找操作,并且支持对多个集合进行交集、并集和差集等操作,适合用于去重、共同好友查找等场景
- 有序集合(Z Set):底层实现是跳跃表和压缩链表的结合,可以对每个元素关联一个分数,并按照分数进行排序,适合用于排行榜、安全中获取数据等场景
- 哈希(Hash):底层实现是哈希表和压缩链表,可以储存多个键值对,适合用于储存对象或者记录的多个字段
还有其他数据类型吗?
- 位图:以位的形式储存数据,适合处理大量的布尔值数据
- 超日志:用于估计唯一元素的数量,节省内存空间
- 地理空间:用于存储地理位置数据,并支持地理位置查询
- 流:用于处理消息队列和日志数据
Z-set为什么要使用两种数据结构?
面对不同数量的数据情况,需要用不同的数据结构
数据量小的情况,需要压缩内存:选择压缩链表(以时间换空间)
数据量大的情况,需要提高查询效率:选跳表(以空间换时间)
为什么要使用跳表而不是二叉树或红黑树
- 实现简单:相比与红黑树等平衡树,跳表的实现方式更加简单。它使用了层级结构和随机化的方式来时先平衡性,减少了实现的复杂性。跳表的插入、删除和查找操作的时间复杂度都是O(log n),在实践中表现良好
- 占用空间小:跳表相对于二叉树和红黑树具有更好的空间效率。跳表不需要存储额外的指针和颜色信息,只需要存储节点的值和层级索引。这使得跳表在空间占用方面更加节省
- 范围查询效率高:跳表对于范围查询有较好的支持。通过跳表的层级结构,可以快速定位到需要的位置,从而实现高效的范围查询