sorted sets類型及操作
sorted set是set的一個升級版本曹阔,它在set的基礎(chǔ)上增加了一個順序?qū)傩裕@一屬性在添加修改元素的時候可以指定蚁趁,每次指定后疙挺,zset會自動重新按新的值調(diào)整順序〗0埃可以理解為有兩列的mysql表,一列存value爽醋,一列存順序蚁署。操作中key理解為zset的名字。
和set一樣sorted set也是string類型元素的集合蚂四,不同的是每個元素都會關(guān)聯(lián)一個double類型的score光戈。sorted set的實現(xiàn)是skip list和hash table的混合體。
當(dāng)元素被添加到集合中時遂赠,一個元素到score的映射被添加到hash table中久妆,所以給定一個元素獲取score的開銷是O(1),另一個score到元素的映射被添加到skip list,并按照score排序跷睦,所以就可以有序的獲取集合中的元素筷弦。添加,刪除操作開銷都是O(log(N))和skip list的開銷一致,redis的skip list實現(xiàn)用的是雙向鏈表,這樣就可以逆序從尾部取元素抑诸。sorted set最經(jīng)常的使用方式應(yīng)該是作為索引來使用.我們可以把要排序的字段作為score存儲烂琴,對象的id當(dāng)元素存儲。
下面是sorted set相關(guān)命令
zadd
向名稱為key的zset中添加元素member蜕乡,score用于排序奸绷。如果該元素已經(jīng)存在,則根據(jù)score更新該元素的順序
`redis 127.0.0.1:6379> zadd myzset 1 "one"
(integer) 1
redis 127.0.0.1:6379> zadd myzset 2 "two"
(integer) 1
redis 127.0.0.1:6379> zadd myzset 3 "two"
(integer) 0
redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
- "one"
- "1"
- "two"
- "3"
redis 127.0.0.1:6379>`
本例中我們向myzset中添加了one和two层玲,并且two被設(shè)置了2次号醉,那么將以最后一次的設(shè)置為準(zhǔn),最后我們將所有元素都顯示出來并顯示出了元素的score辛块。
zrem
刪除名稱為key的zset中的元素member
`redis 127.0.0.1:6379> zrange myzset 0 -1 withscores
- "one"
- "1"
- "two"
- "3"
redis 127.0.0.1:6379> zrem myzset two
(integer) 1
redis 127.0.0.1:6379> zrange myzset 0 -1 withscores - "one"
- "1"
redis 127.0.0.1:6379>`
可以看到two被刪除了
zincrby
如果在名稱為key的zset中已經(jīng)存在元素member畔派,則該元素的score增加increment;否則向集合中添加該元素润绵,其score的值為increment
`redis 127.0.0.1:6379> zadd myzset2 1 "one"
(integer) 1
redis 127.0.0.1:6379> zadd myzset2 2 "two"
(integer) 1
redis 127.0.0.1:6379> zincrby myzset2 2 "one"
"3"
redis 127.0.0.1:6379> zrange myzset2 0 -1 withscores
- "two"
- "2"
- "one"
- "3"
redis 127.0.0.1:6379>`
本例中將one的score從1增加了2父虑,增加到了3
zrank
返回名稱為key的zset中member元素的排名(按score從小到大排序)即下標(biāo)
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
- "five"
- "5"
redis 127.0.0.1:6379> zrank myzset3 two
(integer) 1
redis 127.0.0.1:6379>`
本例中將two的下標(biāo)是1,我這里取的是下標(biāo)授药,而不是score
zrevrank
返回名稱為key的zset中member元素的排名(按score從大到小排序)即下標(biāo)
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
- "five"
- "5"
redis 127.0.0.1:6379> zrevrank myzset3 two
(integer) 2 redis 127.0.0.1:6379>`
按從大到小排序的話two是第三個元素士嚎,下標(biāo)是2
zrevrange
返回名稱為key的zset(按score從大到小排序)中的index從start到end的所有元素
`redis 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores
- "five"
- "5"
- "three"
- "3"
- "two"
- "2"
- "one"
- "1"
redis 127.0.0.1:6379>`
首先按score從大到小排序呜魄,再取出全部元素
zrangebyscore
返回集合中score在給定區(qū)間的元素
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
- "five"
- "5"
redis 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores - "two"
- "2"
- "three"
- "3"
redis 127.0.0.1:6379>`
本例中,返回了score在2~3區(qū)間的元素
zcount
返回集合中score在給定區(qū)間的數(shù)量
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
- "five"
- "5"
redis 127.0.0.1:6379> zcount myzset3 2 3
(integer) 2
redis 127.0.0.1:6379>`
本例中莱衩,計算了score在2~3之間的元素數(shù)目
zcard
返回集合中元素個數(shù)
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
- "five"
- "5"
redis 127.0.0.1:6379> zcard myzset3
(integer) 4
redis 127.0.0.1:6379>`
從本例看出myzset3這個集全的元素數(shù)量是4
zscore
返回給定元素對應(yīng)的score
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
- "five"
- "5"
redis 127.0.0.1:6379> zscore myzset3 two
"2"
redis 127.0.0.1:6379>`
此例中我們成功的將two的score取出來了爵嗅。
zremrangebyrank
刪除集合中排名在給定區(qū)間的元素
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
- "five"
- "5"
redis 127.0.0.1:6379> zremrangebyrank myzset3 3 3
(integer) 1
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores - "one"
- "1"
- "two"
- "2"
- "three"
- "3" redis 127.0.0.1:6379>`
在本例中我們將myzset3中按從小到大排序結(jié)果的下標(biāo)為3的元素刪除了。
在本例中我們將myzset3中按從小到大排序結(jié)果的下標(biāo)為3的元素刪除了笨蚁。
刪除集合中score在給定區(qū)間的元素
`redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores
- "one"
- "1"
- "two"
- "2"
- "three"
- "3"
redis 127.0.0.1:6379> zremrangebyscore myzset3 1 2
(integer) 2
redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores - "three"
- "3"
redis 127.0.0.1:6379>`
在本例中我們將myzset3中按從小到大排序結(jié)果的score在1~2之間的元素刪除了睹晒。