iT邦幫忙

2023 iThome 鐵人賽

DAY 29
0
自我挑戰組

Hello SQL 初次見面你好系列 第 29

Day 29 Redis 中遍歷(SCAN)

  • 分享至 

  • xImage
  •  

什麼是遍歷 ?

遍歷,簡單來說,就是在資料庫中逐一訪問每一個項目的過程
在許多資料庫中,這通常涉及到查詢和檢索所有的資料,但在 Redis 中,由於它的設計目的是要快速和高效,所以它提供了一個增量的遍歷方法,稱為 SCAN 命令

Redis 提供哪幾種遍歷 ?

Redis 提供了不同的 SCAN 命令,以適應其不同的數據結構。以下是四種主要的 SCAN 命令:

  1. 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` 來繼續遍歷
    
  2. HSCAN: 遍歷 Hash 中的字段。

    • 說明:此命令允許你遍歷 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"
    
  3. SSCAN: 遍歷集合中的元素。

    • 說明:此命令允許你遍歷 Set 中的所有元素
    • 範例
    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"
    
  4. ZSCAN: 遍歷有序集合中的元素。

    • 說明:此命令允許你遍歷 Sorted Set 中的所有元素及其分數。
    • 範例
    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 要用 SCAN ?

  1. 性能和阻塞

    • KEYS 命令在查詢時會立即回傳所有匹配的鍵。如果你有數百萬個鍵,這可能會導致 Redis 伺服器被阻塞,直到命令完成。這意味著,當 KEYS 命令正在執行時,其他客戶端的請求可能會被延遲
    • 相反,SCAN 是增量的,並且是非阻塞的。它會在每次呼叫時只回傳一小部分鍵,這使得它在生產環境中更加適用,因為它不會影響 Redis 伺服器的性能
  2. 使用方式

    • KEYS 只需要一個簡單的模式,如 KEYS pattern*,就會回傳所有匹配的鍵
    • SCAN 使用游標的概念,你需要使用回傳的游標值持續呼叫 SCAN,直到游標返回 0,表示遍歷完成
  3. 使用場景

    • 由於 KEYS 命令可能會影響性能,因此它主要建議只在開發環境或偶爾的調試中使用
    • SCAN 命令設計用於生產環境,特別是當你需要遍歷大量的鍵而不希望對 Redis 伺服器造成影響時

總之,雖然 KEYS 命令在某些情況下可能更簡單或更直觀,但 SCAN 命令提供了更加靈活和高效的方式來遍歷 Redis 中的鍵,特別是在大型、高負載的環境中


上一篇
Day28 Redis 中什麼是臨時鍵-值對
下一篇
Day 30 Redis maxmemory-policy (記憶體淘汰策略)
系列文
Hello SQL 初次見面你好30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言