Redis 有序集合(sorted set)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員。
不同的是每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
集合是通過哈希表實現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。 集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
SortSet的應(yīng)用場景
假設(shè)我們現(xiàn)在要獲取熱門的帖子或搜索,比如我們常用的微博熱搜。
首先,我們需要一個衡量的標(biāo)準(zhǔn),定量的量度熱搜的熱門程度。假設(shè)我們有一個字段叫回復(fù)量,回復(fù)量越高就約熱門。
如果我們用關(guān)系型數(shù)據(jù)庫來獲取的話,用sql語句實現(xiàn)很簡單
select * from message order by backsum limit 10
但是當(dāng)數(shù)據(jù)量很大的時候,效率很低,同時如果建立索引又要消耗大量的資源,同時增加負(fù)載。
使用redis的時候,我們不需要存儲多余的信息,只需要存儲帖子id和回復(fù)量兩個信息就可以了。
SortSet的常用命令
Zadd 命令
Redis Zadd 命令用于將一個或多個成員元素及其分?jǐn)?shù)值加入到有序集當(dāng)中。
如果某個成員已經(jīng)是有序集的成員,那么更新這個成員的分?jǐn)?shù)值,并通過重新插入這個成員元素,來保證該成員在正確的位置上。
分?jǐn)?shù)值可以是整數(shù)值或雙精度浮點數(shù)。
如果有序集合 key 不存在,則創(chuàng)建一個空的有序集并執(zhí)行 ZADD 操作。
當(dāng) key 存在但不是有序集類型時,返回一個錯誤。
注意: 在 Redis 2.4 版本以前, ZADD 每次只能添加一個元素。
語法
redis Zadd 命令基本語法如下:
redis 127.0.0.1:6379> ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
返回值
被成功添加的新成員的數(shù)量,不包括那些被更新的、已經(jīng)存在的成員。
Zrem 命令
Redis Zrem 命令用于移除有序集中的一個或多個成員,不存在的成員將被忽略。
當(dāng) key 存在但不是有序集類型時,返回一個錯誤。
注意: 在 Redis 2.4 版本以前, ZREM 每次只能刪除一個元素。
語法
redis Zrem 命令基本語法如下:
redis 127.0.0.1:6379> ZREM key member [member ...]
返回值
被成功移除的成員的數(shù)量,不包括被忽略的成員。
Zrangebyscore 命令
Redis Zrangebyscore 返回有序集合中指定分?jǐn)?shù)區(qū)間的成員列表。有序集成員按分?jǐn)?shù)值遞增(從小到大)次序排列。
具有相同分?jǐn)?shù)值的成員按字典序來排列(該屬性是有序集提供的,不需要額外的計算)。
默認(rèn)情況下,區(qū)間的取值使用閉區(qū)間 (小于等于或大于等于),你也可以通過給參數(shù)前增加 ( 符號來使用可選的開區(qū)間 (小于或大于)。
舉個例子:
ZRANGEBYSCORE zset (1 5
返回所有符合條件 1 < score <= 5 的成員,而
ZRANGEBYSCORE zset (5 (10
則返回所有符合條件 5 < score < 10 的成員。
語法
redis Zrangebyscore 命令基本語法如下:
redis 127.0.0.1:6379> ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
返回值
指定區(qū)間內(nèi),帶有分?jǐn)?shù)值(可選)的有序集成員的列表。