1. 集合简介
集合(set)类型用来保存多个字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。
2. 常用命令
# (1) 添加元素
beh07:6379> SADD hobbies book music
(integer) 2 # 返回添加成功的元素的个数
beh07:6379> SADD hobbies book
(integer) 0
# (2) 删除元素
beh07:6379> SREM hobbies music
(integer) 1 # 返回删除成功的个数
# (3) 统计集合中元素的个数
beh07:6379> SCARD hobbies
(integer) 1
# (4) 判断元素是否在集合中,1代表true,0代表false
beh07:6379> SISMEMBER hobbies music
(integer) 0
beh07:6379> SISMEMBER hobbies book
(integer) 1
# (5) 从集合中随机返回指定个数的元素(默认返回一个)
beh07:6379> SADD nums 1 2 3 4 5 6 7 8 9
(integer) 9
beh07:6379> SRANDMEMBER nums
"3"
beh07:6379> SRANDMEMBER nums 3
1) "4"
2) "7"
3) "3"
# (6) 从集合中随机弹出一个元素(该元素被删除)
beh07:6379> SPOP nums
"7"
beh07:6379> SPOP nums 3
1) "4"
2) "2"
3) "9"
beh07:6379> SMEMBERS nums
1) "1"
2) "3"
3) "5"
4) "6"
5) "8"
# (7) 获取全部元素
beh07:6379> SMEMBERS nums
1) "1"
2) "3"
3) "5"
4) "6"
5) "8"
3. 集合间操作
beh07:6379> SADD nums1 1 2 3 4 5
(integer) 5
beh07:6379> SADD nums2 1 3 5 7 9
(integer) 5
# (1) 交集
beh07:6379> SINTER nums1 nums2
1) "1"
2) "3"
3) "5"
# (2) 并集
beh07:6379> SUNION nums1 nums2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
7) "9"
# (3) 差集(求左边存在而右边不存在的元素)
beh07:6379> SDIFF nums1 nums2
1) "2"
2) "4"
beh07:6379> SDIFF nums2 nums1
1) "7"
2) "9"
# (4) 将集合运算结果保存到另一个集合中
# 将nums1和nums2这两个集合的交集保存到nums1_inter_nums2这个集合中
# SUNIONSTORE和SDIFFSTORE这两个命令的作用同理
beh07:6379> SINTERSTORE nums1_inter_nums2 nums1 nums2
(integer) 3
beh07:6379> SMEMBERS nums1_inter_nums2
1) "1"
2) "3"
3) "5"
4. 内部编码
当集合中的元素都是整数且元素个数小于set-max-intset-entries
这个配置的值时,Redis会选用intset
来作为集合的内部实现,从而减少内存的使用。
set-max-intset-entries 512
beh07:6379> SADD nums 1 2 3
(integer) 3
beh07:6379> object encoding nums
"intset"
当set中存储的是字符串类型的值或者存储的int类型的值的个数大于set-max-intset-entries
设置的值后,Redis会选用hashtable
来作为集合的内部实现。
beh07:6379> sadd names tom tony
(integer) 2
beh07:6379> object encoding names
"hashtable"
网友评论