redis内部数据结构总结(7)intset
来源:互联网 发布:泰安优化公司 编辑:程序博客网 时间:2024/06/03 16:21
Redis里面使用intset是为了实现集合(set)这种对外的数据结构。set结构类似于数学上的集合的概念,它包含的元素无序,且不能重复。Redis里的set结构还实现了基础的集合并、交、差的操作。与Redis对外暴露的其它数据结构类似,set的底层实现,随着元素类型是否是整型以及添加的元素的数目多少,而有所变化。概括来讲,当set中添加的元素都是整型且元素数目较少时,set使用intset作为底层数据结构,否则,set使用dict作为底层数据结构。
便于在上面进行二分查找,用于快速地判断一个元素是否属于这个集合。它在内存分配上与ziplist有些类似,是连续的一整块内存空间,而且对于大整数和小整数(按绝对值)采取了不同的编码,尽量对内存的使用进行了优化。
intset与ziplist相比:
ziplist可以存储任意二进制串,而intset只能存储整数。
ziplist是无序的,而intset是从小到大有序的。因此,在ziplist上查找只能遍历,而在intset上可以进行二分查找,性能更高。
ziplist可以对每个数据项进行不同的变长编码(每个数据项前面都有数据长度字段len),而intset只能整体使用一个统一的编码(encoding)。
我们前面提到过,set的底层实现,随着元素类型是否是整型以及添加的元素的数目多少,而有所变化。
dict是一个用于维护key和value映射关系的数据结构,那么当set底层用dict表示的时候,它的key和value分别是什么呢?实际上,key就是要添加的集合元素,而value是NULL。
对于小集合使用intset来存储,主要的原因是节省内存。特别是当存储的元素个数较少的时候,dict所带来的内存开销要大得多(包含两个哈希表、链表指针以及大量的其它元数据)。所以,当存储大量的小集合而且集合元素都是数字的时候,用intset能节省下一笔可观的内存空间。
实际上,从时间复杂度上比较,intset的平均情况是没有dict性能高的。以查找为例,intset是O(log n)的,而dict可以认为是O(1)的。但是,由于使用intset的时候集合元素个数比较少,所以这个影响不大。
便于在上面进行二分查找,用于快速地判断一个元素是否属于这个集合。它在内存分配上与ziplist有些类似,是连续的一整块内存空间,而且对于大整数和小整数(按绝对值)采取了不同的编码,尽量对内存的使用进行了优化。
set-max-intset-entries 512
intset与ziplist相比:
ziplist可以存储任意二进制串,而intset只能存储整数。
ziplist是无序的,而intset是从小到大有序的。因此,在ziplist上查找只能遍历,而在intset上可以进行二分查找,性能更高。
ziplist可以对每个数据项进行不同的变长编码(每个数据项前面都有数据长度字段len),而intset只能整体使用一个统一的编码(encoding)。
我们前面提到过,set的底层实现,随着元素类型是否是整型以及添加的元素的数目多少,而有所变化。
dict是一个用于维护key和value映射关系的数据结构,那么当set底层用dict表示的时候,它的key和value分别是什么呢?实际上,key就是要添加的集合元素,而value是NULL。
对于小集合使用intset来存储,主要的原因是节省内存。特别是当存储的元素个数较少的时候,dict所带来的内存开销要大得多(包含两个哈希表、链表指针以及大量的其它元数据)。所以,当存储大量的小集合而且集合元素都是数字的时候,用intset能节省下一笔可观的内存空间。
实际上,从时间复杂度上比较,intset的平均情况是没有dict性能高的。以查找为例,intset是O(log n)的,而dict可以认为是O(1)的。但是,由于使用intset的时候集合元素个数比较少,所以这个影响不大。
0 0
- redis内部数据结构总结(7)intset
- Redis内部数据结构详解之整数集合(intset)
- redis数据结构之 intset
- Redis-数据结构-整数集合-intset
- Redis内部数据结构总结(5)skiplist
- Redis内部数据结构总结(4)quicklist
- Redis内部数据结构总结(3)ziplist
- Redis内部数据结构总结(2)dict
- Redis源码分析-内存数据结构intset
- Redis源码分析(intset)
- Redis intset
- Redis内部数据结构总结(1)sds和robj
- 【Redis源码剖析】 - Reids内置数据结构之整数集合intset
- redis之intset
- redis之intset
- redis --内部结构--intset
- redis 源码 -- intset
- Redis内部实现(数据结构和对象)
- input边框的兼容问题
- Android 7.0 调用照相机照相报错 FileUriExposedException 解决
- 东莞流涌尾一天游
- 小米MAX线刷教程
- C程序设计学习笔记(完结)
- redis内部数据结构总结(7)intset
- 用eclipse导入web项目时提示的找不到servlet包的错误
- swift在通知时的变化
- struck(结构化SVM用于视觉跟踪)--源代码详解--tracker.cpp
- 766D Mahmoud and a Dictionary[带权并查集][dfs]
- 元宵
- ubuntu环境下使用eclipse手动配置c/c++开发环境
- RS-232协议
- BFPRT算法(TOP-K问题)