Redis SORT <key> 命令的實(shí)現(xiàn)

2018-08-02 14:57 更新

SORT 命令的最簡(jiǎn)單執(zhí)行形式為:

SORT <key>

這個(gè)命令可以對(duì)一個(gè)包含數(shù)字值的鍵 key 進(jìn)行排序。

以下示例展示了如何使用 SORT 命令對(duì)一個(gè)包含三個(gè)數(shù)字值的列表鍵進(jìn)行排序:

redis> RPUSH numbers 3 1 2
(integer) 3

redis> SORT numbers
1) "1"
2) "2"
3) "3"

服務(wù)器執(zhí)行 SORT numbers 命令的詳細(xì)步驟如下:

  1. 創(chuàng)建一個(gè)和 numbers 列表長(zhǎng)度相同的數(shù)組, 該數(shù)組的每個(gè)項(xiàng)都是一個(gè) redis.h/redisSortObject 結(jié)構(gòu), 如圖 IMAGE_CREATE_ARRAY 所示。
  2. 遍歷數(shù)組, 將各個(gè)數(shù)組項(xiàng)的 obj 指針?lè)謩e指向 numbers 列表的各個(gè)項(xiàng), 構(gòu)成 obj 指針和列表項(xiàng)之間的一對(duì)一關(guān)系, 如圖 IMAGE_POINT_OBJ 所示。
  3. 遍歷數(shù)組, 將各個(gè) obj 指針?biāo)赶虻牧斜眄?xiàng)轉(zhuǎn)換成一個(gè) double 類(lèi)型的浮點(diǎn)數(shù), 并將這個(gè)浮點(diǎn)數(shù)保存在相應(yīng)數(shù)組項(xiàng)的 u.score 屬性里面, 如圖 IMAGE_SET_SCORE 所示。
  4. 根據(jù)數(shù)組項(xiàng) u.score 屬性的值, 對(duì)數(shù)組進(jìn)行數(shù)字值排序, 排序后的數(shù)組項(xiàng)按 u.score 屬性的值從小到大排列, 如圖 IMAGE_SORTED 所示。
  5. 遍歷數(shù)組, 將各個(gè)數(shù)組項(xiàng)的 obj 指針?biāo)赶虻牧斜眄?xiàng)作為排序結(jié)果返回給客戶(hù)端: 程序首先訪(fǎng)問(wèn)數(shù)組的索引 0 , 返回 u.score 值為1.0 的列表項(xiàng) "1" ; 然后訪(fǎng)問(wèn)數(shù)組的索引 1 , 返回 u.score 值為 2.0 的列表項(xiàng) "2" ; 最后訪(fǎng)問(wèn)數(shù)組的索引 2 , 返回 u.score 值為3.0 的列表項(xiàng) "3" 。

其他 SORT <key> 命令的執(zhí)行步驟也和這里給出的 SORT numbers 命令的執(zhí)行步驟類(lèi)似。

以下是 redisSortObject 結(jié)構(gòu)的完整定義:

typedef struct _redisSortObject {

    // 被排序鍵的值
    robj *obj;

    // 權(quán)重
    union {

        // 排序數(shù)字值時(shí)使用
        double score;

        // 排序帶有 BY 選項(xiàng)的字符串值時(shí)使用
        robj *cmpobj;

    } u;

} redisSortObject;

SORT 命令為每個(gè)被排序的鍵都創(chuàng)建一個(gè)與鍵長(zhǎng)度相同的數(shù)組, 數(shù)組的每個(gè)項(xiàng)都是一個(gè) redisSortObject 結(jié)構(gòu), 根據(jù) SORT 命令使用的選項(xiàng)不同, 程序使用 redisSortObject 結(jié)構(gòu)的方式也不同, 稍后介紹 SORT 命令的各種選項(xiàng)時(shí)我們會(huì)看到這一點(diǎn)。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)