關於 Redis 的 Zset 使用方法

概述

返回存儲在的有序集合中指定範圍的元素。ZRANGE 可以執行不同類型的範圍查詢:按索引(排名)、按分數或按字典順序。從 Redis 6.2.0 開始,此命令可以替換以下命令:ZREVRANGE、ZRANGEBYSCORE、ZREVRANGEBYSCORE、ZRANGEBYLEX 和 ZREVRANGEBYLEX。

常見行爲和選項

元素的順序是從最低分到最高分。具有相同分數的元素按字典順序排列。可選 REV 參數顛倒順序,因此元素從最高分到最低分排序,並且分數關係通過反向詞典排序來解決。可選 LIMIT 參數可用於從匹配元素中獲取子範圍(類似於 SQL 中的 SELECT LIMIT 偏移量、計數)。負數返回 中的所有元素。請記住,如果很大,則在到達要返回的元素之前需要遍歷已排序的集合中的元素,這可能加起來爲 O(N) 時間複雜度。可選 WITHSCORES 參數用返回的元素分數補充命令的回覆。返回的列表包含 value1,score1,...,valueN,scoreN 而不是 value1,...,valueN。客戶端庫可以自由返回更合適的數據類型(建議:帶有(值,分數)數組 / 元組的數組)。

索引範圍

默認情況下,該命令執行索引範圍查詢。的和參數表示基於零的索引,其中 0 是第一要素,1 是下一個元素,依此類推。這些參數指定一個包含範圍,例如,ZRANGE myzset 0 1 將返回排序集合的第一個和第二個元素。

索引也可以是負數,表示從排序集的末尾開始的偏移量,是排序集 - 1 的最後一個元素、-2 倒數第二個元素,依此類推。

超出範圍的索引不會產生錯誤。

如果大於排序集的結束索引 或,則返回一個空列表。

如果大於排序集的結束索引,Redis 將使用排序集的最後一個元素。

分數範圍

當 BYSCORE 提供該選項時,該命令的行爲類似於 ZRANGEBYSCORE 並返回排序集中的元素範圍,其分數等於或介於和之間。

和可以 - inf 和 + inf,分別表示負無窮大和正無窮大。這意味着您不需要知道排序集中的最高或最低分數來獲取從某個分數開始或達到某個分數的所有元素。

默認情況下,由和指定的分數區間是封閉的(包括)。可以通過在分數前加上字符來指定一個開放區間(獨佔)(。

例如:

ZRANGE zset (1 5 BYSCORE
將使用1 < score <= 5while返回所有元素:

ZRANGE zset ((10 BYSCORE
將返回帶有5 < score < 10(5 和 10 除外)的所有元素。

字典範圍

使用該 BYLEX 選項時,該命令的行爲類似於 ZRANGEBYLEX,並返回排序集中的元素範圍和字典序閉區間區間。

請注意,字典順序依賴於具有相同分數的所有元素。當元素具有不同的分數時,回覆是未指定的。

有效且必須以 (或開頭 [,以分別指定範圍間隔是不包含還是包含。

+or- 和的特殊值分別表示正和負無限字符串,因此例如命令 ZRANGEBYLEX myzset - + 保證返回排序集中的所有元素,前提是所有元素具有相同的分數。

字符串的字典序比較

字符串作爲二進制字節數組進行比較。由於 ASCII 字符集的指定方式,這意味着通常這也具有以明顯的字典方式比較普通 ASCII 字符的效果。但是,如果使用非純 ASCII 字符串(例如 utf8 字符串),則情況並非如此。

但是,用戶可以對編碼字符串應用轉換,以便插入到排序集中的元素的第一部分將按照用戶對特定應用程序的要求進行比較。例如,如果我想添加會以不區分大小寫的方式進行比較的字符串,但我在查詢時仍然想檢索真實的大小寫,我可以通過以下方式添加字符串:

ZADD autocomplete 0 foo:Foo 0 bar:BAR 0 zap:zap 由於每個元素中的第一個標準化部分(在冒號字符之前),我們強制進行給定的比較。但是,在使用 查詢範圍後 ZRANGE ... BYLEX,應用程序可以向用戶顯示字符串的第二部分,在冒號之後。

比較的二進制特性允許使用排序集作爲通用索引,例如,元素的第一部分可以是 64 位大端數。由於 big-endian 數字在初始位置具有最高有效字節,因此二進制比較將匹配數字的數字比較。這可用於對 64 位值實施範圍查詢。如下例所示,在前 8 個字節之後,我們可以存儲我們正在索引的元素的值。

返回值 數組回覆:指定範圍內的元素列表(如果 WITHSCORES 給出了選項,則可以選擇帶有它們的分數)。

歷史
>= 6.2:增加了REV,BYSCORE,BYLEX和LIMIT選項。
例子
Redis> ZADD myzset 1“一”
(整數)1
Redis> ZADD myzset 2“二”
(整數)1
Redis> ZADD myzset 3“三”
(整數)1
Redis> ZRANGE myzset 0 -1
1)“一個”
2)“兩個”
3)“三個”
Redis> ZRANGE myzset 2 3
1)“三個”
Redis> ZRANGE myzset -2 -1
1)“兩個”
2)“三個”
Redis> 
以下示例WITHSCORES顯示了該命令如何始終返回一個數組,但這次使用element_1、score_1、element_2、score_2、...、element_N、score_N 填充。

Redis> ZRANGE myzset 0 1 WITHSCORES
1)“一個”
2)“1”
3)“兩個”
4)“2”
Redis> 
  
這個例子展示瞭如何查詢按分數排序的集合,不包括值1,直到無窮大,只返回結果的第二個元素:

Redis> ZRANGE myzset (1 +inf BYSCORE LIMIT 1 1
1)“三個”
Redis>
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/r96wEIbfIqsLdSH_zmgVfw