Redis 入門 - 3(集合 set、有序集合 sort set)

Chinkiver發表於2018-02-28

集合,是一組無序且唯一的資料集。
在實際應用中,可以應用於“標籤”、“屬性”,這類需經常擴充套件或組合查詢的場景

基礎命令

增加

// 如果元素已存在,則忽略該命令(該命令具有批量功能)。返回成功加入的元素數量
SADD key_name member [other members]

刪除

// 刪除元素(該命令具有批量功能)。返回刪除成功的個數
SREM key_name member [other members]

獲取全部

// 返回集合下的所有元素
SMEMBERS key_name

判斷是否存在

// 存在返回 1,不存在返回 0
SISMEMBER key_name member

集合運算

去同

// 返回 key_name1 中剔除 key_name2 中相同元素的部分
SDIFF key_name1 key_name2 [其他 keys]

交集

// 返回 key_name1 和 key_name2 的交集
SINTER key_name1 key_name2 [其他 keys]

並集

// 返回 key_name1 和 key_name2 的並集
SUNION key_name1 key_name2 [其他 keys]

其他命令

獲取元素個數

// 返回元素個數
SCARD key_name

集合運算並儲存結果

去同

// 結果儲存在 destination 鍵中,可用於多步集合運算
SDIFFSTORE destination key_name [key_names...]

交集

SINTERSTORE destination key_name [key_names...]

並集

SUNIONSTORE destination key_name [key_names ...]

隨機獲取元素

// 無 count 時,隨機獲取一個元素
// count > 0 時,隨機獲取 count 個不重複的元素,如果 count 大於集合元素數時,返回全部
// count < 0 時,隨機獲取 |count| 個元素(可能重複)
SRANDMEMBER key_name [count]

彈出一個元素

// 隨機選擇一個元素彈出
SPOP key_name

有序集合,同集合一致,但為每個元素關聯了一個分數,使我們能夠獲得分數最高或最低的前 N 個元素,當然也可按範圍獲取元素
但有序集合更加消耗記憶體,讀取任意位置的資料都會很快,更加便捷的排序調整

基礎命令

增加元素

// 返回新加入集合的元素個數
// score 可以為 integer 或 float,也可為 -inf(負無窮)或 +inf(正無窮)
ZADD key_name score member [other scores members]

// 更新,將原 member 的 score 調整為 new_score
ZADD key_name new_score member

刪除一個或多個元素

// 返回成功刪除的元素個數
ZREM key_name memeber [other members]

獲得元素的分數

// 返回分數
ZSCORE kye_name member

獲得排名在某個範圍的元素列表

// 首先按照分數從小到大排序
// (如果元素的分數相同,則對 member 按照字典順序排列 “0”<...“9”<“A”<...“Z”<“a”...<“z”)
// 再根據索引(0 開始)結合 start 和 end 的要求返回元素
// 當加上 WITHSCORE 時,同時返回分數 
ZRANGE key_name start end [WITHSCORE]

// 按照分數從大到小,其他同 ZRANGE
ZREVRANGE key_name start end [WITHSCORE]

獲得指定分數範圍的元素

// 首先會對 key_name 按從小到大排列
// 返回分數在 min 和 max 之間的元素(注意:包含 min 和 max)
ZRANGEBYSCORE key_name min max [WITHSCORE] [LIMIT offset count]

// LIMIT 可在檢索的結果中,偏移(往後數)offset 個位置,取 count 個元素
// 在 students 集合中獲取分數為 70 ~ 100 分之間,並跳過前 2 個,取 3 個元素
ZRANGEBYSCORE students 70 100 WITHSCORE LIMIT 2 3

// 不希望包含 min 或 max 時,使用“(”(同數學中的集合符號,( 不包含,[ 包含)
ZRANGEBYSCORE key_name 80 (100

// 按從大到小排列,其他一致
ZREVRANGEBYSCORE key_name min max [WITHSCORE] [LIMIT offset count]

調整某個元素的分數

// 給元素增加 increment 的分值,返回更改後的分數
// increment 可以為正(加),也可以為負(減)
// 如果指定元素不存在,則先建立,初始化為 0,再調整
ZINCRBY key_name increment member

其他命令

獲取集合中元素的數量

// 返回個數
ZCARD key_name

獲得指定分數範圍內的元素個數

// 同 ZRANGEBYSOCRE 中的 min 和 max 一致
// 包含 min 和 max,不包含的話,可以使用“(”
ZCOUNT key_name min max

按照排名範圍刪除元素

// 先從小到大排列,再根據索引位置,刪除 start 和 end 間的所有元素(注意:包含 start 和 end)
// 返回刪除元素個數
ZREMRANGEBYRANK key_name start end

按照分數範圍刪除元素

// 刪除分數範圍內的所有元素
ZREMRANGEBYSCORE key_name min max

獲取元素的排名

// 從小到大排列,返回索引值(0 開始)
ZRANK key_name member

// 從大到小排列,返回索引值(0 開始)
ZREVRANK key_name member

file

目標

  1. 使用集合型別,為任務管理系統增加標籤功能
  2. 為每條 task 定義一個 task:id:tags(集合)的鍵儲存標籤
  3. 為每個標籤,定義一個 tag:name:count 儲存都有哪些 task 使用了該 tag:name
  4. 可按標籤分類檢索
  5. 使用有序集合型別,實現文章按照日期排序的功能(新增、更新都會觸發日期的更新),task:sort

相關文章