Redis数据类型–Set类型详解及应用
数据结构
Redis无论什么数据类型,存储的时候都是以键值对key-value形势存储,并且所有的key都是String类型,本文讨论的数据类型是value的数据类型。
Set集合
概述:Set集合是一种无序不重复的数据结构,查询效率高,具备去重功能,支持集合的交集、并集、差集运算,其应用场景丰富。
Set常用命令:
注意观察上面所有的命令都是以 S 开头,表示操作的是Set集合。
Set类型底层数据结构:
intSet:是一种紧凑型的数组结构存,储纯数字的情况下才会用到,且元素数量不能超过512个。
hashTable:hash表结构,和Redis hash类型的hashTable一样,不满足intSet的条件会使用hashTable。
listpack:Redis 7.2版本之后加入了listpack数据结构。
intSet结构定义如下:
typedef struct intset {
//编码方式
uint32_t encoding;
//集合包含的元素数量
uint32_t length;
//保存元素的数组
int8_t contents[];
} intse
encoding:编码方式,共有 int16_t、int32_t、int64_t 三种类型。
length:集合中元素的数量。
contents[]:保存元素的数组。
inSet、listpack和hashtable的相互转换(针对存储字符串的情况讨论)?
当前编码为set,没有超过阀值,使用listpack超过阀值则使用hashTable。
当前编码为listpack,没有超过阀值就使用listpack,超过阀值就使用hashTable。
当前编码是hashTable,直接插入,不进行编码转换。
intSet、listpack的最大元素数量可以在redis.conf配置:
set-max-intset-entries 512
#从listpack转换为hashTable需要满足这两个条件
set-max-listpack-entries 128
set_max_listpack_value 64
为什么加入了listpack?
因为hashTable的空间开销高,哈希碰撞概率高,listpack结构可以提高内存使用率和操作效率。
什么是intSet的升级操作?
如果我们的intSet使用的是int16_t类型的编码,此时新增一个元素类型int32_t,此时整数集合就要升级,先把contents [] 扩展为int32_t,然后再把新元素加入到intSet中,升级过程中是有序的,且是在原来的数组上操作。
intSet的升级操作有什么好处?
可以节约内存资源,当我们不知道元素是多少位的时候,如果直接使用int64_t 的编码,那肯定是最简单的,但是如果保存的数据中没有int64_t的元素,那就会造成资源浪费,因此有升级操作后,是可以节约内存资源的,升级操作不可逆的,是不支持降级操作的。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
66源码网 » Redis数据类型–Set类型详解及应用