Redis的Set是string類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復的數(shù)據(jù)。
Redis 中 集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復雜度都是O(1)。
集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
-
實例
127.0.0.1:6379> SADD runoobkey redis
(integer) 1
127.0.0.1:6379> SADD runoobkey mongodb
(integer) 1
127.0.0.1:6379> SADD runoobkey mysql
(integer) 1
127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
127.0.0.1:6379> SMEMBERS runoobkey
1) "mysql"
2) "redis"
3) "mongodb"
在以上實例中我們通過 SADD 命令向名為 runoobkey 的集合插入的三個元素。
Redis 集合命令
下表列出了 Redis 集合基本命令:
-
1 Sadd
Redis Sadd 命令將一個或多個成員元素加入到集合中,已經(jīng)存在于集合的成員元素將被忽略。
假如集合 key 不存在,則創(chuàng)建一個只包含添加的元素作成員的集合。
當集合 key 不是集合類型時,返回一個錯誤。
注意:在Redis2.4版本以前, SADD 只接受單個成員值。
# 語法
redis 127.0.0.1:6379> SADD KEY_NAME VALUE1..VALUEN
# 返回值
被添加到集合中的新元素的數(shù)量,不包括被忽略的元素。
# 實例
127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> SADD myset "foo"
(integer) 1
127.0.0.1:6379> SADD myset "hello"
(integer) 0
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "foo"
-
2 Scard
Redis Scard 命令返回集合中元素的數(shù)量。
# 語法
redis 127.0.0.1:6379> SCARD KEY_NAME
# 返回值
集合的數(shù)量。 當集合 key 不存在時,返回 0 。
# 實例
127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> SADD myset "foo"
(integer) 1
127.0.0.1:6379> scard myset
(integer) 2
-
3 Sdiff
Redis Sdiff 命令返回給定集合之間的差集。不存在的集合 key 將視為空集。
# 語法
redis 127.0.0.1:6379> SDIFF FIRST_KEY OTHER_KEY1..OTHER_KEYN
# 返回值
包含差集成員的列表。
# 實例
127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> SADD myset "foo"
(integer) 1
127.0.0.1:6379> SADD myset "bar"
(integer) 1
127.0.0.1:6379> SADD myset2 "hello"
(integer) 1
127.0.0.1:6379> SADD myset2 "world"
(integer) 1
127.0.0.1:6379> SDIFF myset myset2
1) "foo"
2) "bar"
127.0.0.1:6379> SDIFF myset2 myset
1) "world"
-
4 Sdiffstore
Redis Sdiffstore 命令將給定集合之間的差集存儲在指定的集合中。如果指定的集合 key 已存在,則會被覆蓋。
# 語法
redis 127.0.0.1:6379> SDIFFSTORE DESTINATION_KEY KEY1..KEYN
# 返回值
結(jié)果集中的元素數(shù)量。
# 實例
# 對已存在的鍵進行設置
127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> SADD myset "foo"
(integer) 1
127.0.0.1:6379> SADD myset "bar"
(integer) 1
127.0.0.1:6379> SADD myset2 "hello"
(integer) 1
127.0.0.1:6379> SADD myset2 "world"
(integer) 1
127.0.0.1:6379> SDIFFSTORE destset myset myset2
(integer) 2
127.0.0.1:6379> SMEMBERS destset
1) "foo"
2) "bar"
127.0.0.1:6379> SDIFFSTORE destset2 myset2 myset
(integer) 1
127.0.0.1:6379> SMEMBERS destset2
1) "world"
-
5 Sinter
Redis Sinter 命令返回給定所有給定集合的交集。 不存在的集合 key 被視為空集。 當給定集合當中有一個空集時,結(jié)果也為空集(根據(jù)集合運算定律)。
# 語法
redis 127.0.0.1:6379> SINTER KEY KEY1..KEYN
# 返回值
在 Redis 2.6.12 以前版本, SET 命令總是返回 OK 。
# 實例
127.0.0.1:6379> SADD myset "hello"
(integer) 1
127.0.0.1:6379> SADD myset "foo"
(integer) 1
127.0.0.1:6379> SADD myset "bar"
(integer) 1
127.0.0.1:6379> SADD myset2 "hello"
(integer) 1
127.0.0.1:6379> SADD myset2 "world"
(integer) 1
127.0.0.1:6379> SINTER myset myset2
1) "hello"
127.0.0.1:6379> SINTER myset2 myset
1) "hello"
-
6 Sinterstore
Redis Sinterstore 命令將給定集合之間的交集存儲在指定的集合中。如果指定的集合已經(jīng)存在,則將其覆蓋。
# 語法
redis 127.0.0.1:6379> SINTERSTORE DESTINATION_KEY KEY KEY1..KEYN
# 返回值
指定集合的元素數(shù)量
# 實例
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "foo"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> SADD myset2 "hello"
(integer) 1
127.0.0.1:6379> SADD myset2 "world"
(integer) 1
127.0.0.1:6379> SINTERSTORE myset myset1 myset2
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "hello"
-
7 Sismember
Redis Sismember 命令判斷成員元素是否是集合的成員。
# 語法
redis 127.0.0.1:6379> SISMEMBER KEY VALUE
# 返回值
如果成員元素是集合的成員,返回 1 。 如果成員元素不是集合的成員,或 key 不存在,返回 0 。
# 實例
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "foo"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> SISMEMBER myset1 "666"
(integer) 0
127.0.0.1:6379> SISMEMBER myset1 "hello"
(integer) 1
-
8 Smembers
Redis Smembers 命令返回集合中的所有的成員。 不存在的集合 key 被視為空集合。
# 語法
redis 127.0.0.1:6379> SMEMBERS KEY VALUE
# 返回值
集合中的所有成員。
# 實例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "world"
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "hello"
2) "world"
-
9 Smove
Redis Smove 命令將指定成員 member 元素從 source 集合移動到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,則 SMOVE 命令不執(zhí)行任何操作,僅返回 0 。否則, member 元素從 source 集合中被移除,并添加到 destination 集合中去。
當 destination 集合已經(jīng)包含 member 元素時, SMOVE 命令只是簡單地將 source 集合中的 member 元素刪除。
當 source 或 destination 不是集合類型時,返回一個錯誤。
# 語法
redis 127.0.0.1:6379> SMOVE SOURCE DESTINATION MEMBER
# 返回值
如果成員元素被成功移除,返回 1 。 如果成員元素不是 source 集合的成員,并且沒有任何操作對 destination 集合執(zhí)行,那么返回 0 。
# 實例
# 對已存在的鍵進行設置
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "world"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> SADD myset2 "foo"
(integer) 1
127.0.0.1:6379> SMOVE myset1 myset2 "bar"
(integer) 1
127.0.0.1:6379> SMEMBERS myset1
1) "hello"
2) "world"
127.0.0.1:6379> SMEMBERS myset2
1) "foo"
2) "bar"
-
10 Spop
Redis Spop 命令用于移除并返回集合中的一個隨機元素。
# 語法
redis 127.0.0.1:6379> SPOP KEY
# 返回值
在被移除的隨機元素。 當集合不存在或是空集時,返回 nil 。
# 實例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "world"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> SPOP myset1
"hello"
127.0.0.1:6379> SMEMBERS myset1
1) "bar"
2) "world"
-
11 Srandmember
Redis Srandmember 命令用于返回集合中的一個隨機元素。
從 Redis 2.6 版本開始, Srandmember 命令接受可選的 count 參數(shù):
1): 如果 count 為正數(shù),且小于集合基數(shù),那么命令返回一個包含 count 個元素的數(shù)組,數(shù)組中的元素各不相同。如果 count 大于等于集合基數(shù),那么返回整個集合。
2): 如果 count 為負數(shù),那么命令返回一個數(shù)組,數(shù)組中的元素可能會重復出現(xiàn)多次,而數(shù)組的長度為 count 的絕對值。
該操作和 SPOP 相似,但 SPOP 將隨機元素從集合中移除并返回,而 Srandmember 則僅僅返回隨機元素,而不對集合進行任何改動。
# 語法
redis 127.0.0.1:6379> SRANDMEMBER KEY [count]
# 返回值
只提供集合 key 參數(shù)時,返回一個元素;如果集合為空,返回 nil 。 如果提供了 count 參數(shù),那么返回一個數(shù)組;如果集合為空,返回空數(shù)組。
# 實例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "world"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> SRANDMEMBER myset1
"hello"
127.0.0.1:6379> SRANDMEMBER myset1
"bar"
127.0.0.1:6379> SRANDMEMBER myset1
"bar"
127.0.0.1:6379> SRANDMEMBER myset1 2
1) "hello"
2) "bar"
-
12 Srem
Redis Srem 命令用于移除集合中的一個或多個成員元素,不存在的成員元素會被忽略。
當 key 不是集合類型,返回一個錯誤。
在 Redis 2.4 版本以前, SREM 只接受單個成員值。
# 語法
redis 127.0.0.1:6379> SREM KEY MEMBER1..MEMBERN
# 返回值
被成功移除的元素的數(shù)量,不包括被忽略的元素。
# 實例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "world"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> SRANDMEMBER myset1
"hello"
127.0.0.1:6379> SRANDMEMBER myset1
"bar"
127.0.0.1:6379> SRANDMEMBER myset1
"bar"
127.0.0.1:6379> SRANDMEMBER myset1 2
1) "hello"
2) "bar"
-
13 Sunion
Redis Sunion 命令返回給定集合的并集。不存在的集合 key 被視為空集。
# 語法
redis 127.0.0.1:6379> SUNION KEY KEY1..KEYN
# 返回值
并集成員的列表。
# 實例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD key1 "a"
(integer) 1
127.0.0.1:6379> SADD key1 "b"
(integer) 1
127.0.0.1:6379> SADD key1 "c"
(integer) 1
127.0.0.1:6379> SADD key2 "c"
(integer) 1
127.0.0.1:6379> SADD key2 "d"
(integer) 1
127.0.0.1:6379> SADD key2 "e"
(integer) 1
127.0.0.1:6379> SUNION key1 key2
1) "b"
2) "a"
3) "c"
4) "d"
5) "e"
-
14 Sunionstore
Redis Sunionstore 命令將給定集合的并集存儲在指定的集合 destination 中。如果 destination 已經(jīng)存在,則將其覆蓋。
# 語法
redis 127.0.0.1:6379> SUNIONSTORE DESTINATION KEY KEY1..KEYN
# 返回值
結(jié)果集中的元素數(shù)量。
# 實例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "world"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> SADD myset2 "hello"
(integer) 1
127.0.0.1:6379> SADD myset2 "bar"
(integer) 1
127.0.0.1:6379> SADD myset2 "foo"
(integer) 1
127.0.0.1:6379> SUNIONSTORE myset myset1 myset2
(integer) 4
127.0.0.1:6379> SMEMBERS myset
1) "hello"
2) "foo"
3) "world"
4) "bar"
-
15 Sscan
Redis Sscan 命令用于迭代集合鍵中的元素。
# 語法
SSCAN key cursor [MATCH pattern] [COUNT count]
# 返回值
數(shù)組列表。
# 實例
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SADD myset1 "hello"
(integer) 1
127.0.0.1:6379> SADD myset1 "hi"
(integer) 1
127.0.0.1:6379> SADD myset1 "bar"
(integer) 1
127.0.0.1:6379> sscan myset1 0 match h*
1) "0"
2) 1) "hi"
2) "hello"