set数据类型介绍
set是集合,它是string类型的无序集合,是随机的,没有顺序。set是通过hash table实现的,添加、删除和查找的复杂度都是0(1)。对集合我们可以取并集、交集和差集。通过这些操作,我们可以实现sns中的好友推荐和blog的tag功能。
关于并集、交集和差集,举个例子:
集合1有数字1,2 集合2有数字2,3 那么 并集=1,2,3 交集=2 差集=1,3
set数据类型方法
- sadd:向指定的set中添加元素,并且不允许同一个元素重复存在即已经存在的元素会添加不成功,返回值为0
- smembers:查看指定set的所有元素
- srem:删除set中指定的元素。rem即remove的缩写
- spop:随机返回并删除set中名称为key的一个元素
- sdiff:返回两个指定集合的差集(即返回所有给定key与第一个key的差集)
- sdiffstore:返回所有给定key与第一个key的差集,并将结果存为另一个key(也就是说,sdiff只能返回差集,但是不能把结果存下来,sdiffstore就能将返回的差集存下来)
- sinter:返回所有给定key的交集
- sinterstore:返回所有给定key的交集,并将结果存为另一个key
- sunion:返回所有给定key的并集
- sunionstore:返回所有给定key的并集,并将结果存为另一个key
- smove:从第一个key对应的set中移除member并添加到第二个对应的set中
- scard:返回指定key的set的元素个数
- sismember:测试member是否是名称为key的set的元素
- srandmember:随机返回名称为key的set的一个元素,但是不删除元素(即随机取指定set里面的某个元素,而且不删除)
方法及操作
1)sadd:向指定的set中添加元素,并且不允许同一个元素重复存在即已经存在的元素会添加不成功,返回值为0 例如:向myset1中添加一个“crystal”的元素,一个“crystalnew”的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SADD myset1 crystal #myset1表示set名称,crystal表示元素
(integer) 1
127.0.0.1:6379> SADD myset1 crystalnew
(integer) 1
127.0.0.1:6379> SADD myset1 crystal #因为crystal这个元素已经存在,所以这里返回0,表示添加不成功
(integer) 0
127.0.0.1:6379> SMEMBERS myset1 #查看myset1中,只有两个元素
1) "crystalnew"
2) "crystal"
127.0.0.1:6379>
备注,同《系统学习redis之三——redis数据类型之string类型及操作》一样,后面的例子也都在同一台机器一次性操作完毕的,因为后面的代码如果不加上“ [root@test101 redis-4.0.1]# src/redis-cli ”这一句。代码高亮也会格式有问题,所以后面所有的例子中都加上了“[root@test101 redis-4.0.1]# src/redis-cli ”,只是为了格式问题。
2)smembers:查看指定set的所有元素 例如:查看myset1的所有元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1 #查看myset1的全部元素
1) "crystalnew"
2) "crystal"
127.0.0.1:6379>
3)srem:删除set中指定的元素,rem即remove的缩写 例如:删除myset1中的crystal元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
2) "crystal"
127.0.0.1:6379> SREM myset1 crystal #删除成功,返回1
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
127.0.0.1:6379> SREM myset1 crystal #因为crystal已经被删除了,所以这里不会删除成功,就返回0
(integer) 0
127.0.0.1:6379> SMEMBERS myset1
1) "crystalnew"
127.0.0.1:6379>
4)spop:随机返回并删除set中名称为key的一个元素 例如:随机删除myset1中的某个元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "crystal2"
2) "crystal3"
3) "crystal"
4) "crystalnew"
127.0.0.1:6379> SPOP myset1 #第一次删除了crystal2
"crystal2"
127.0.0.1:6379> SMEMBERS myset1
1) "crystal3"
2) "crystal"
3) "crystalnew"
127.0.0.1:6379> SPOP myset1 #第二次删除了crystal
"crystal"
127.0.0.1:6379> SMEMBERS myset1 #从前面两次删除的数据看,删除的元素是随机删除的,没有规律性
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379>
5)sdiff:返回两个指定集合的差集(即返回所有给定key与第一个key的差集) 例如:求myset1和myset3之间的差集(以写在前面的key为标准)
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SDIFF myset1 myset3
1) "one" #备注:从myset1的第一个值开始和myset3比较,第一个不相同的值是one,这个是以myset1作为参照物的。如果myset3在前面,返回的就应该是two
127.0.0.1:6379>
127.0.0.1:6379> SDIFF myset3 myset1
1) "two" #如上面的备注,因为myset3在前面,myset3就是参照物,返回的就是和myset3不同的值
127.0.0.1:6379>
6)sdiffstore:返回所有给定key与第一个key的差集,并将结果存为另一个key(也就是说,sdiff只能返回差集,但是不能把结果存下来,sdiffstore就能将返回的差集存下来) 例如:将上面例子中,myset1和myset3的差集并存储到myset4里面
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SDIFF myset1 myset3
1) "one"
127.0.0.1:6379> SDIFFSTORE myset4 myset1 myset3 #将myset1和myset3的差集并存储到myset4里面
(integer) 1
127.0.0.1:6379> SMEMBERS myset4
1) "one" #返回的是one,就是myset和myset3的差集
127.0.0.1:6379>
7)sinter:返回所有给定key的交集 例如:取myset1和myset3之间的交集
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SINTER myset1 myset3
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379>
8)sinterstore:返回所有给定key的交集,并将结果存为另一个key 例如:将上面例子中myset1和myset3的交集取出,并存储到myset5中
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SINTER myset1 myset3 #取myset1和myset3的交集
1) "crystal3"
2) "crystalnew"
127.0.0.1:6379> SINTERSTORE myset5 myset1 myset3 #去交集并存储到myset5中
(integer) 2
127.0.0.1:6379> SMEMBERS myset5 #查看myset5的值,就是myset1和myset3的交集
1) "crystalnew"
2) "crystal3"
127.0.0.1:6379>
9)sunion:返回所有给定key的并集 例如:返回myset1和myset3的并集
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SMEMBERS myset3
1) "two"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SUNION myset1 myset3 #取并集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379>
10)sunionstore:返回所有给定key的并集,并将结果存为另一个key 例如:将上面例子中myset1和myset3的并集取出,并存储到myset6中
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SUNION myset1 myset3 #取并集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> SUNIONSTORE myset6 myset1 myset3 #取并集并存储到myset6中
(integer) 4
127.0.0.1:6379> SMEMBERS myset6 #查看myset6的值,就是myset1和myset3的并集
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379>
11)smove:从第一个key对应的set中移除member并添加到第二个对应的set中 例如:将myset6里面crystalnew元素移动到myset7里面
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset6 #查看myset6当前的元素
1) "one"
2) "crystal3"
3) "two"
4) "crystalnew"
127.0.0.1:6379> SMEMBERS myset7 #myset7当前为空,没有任何元素
(empty list or set)
127.0.0.1:6379> SMOVE myset6 myset7 crystalnew #将myset6里面crystalnew元素移动到myset7里面
(integer) 1
127.0.0.1:6379> SMEMBERS myset6 #myset6里面已经没有了crystalnew这个元素
1) "one"
2) "crystal3"
3) "two"
127.0.0.1:6379> SMEMBERS myset7 #myset7里面已经非空,有个crystalnew这个元素
1) "crystalnew"
127.0.0.1:6379>
12)scard:返回指定key的set的元素个数 例如:返回myset1的元素个数
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1 #先查看当前myset1的元素详情
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SCARD myset1 #scar查看myset1的元素个数
(integer) 3
127.0.0.1:6379>
13)sismember:测试member是否是名称为key的set的元素 例如:测试元素“one”和元素“two”是否为myset1里面的元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SISMEMBER myset1 one #测试one是否为myset1的元素
(integer) 1 #因为one是myeset1里的元素,所以返回1
127.0.0.1:6379> SISMEMBER myset1 two #测试two是否为myset1的元素
(integer) 0 #因为two不是myeset1里的元素,所以返回0
127.0.0.1:6379>
14)srandmember:随机返回名称为key的set的一个元素,但是不删除元素(即随机取指定set里面的某个元素,而且不删除) 例如:随机取myset1里面的某个元素
[root@test101 redis-4.0.1]# src/redis-cli
127.0.0.1:6379> SMEMBERS myset1 #查看myset1当前所有元素
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SRANDMEMBER myset1 #第一次随机获取,得到的是元素crystal3
"crystal3"
127.0.0.1:6379> SMEMBERS myset1
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379> SRANDMEMBER myset1 #第二次随机获取,得到的是元素crystalnew3
"crystalnew"
127.0.0.1:6379> SMEMBERS myset1 #查看myset1当前所有元素,还是原来的元素,并没有被删除
1) "one"
2) "crystal3"
3) "crystalnew"
127.0.0.1:6379>