12 Redis 集合(Set)

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"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容