3 4 redis資料型別之集合(set)

2021-08-27 20:10:07 字數 3250 閱讀 7354

[b]3.5 集合型別[/b]

在集合中的每個元素都是不同的,且[b]沒有順序[/b]。乙個集合型別(set)鍵可以儲存至多2^32-1個(相信這個數字對大家來說已經很熟悉了)字串。集合型別和列表型別有相似之處,但很容易將它們區分開來,如表3-4所示。

[img]

集合型別的常用操作是向集合中[b]加入或刪除元素、判斷某個元素是否存在[/b]等,由於集合型別在redis內部是使用值為空的雜湊表(hash table)實現的,所以這些操作的時間複雜度都是0(1)。最方便的是多個集合型別鍵之間還可以進行並集、交集和差集運算,稍後就會看到靈活運用這一特性帶來的便利。

[b]3.5.2 命令[/b]

[b]1.增加/刪除元素[/b]

sadd key member [member …]

srem key member [member …]

sadd命令用來向集合中增加乙個或多個元素,如果鍵[color=red]不存在則會自動建立[/color]。因為在乙個集合中[color=red]不能有相同的元素[/color],所以如果要加入的元素[color=red]已經存在於集合中就會忽略這個元素[/color]。本命令的返回值是成功加入的元素數量(忽略的元素不計算在內)。例如:

redis>sadd letters a

(integer) 1

redis> sadd letters a b c

(integer) 2

srem命令用來從集合中刪除乙個或多個元素,並返回刪除成功的個數,例如:

redis>srem letters c d

(integer) 1

[b]2.獲得集合中的所有元素[/b]

smembers key

smembers命令會返回集合中的所有元素,例如:

redis>smembers letters

1) "b"

2) "a"

[b]3.判斷元素是否在集合中[/b]

sismember key member

判斷乙個元素是否在集合中是乙個時間複雜度為[color=red]o(1)[/color]的操作,無論集合中有多少個元素,sismember命令始終可以極快地返回結果。當值存在時sismember命令返回1,當值不存在或鍵不存在時返回0,例如:

redis>sismember letters a

(integer) 1

redis>sismember letters d

(integer) 0

[b]4.集合間運算[/b]

sdiff key [key …]

sinter key [key …]

sunion key [key …]

接下來要介紹的3個命令都是用來進行多個集合間運算的。

(1) [b]sdiff[/b]命令用來對多個集合執行[b]差集[/b]運算。集合a與集合b的差集表示為a-b,代表所有屬於a且不屬於b的元素構成的集合。

(2) [b]sinter[/b]命令用來對多個集合執行[b]交集[/b]運算。集合a與集合b的交集表示為a∩b,代表所有屬於a且屬於b的元素構成的集合。

(3) [b]sunion[/b]命令用來對多個集合執行[b]並集[/b]運算。集合a與集合b的並集表示為aub,代表所有屬於a或屬於b的元素構成的集合。

[b]5.獲得集合中元素個數[/b]

scard key

scard命令用來獲得集合中的元素個數,例如:

redis>smembers letters

1) "b"

2) "a"

redis>scard letters

(integer) 2

[b]6.進行集合運算並將結果儲存[/b]

sdiffstore destination key [key …]

sinterstore destination key [key …]

sunionstore destination key [key …]

sdiffstore命令和sdiff命令功能一樣,唯一的區別就是前者不會直接返回運算結果,而是將結果[color=red]儲存在destination鍵中[/color]。sdiffstore命令常用於需要進行多步集合運算的場景中,如需要先計算差集再將結果和其他鍵計算交集。

sinterstore和sunionstore命令與之類似,不再贅述。

[b]7.隨機獲得集合中的元素[/b]

srandmember key [count]

srandmember命令用來隨機從集合中獲取乙個元素,如:

redis>srandmember letters

"a"redis>srandmember letters

"b"redis>srandmember letters

"a"

還可以傳遞count引數來一次隨機獲得多個元素,根據count的正負不同,具體表現也不同。

(1)當count為[color=red]正數[/color]時,srandmember會隨機從集合裡獲得count個[color=red]不重複的元素[/color]。如果count的值大於集合中的元素個數,則srandmember會返回集合中的全部元素。

(2)當count為[color=red]負數[/color]時,srandmember會隨機從集合裡獲得|count|個的元素,這些元素有[color=red]可能相同[/color]。

[b]8.從集合中彈出乙個元素[/b]

spop key

3.4節中我們學習過lpop命令,作用是從列表左邊彈出乙個元素(即返回元素的值並刪除它)。spop命令的作用與之類似,但由於集合型別的元素是無序的,所以spop命令會從集合中隨機選擇乙個元素彈出。例如:

redis>spop letters

"b"redis>smembers letters

1) "a"

2) "c"

3) "d"

Redis 資料型別之集合

redis set 集合 是 sadd srandmember 等命令的操作物件,它使用 redis encoding intset 和 redis encoding ht 兩種方式編碼。編碼的選擇 第乙個新增到集合的元素,決定了建立集合時所使用的編碼 如果乙個集合使用 redis encoding...

set集合獲取值 Redis系列 資料型別set

先給大家提出乙個新的儲存需求 儲存大量的資料,在查詢方面提供更高的效率 來請出我們今天要說的主角set。可能大家會有個疑問,難道list不能滿足嗎?list也可以存大量資料而且還有順序,還能使用索引訪問,但是list 的儲存結構是鍊錶的儲存結構。而鍊錶的儲存效率是很低的,當你存大量資料,但是讀取的效...

資料型別之集合

在python中集合分兩種 集合的特點 線性結構的查詢時間複雜度是o n 即隨著資料規模的增大而耗時增加。set和dict通過hash table實現,時間複雜度是o 1 查詢時間與資料規模無關。建立乙個set。注意 建立乙個空集合必須使用set 而不是 用來建立乙個空字典 s1 set abcde...