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...