今天来了解下Redis的Set这一数据类型。Set是String类型的无序集合。跟java中的Set类似,Redis的Set是一个无序且不能有重复元素的集合。
集合对象的编码可以是 intset 或者 hashtable:
intset编码的集合对象使用整数集合作为底层实现,集合对象包含的所有元素都被保存在整数集合里面;
hashtable编码的集合对象使用字典作为底层实现,字典的每个键都是一个字符串对象,每个字符串对象包含了一个集合元素,而字典的值全部被设置为NULL。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2的32次方 - 1 (4294967295, 每个集合可存储40多亿个成员)。
Set的主要应用:比如统计共同好友、利用其元素的唯一性来统计访问网站的所有独立ip等
接下来就了解下Set的一些常用命令:
1、SADD key member1 [member2...]:向集合添加一个或多个成员。
127.0.0.1:6379> SADD myset redis mongodb mysql oracle
(integer) 4
2、SCARD key:获取集合的成员数。
比如获取上面新增的myset:
127.0.0.1:6379> SCARD myset
(integer) 4
3、SMEMBERS key:返回集合中的所有成员。
还是继续操作查看myset:
127.0.0.1:6379> SMEMBERS myset
1) "oracle"
2) "mysql"
3) "mongodb"
4) "redis"
4、SISMEMBER key:判断 member 元素是否是集合 key 的成员。
如果是,返回1;如果不是返回0;
127.0.0.1:6379> SISMEMBER myset redis
(integer) 1
127.0.0.1:6379> SISMEMBER myset db2
(integer) 0
5、SRANDMEMBER key [count]:
只提供集合 key 参数时,返回一个元素;如果集合为空,返回 nil 。 如果提供了 count 参数,那么返回一个数组;如果集合为空,返回空数组。如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素不会重复。如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
127.0.0.1:6379> SADD myset one two three
(integer) 3
127.0.0.1:6379> SRANDMEMBER myset 1
1) "one"
127.0.0.1:6379> SRANDMEMBER myset 2
1) "one"
2) "two"
127.0.0.1:6379> SRANDMEMBER myset
"two"
127.0.0.1:6379> SRANDMEMBER myset 3
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> SRANDMEMBER myset 4
1) "one"
2) "two"
3) "three"
127.0.0.1:6379> SRANDMEMBER myset -3
1) "one"
2) "two"
3) "two"
127.0.0.1:6379> SRANDMEMBER myset -4
1) "one"
2) "one"
3) "one"
4) "two"
127.0.0.1:6379> SRANDMEMBER myset2 2
(empty list or set)
127.0.0.1:6379> SRANDMEMBER myset2
(nil)
127.0.0.1:6379> SRANDMEMBER myset2 -3
(empty list or set)
6、SPOP key [count]:移除并返回集合中的一个随机元素。
如果count大于集合内部的元素数量,此命令将会返回整个集合,不会有额外的元素。
127.0.0.1:6379> SMEMBERS myset
1) "oracle"
2) "mysql"
3) "mongodb"
4) "redis"
127.0.0.1:6379> SPOP myset 1
1) "mysql"
127.0.0.1:6379> SMEMBERS myset
1) "oracle"
2) "mongodb"
3) "redis"
7、SSCAN key cursor [MATCH pattern] [COUNT count]:用于迭代集合中键的元素。
Sscan 继承自 Scan,所以用法跟Scan类似。
127.0.0.1:6379> SMEMBERS myset
1) "one"
2) "three"
3) "two"
127.0.0.1:6379> SSCAN myset 0 MATCH t*
1) "0"
2) 1) "three"
2) "two"
8、SDIFF key1 [key2]:返回第一个集合与其他集合之间的差异。
127.0.0.1:6379> SADD key1 a b c d
(integer) 4
127.0.0.1:6379> SADD key2 b d e
(integer) 3
127.0.0.1:6379> SDIFF key1 key2
1) "c"
2) "a"
127.0.0.1:6379> SADD key3 c d e
(integer) 3
127.0.0.1:6379> SDIFF key1 key2 key3
1) "a"
9、SDIFFSTORE key key1 [key2...]:返回给定所有集合的差集并存储在 key 中。
127.0.0.1:6379> SDIFFSTORE dkey key1 key2 key3
(integer) 1
127.0.0.1:6379> SMEMBERS dkey
1) "a"
127.0.0.1:6379>
10、SINTER key1 [key2...]:返回给定所有集合的交集。
127.0.0.1:6379> SADD key1 a b c d
(integer) 4
127.0.0.1:6379> SADD key2 a c d e
(integer) 4
127.0.0.1:6379> SADD key3 a d e f
(integer) 4
127.0.0.1:6379> SINTER key1 key2 key3
1) "d"
2) "a"
11、SINTERSOTRE key key1 [key2...]:返回给定所有集合的交集并存储在 key 中。
127.0.0.1:6379> SADD key1 a b c d
(integer) 4
127.0.0.1:6379> SADD key2 a c d e
(integer) 4
127.0.0.1:6379> SADD key3 a d e f
(integer) 4
127.0.0.1:6379> SINTERSTORE dkey key1 key2 key3
(integer) 2
127.0.0.1:6379> SMEMBERS dkey
1) "a"
2) "d"
12、SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
127.0.0.1:6379> SADD skey1 three four five
(integer) 3
127.0.0.1:6379> SADD skey2 one two
(integer) 2
127.0.0.1:6379> SADD skey1 three four five
(integer) 3
127.0.0.1:6379> SMOVE skey1 skey2 four
(integer) 1
127.0.0.1:6379> SMEMBERS skey1
1) "five"
2) "three"
127.0.0.1:6379> SMEMBERS skey2
1) "one"
2) "two"
3) "four"
13、SREM key member1 [member2...]:移除集合中一个或多个成员
SREM 命令用于移除集合中的一个或多个成员元素,不存在的成员元素会被忽略
127.0.0.1:6379> SMEMBERS skey2
1) "one"
2) "two"
3) "four"
127.0.0.1:6379> SREM skey2 one four
(integer) 2
127.0.0.1:6379> SMEMBERS skey2
1) "two"
14、SUNION key1 [key2...]:返回所有给定集合的并集
127.0.0.1:6379> SADD key1 a b c
(integer) 3
127.0.0.1:6379> SADD key2 a e f
(integer) 3
127.0.0.1:6379> SADD key3 c g h
(integer) 3
127.0.0.1:6379> SUNION key1 key2 key3
1) "f"
2) "g"
3) "c"
4) "a"
5) "e"
6) "h"
7) "b"
15、SUNIONSTORE destination key [key ...]:所有给定集合的并集存储在 destination 集合中。
127.0.0.1:6379> SADD key1 a b c
(integer) 3
127.0.0.1:6379> SADD key2 a e f
(integer) 3
127.0.0.1:6379> SADD key3 c g h
(integer) 3
127.0.0.1:6379> SUNIONSTORE skey key1 key2 key3
(integer) 7
127.0.0.1:6379> SMEMBERS skey
1) "f"
2) "g"
3) "c"
4) "a"
5) "e"
6) "h"
7) "b"
今日小结:
今天主要介绍了Redis的集合这一数据类型以及常用的一些命令,用好Redis,掌握这些命令还是很重要的。每天学习一点点,每天进步一点点,各位兄die加油!!!