遍歷,簡單來說,就是在資料庫中逐一訪問每一個項目的過程
在許多資料庫中,這通常涉及到查詢和檢索所有的資料,但在 Redis 中,由於它的設計目的是要快速和高效,所以它提供了一個增量的遍歷方法,稱為 SCAN 命令
Redis 提供了不同的 SCAN 命令,以適應其不同的數據結構。以下是四種主要的 SCAN 命令:
SCAN: 遍歷當前數據庫中的鍵。
127.0.0.1:6379> SET key1 "value1"
OK
127.0.0.1:6379> SET key2 "value2"
OK
127.0.0.1:6379> SCAN 0
1) "0"
2) 1) "key2"
2) "key1"
當你使用 `SCAN` 命令進行遍歷時,Redis 會返回一個數組,這個數組包含兩個元素:
1. 新的游標值:此游標值應在下一次的 `SCAN` 調用中使用,以繼續遍歷。當回傳值為 "0" 時,表示遍歷已完成
2. 一個鍵的子集:這是當前遍歷步驟中找到的鍵的列表。由於 `SCAN` 命令被設計為非阻塞,它每次只返回一小部分
在每次使用這些命令時,會返回一個新的 cursor 和一部分的數據。使用返回的 cursor 進行下一次的遍歷,直到 cursor 回傳 0,表示遍歷已完成,若是回傳的不是 0 是其他數字像是 20 的話,可以繼續使用 `SCAN 20` 來繼續遍歷
HSCAN: 遍歷 Hash 中的字段。
127.0.0.1:6379> HSET myhash field1 "value1"
(integer) 1
127.0.0.1:6379> HSET myhash field2 "value2"
(integer) 1
127.0.0.1:6379> HSCAN myhash 0
1) "0"
2) 1) "field1"
2) "value1"
3) "field2"
4) "value2"
SSCAN: 遍歷集合中的元素。
127.0.0.1:6379> SADD myset "value1"
(integer) 1
127.0.0.1:6379> SADD myset "value2"
(integer) 1
127.0.0.1:6379> SSCAN myset 0
1) "0"
2) 1) "value2"
2) "value1"
ZSCAN: 遍歷有序集合中的元素。
127.0.0.1:6379> ZADD myzset 1 "value1"
(integer) 1
127.0.0.1:6379> ZADD myzset 2 "value2"
(integer) 1
127.0.0.1:6379> ZSCAN myzset 0
1) "0"
2) 1) "value1"
2) "1"
3) "value2"
4) "2"
性能和阻塞:
KEYS
命令在查詢時會立即回傳所有匹配的鍵。如果你有數百萬個鍵,這可能會導致 Redis 伺服器被阻塞,直到命令完成。這意味著,當 KEYS
命令正在執行時,其他客戶端的請求可能會被延遲SCAN
是增量的,並且是非阻塞的。它會在每次呼叫時只回傳一小部分鍵,這使得它在生產環境中更加適用,因為它不會影響 Redis 伺服器的性能使用方式:
KEYS
只需要一個簡單的模式,如 KEYS pattern*
,就會回傳所有匹配的鍵SCAN
使用游標的概念,你需要使用回傳的游標值持續呼叫 SCAN
,直到游標返回 0,表示遍歷完成使用場景:
KEYS
命令可能會影響性能,因此它主要建議只在開發環境或偶爾的調試中使用SCAN
命令設計用於生產環境,特別是當你需要遍歷大量的鍵而不希望對 Redis 伺服器造成影響時總之,雖然 KEYS
命令在某些情況下可能更簡單或更直觀,但 SCAN
命令提供了更加靈活和高效的方式來遍歷 Redis 中的鍵,特別是在大型、高負載的環境中