赞
踩
Redis无论什么数据类型,存储的时候都是以键值对key-value形势存储,并且所有的key都是String类型,本文讨论的数据类型是value的数据类型。
概述:Set集合是一种无序不重复的数据结构,查询效率高,具备去重功能,支持集合的交集、并集、差集运算,其应用场景丰富。
Set常用命令:
命令 | 描述 |
---|---|
sadd key member1 memeber2 … | 将一个或者多个成员添加到键为key的集合中 |
scard key | 统计键为key的集合中元素的数量 |
sismember key member | 判断member 是否在键为key的集合中,存在返回1,否则返回0 |
smembers key | 查询键为key的集合中的所有元素 |
spop key | 随机移出键为key的集合中的一个元素 |
smove src des member | 将元素member从src集合中移动到des集合中 |
srem key member1 member2 … | 移出键为key的集合中的多个元素 |
sinter key1 key2 … | 求多个集合的交集 |
sinterstore des key1 key2 … | 将多个集合的交集保存到新的集合des中 |
sunion key1 key2 … | 求多个集合的并集 |
sunionstore des key1 key2 … | 将多个集合的并集保存到新的集合des中 |
sdiff key1 key2 … | 求第一个集合与后面多个集合的差集 |
sdiffstore des key1 key2 … | 将第一个集合与后面多个集合的差集保存到新的集合des中 |
注意观察上面所有的命令都是以 S 开头,表示操作的是Set集合。
Set类型底层数据结构:
intSet结构定义如下:
typedef struct intset {
//编码方式
uint32_t encoding;
//集合包含的元素数量
uint32_t length;
//保存元素的数组
int8_t contents[];
} intse
inSet、listpack和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的元素,那就会造成资源浪费,因此有升级操作后,是可以节约内存资源的,升级操作不可逆的,是不支持降级操作的。
set的应用场景:
如有不正确的地方请各位指出纠正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。