Redis-Set
Set集合
集合类型可以保存多个类型的元素,但和列表类型不同的式,集合类型中的元素是无序的,元素之间不可以重复,这里的无序是顺序不重要,改变元素之间的顺序还是原来的集合。
一个集合中存储最大值为2^32-1元素。
集合类型
Set命令
SADD命令
将一个或者多个元素添加进set中,重复的元素不会被添加进来。
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SADD myset "World"
(integer) 0
redis> SMEMBERS myset
1) "Hello"
2) "World"
SMEMBERS命令
获取一个set中的所有元素,元素间是无序的。
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SMEMBERS myset
1) "Hello"
2) "World"
SISMEMBER命令
判断元素是否在set中,返回值1表示在,0表示不在。
redis> SADD myset "one"
(integer) 1
redis> SISMEMBER myset "one"
(integer) 1
redis> SISMEMBER myset "two"
(integer) 0
SCARD命令
获取一个set中的元素个数
redis> SADD myset "Hello"
(integer) 1
redis> SADD myset "World"
(integer) 1
redis> SCARD myset
(integer) 2
SPOP命令
从set中删除并返回一个或者多个元素,因为set中的元素是无序的,所以出来的元素也都是随机的
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SPOP myset
"one"
redis> SMEMBERS myset
1) "two"
2) "three"
SMOVE命令
将set a中的元素取出来放到set b中,1成功0失败,对于重复元素(set b中有a给的元素),set a中会没用转移元素,set b也不会有转移元素
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myotherset "three"
(integer) 1
redis> SMOVE myset myotherset "two"
(integer) 1
redis> SMEMBERS myset
1) "one"
redis> SMEMBERS myotherset
1) "three"
2) "two"
SREM命令
将指定的元素从set中删除
redis> SADD myset "one"
(integer) 1
redis> SADD myset "two"
(integer) 1
redis> SADD myset "three"
(integer) 1
redis> SREM myset "one"
(integer) 1
redis> SREM myset "four"
(integer) 0
redis> SMEMBERS myset
1) "three"
2) "two"
多集合操作
SINTER命令
获取选中set的交集元素,返回的是交集元素
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SADD key2 "a"
(integer) 1
redis> SINTER key1 key2
1) "a"
SINTERSTRORE命令
获取选中set交集的元素并把这些元素保存到一个新的set中,返回值是交集的个数
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 1
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SINTERSTORE key key1 key2
(integer) 1
redis> SMEMBERS key
1) "c"
UNION命令
获取选中set并集的元素
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 0
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> UNION key1 key2
1) "a"
2) "c"
3) "e"
4) "b"
5) "d"
UNIONSTORE命令
获取选中的set并接并且保存到新的set中
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 0
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SUNIONSTORE key key1 key2
(integer) 5
redis> SMEMBERS key
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
SDIFF命令
获取选中set差集中的元素,这里差集跟选中的set顺序有关,如a{1,2,3,4},b{3,4,5,6}那么a和b的差集是1,2,反过来b和a的差集就是5,6。
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 0
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFFSTORE key key1 key2
(integer) 2
redis> SMEMBERS key
1) "a"
2) "b"
SDIFFSTORE命令
获取选中set差集的元素保存到新的set中
redis> SADD key1 "a"
(integer) 1
redis> SADD key1 "b"
(integer) 1
redis> SADD key1 "c"
(integer) 1
redis> SADD key2 "c"
(integer) 0
redis> SADD key2 "d"
(integer) 1
redis> SADD key2 "e"
(integer) 1
redis> SDIFFSTORE key key1 key2
(integer) 2
redis> SMEMBERS key
1) "a"
2) "b"
命令总结
内部编码
1.intset整数集合:当集合中的元素都是整数,素的个数小于 set-max-intset-entries 配置(默认 512 个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用。
2.hashtable哈希表:当集合类型无法满足 intset 的条件时,Redis 会使用 hashtable 作为集合的内部实现。
127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding setkey
"intset"
127.0.0.1:6379> sadd setkey 1 2 3 4
(integer) 513
127.0.0.1:6379> object encoding setkey
"hashtable"
不为整数时
127.0.0.1:6379> sadd setkey a
(integer) 1
127.0.0.1:6379> object encoding setkey
"hashtable"
使用场景
集合类型经典场景是标签tag,用户对某些方向高感兴趣就会给这个用户贴上对应的标签,通过标签给这个用户推送感兴趣的能热。
#!/bin/bash# 添加用户标签
redis-cli SADD user:1:tags sports music tech
redis-cli SADD user:2:tags music movie food
redis-cli SADD user:3:tags sports tech game# 为标签添加用户
redis-cli SADD tag:sports:users 1 3
redis-cli SADD tag:music:users 1 2
redis-cli SADD tag:tech:users 1 3# 查找共同兴趣
redis-cli SINTER user:1:tags user:2:tags # 用户1和2的共同标签
redis-cli SINTER tag:tech:users tag:sports:users # 既喜欢tech又喜欢sports的用户