Redis 的外部鍵排序

前言

在使用 Redis 進行資料管理時,排序是一個很常見的操作。
Redis 的 SORT 命令可以用來對列表(list)、集合(set)或有序集合(sorted set)中的元素進行排序。
但是有時候,你的資料需要依賴其他的值來排序,這種情況下,我們就需要使用外部鍵來幫助完成排序。

使用 SORT 和 GET 來排序

要使用外部鍵來排序,可以使用 SORT 命令中的 BYGET 子句。先來看一個簡單的範例:

假設有一個產品 ID 的列表,儲存在 Redis 中的鍵product_ids下,
每個產品的銷售數量儲存在product:<id>:sales的鍵中。
現在則想要根據產品的銷售數量對這些產品進行排序。

首先,資料結構可能長這樣:

1
2
3
4
5
product_ids = [1, 2, 3]

product:1:sales = 150
product:2:sales = 300
product:3:sales = 100

現在要根據銷售數量對product_ids進行排序,可以使用以下命令:

1
SORT product_ids BY product:*:sales

在這裡,BY product:*:sales 表示 Redis 會將 * 替換為 product_ids 列表中的每個產品 ID,從而根據對應的銷售數量進行排序。

排序結果如下:

1
[3, 1, 2]

這表示 Redis 已經根據銷售數量從小到大對產品 ID 進行排序,結果為產品 ID 3(銷售數量 100)、產品 ID 1(銷售數量 150)、產品 ID 2(銷售數量 300)。

使用 GET 子句來返回指定資料

有時不僅想要返回排序後的產品 ID,還想拿到更多的訊息,比如產品的銷售數量。我們可以使用GET子句來做到這一點。

例如:

1
SORT product_ids BY product:*:sales GET product:*:sales

這個命令會返回排序後的產品銷售數量,結果如下:

1
[100, 150, 300]

並且你也可以多次使用 GET 來取得不同的屬性:

如果還有紀錄product:*:name

1
SORT product_ids BY product:*:sales GET product:*:sales GET product:*:name

這樣就可以同時返回產品的銷售數量和名稱

範例總結

  1. 我們有一個儲存產品 ID 的列表。
  2. 每個產品的銷售數量儲存在對應的 Redis 鍵中。
  3. 我們使用 SORT 命令的 BY 子句來根據外部鍵進行排序,並使用 GET 子句來取得其他所需的屬性信息。

這種方式可以有效解決當資料分散在多個鍵中時的排序問題。

參考

https://redis.io/docs/latest/commands/sort/