Redis Sorted Set型別介紹

2021-07-31 15:09:50 字數 4135 閱讀 6847

sorted set是redis的一種資料型別,與set型別和hash型別的混合相似。同set型別一樣,sorted set中的元素都是惟一的,不能重複的字作串元素。所以在某些場景下,sorted set型別同set型別一樣。

但是set型別物件中元素是無序的,而sorted set型別物件中的每個元素都與乙個叫做score的浮點值相關聯(這也是為什麼說它與hash型別相似,因為它的每個元素同樣都對映乙個值)。

此外,sorted set中的元素是按次序被取出的(所以他們不是基於請求被排序的,有序性是sorted set資料結構的乙個特徵)。sorted set中的元素按照如下規則排序:

讓我們以乙個簡單的例子開始,新增一些黑客的名字作為sorted set的元素,用他們的出生的年作為score值:

>zadd hackers 1940 "alan kay"

(integer) 1

>zadd hackers 1957 "sophie wilson"

(integer) 1

>zadd hackers 1949 "anita borg"

(integer) 1

>zadd hackers 1965 "yukihiro matsumoto"

(integer) 1

>zadd hackers 1914 "hedy lamarr"

(integer) 1

>zadd hackers 1916 "claude shannon"

(integer) 1

>zadd hackers 1969 "linus torvalds"

(integer) 1

>zadd hackers 1912 "alan turing"

(integer) 1

正如你看到的,zadd命令與sadd命令類似,但是多取了乙個引數(放在要新增元素之前),就是score。zadd命令也支援批量操作,所以即使上面的例子沒用,你也可以自由的指定多個score-value對。

對於此sorted set,要返回乙個按照黑客出生年排序的黑客列表是無意義的,因為實際上,他們已結排過序了。

注:redis sorted set是通過雙端品資料結構實現的,包含乙個skip list 和 乙個hash組成,所以我們在sorted set上新增乙個元素操作的時間複雜度為o(log(n))。這樣雖然很好,但是當我們請求對元素進行排序的時候,redis將什麼都不會做,因為已經排過序了:

>zrange hackers 0 -1

1)"alan turing"

2)"hedy lamarr"

3)"claude shannon"

4)"alan kay"

5)"anita borg"

6)"richard stallman"

7)"sophie wilson"

8)"yukihiro matsumoto"

9)"linus torvalds"

注:0和-1表示從索引為0的元素到最後乙個元素(同lrange命令相似)。

如果想要與現有排序相反,如從年輕到到最老的,可以使用zrevrange命令。

>zrevrange hackers 0 -1

1)"linus torvalds"

2)"yukihiro matsumoto"

3)"sophie wilson"

4)"richard stallman"

5)"anita borg"

6)"alan kay"

7)"claude shannon"

8)"hedy lamarr"

9)"alan turing"

也可以連同score一塊輸出,使用withscores引數:

>zrange hackers 0 -1 withscores

1)"alan turing"

2)"1912"

3)"hedy lamarr"

4)"1914"

5)"claude shannon"

6)"1916"

7)"alan kay"

8)"1940"

9)"anita borg"

10)"1949"

11)"richard stallman"

12)"1953"

13)sophie wilson"

14)"1957"

15)"yukihiro matsumoto"

16)"1965"

17)"linus torvalds"

18)"1969"

zrangebyscore命令可用於範圍查詢操作,如獲取出生的年小於等於1950的個體:

>zrangebyscore hackers -inf 1950

1)"alan turing"

2)"hedy lamarr"

3)"claude shannon"

4)"alan kay"

5)"anita borg"

這個命令或解釋為我們向redis請求返回所有score值在負無窮和1950(兩端邊界都包含)之間的元素。-inf表示負無窮。

zremrangebyscore命令可用於範圍刪除操作,如要刪除出生年在1940和1960之間的黑客:

>zremrangebyscore hackers 1940 1960

(integer) 4

zremrangebyscore也許不是最好命令名稱,但卻非常有用,並且返回被刪除元素的個數。

另外乙個對於sorted set元素極其有用的操作zrank是獲取排名操作,用於獲取元素在sorted set集合中的位置:

>zrank hackers "linus torvalds"

(integer) 4

同樣的,zrevrank命令為獲取元素從相反方向開始的位置。

在redis 2.8中,新增了乙個可以按詞典順序排序的功能。sorted set所有元素的詞典順序比較使用c語言的memcmp函式,沒有做任何調整,可以放心使用,任何redis例項都會給出相同的結果。

用於sorted set詞典相關命令主要有:zrangebylex,zrevrangebylex,zremrangebylex和zlexcount。

>zadd hackers01 0 "alan kay" 0 "sophie wilson" 0 "richard stallman" 0 "anita borg" 0 "yukihiro matsumoto" 0 "hedy lamarr" 0 "claude shannon" 0 "linus torvalds" 0 "alan turing"

(integer) 9

由於sorted set的排序規則,這上面的元素都已經按照詞典順序排序過了:

>zrange hackers 0 -1

1)"alan kay"

2)"alan turing"

3)"anita borg"

4)"claude shannon"

5)"hedy lamarr"

6)"linus torvalds"

7)"richard stallman"

8)"sophie wilson"

9)"yukihiro matsumoto"

我們可以使用zrangebylex命令根據詞典順序獲取一定範圍的值:

>zrangebylex hackers [b [p

1)"claude shannon"

2)"hedy lamarr"

3)"linus torvalds"

關於sorted set集合最後要注意的是:sorted set的scores在任何時候都可能被更改。僅僅需要呼叫zadd新增乙個集合中已存在的元素,redis就會自動做乙個時間複雜度為o(log(n))的更改sorted set的scores和位置的操作。因此,sorted set適用於需要大量更新操作的場景。

注:因為這個特徵,乙個通常使用場景就是排行榜。

類值類與類指標類

類值類 行為像值的 class a a const a a ps new string a.ps i a.i 每個類物件有自己的乙份資源拷貝 a operator const a rhs a private string ps int i 一種優化拷貝賦值運算子的方法 copy and swap c...

巢狀類 匿名類 密封類

巢狀類 在c 中可以將乙個類定義在另乙個類的內部,外部的叫外部類,內部的巢狀類 namespace 27 set public void hello 巢狀類 public class web webname,weburl class program 匿名類 如果某個類的例項物件只會使用到一次,可以使...

點類,圓類,圓柱類

print?copyright c 2012,煙台大學計算機學院 all rights reserved.檔名稱 text.cpp 作 者 胡穎 完成日期 2013年5月20日 版 本 號 v1.0 輸入描述 無 問題描述 1 先建立乙個point 點 類,包含資料成員x,y 座標點 2 以poin...