Redis Scan 命令
生活随笔
收集整理的這篇文章主要介紹了
Redis Scan 命令
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1. Scan 命令的基本用法
- 1.1 Scan 命令的輸入值
- 1.2 Scan 命令的返回值
- 2. Scan 命令與 Keys 命令比較
- 2.1 Keys 命令的缺點
- 2.2 Scan 命令的優點
- 3. Scan 命令的限制
- 3.1 有限保證原則
- 3.2 返回的結果有可能會重復
1. Scan 命令的基本用法
Scan 命令是一個基于游標的迭代器:Scan 命令每次被調用之后,都會向用戶返回一個新的游標,用戶在下次迭代時需要使用這個新游標作為 Scan 命令的游標參數,以此來延續之前的迭代過程。
當 Scan 命令的游標參數被設置為 0 時,服務器將開始一次新的迭代,而當服務器向用戶返回值為 0 的 游標時,表示迭代已經結束。1.1 Scan 命令的輸入值
Scan 命令的語法為:
SCAN cursor [MATCH pattern] [COUNT count] (The default COUNT value is 10)舉例:當需要查找以 keyA 開頭的 key 值時,可以使用如下命令進行開始:
SCAN 0 match keyA* count 20注意,上面的 0 代表第一次遍歷,20 是限定服務器單次遍歷的字典槽位數量。
1.2 Scan 命令的返回值
Scan 命令的返回值是一個包含兩個元素的數組,第一個數組元素是用于下一次迭代的新游標,而第二個數組元素則是一個數組,這個數組中包含了所有被迭代的元素。
以 0 作為游標開始一次新的迭代,一直調用 Scan 命令,直到命令返回游標 0,這個過程稱之為一次完整遍歷。2. Scan 命令與 Keys 命令比較
2.1 Keys 命令的缺點
- 沒有限制返回結果的參數。由于 Keys 命令只能一次性獲取所有符合匹配規則的 key,所以沒辦法限制返回的結果數量。
- keys 命令是遍歷來實現的,時間復雜度是 O(N)。
所以結合以上兩個缺點,再加上 Redis 是 單線程 的這個性質,在結果集數量非常大時,會造成 Redis 進程被阻塞,導致 Redis 服務卡頓。
2.2 Scan 命令的優點
- Scan 命令提供了 limit 參數, 可以限制返回的結果數量。
- Scan 命令時間復雜度也為 O(N),但是它是分次進行的,即不會阻塞進程。
所以結合以上兩個優點, Scan 命令不會導致 Redis 服務卡頓。
3. Scan 命令的限制
3.1 有限保證原則
Scan 命令可以保證:
從完整遍歷開始直到完整遍歷結束期間,一直存在于數據集內的所有元素都會被完整遍歷返回,但是同一個元素可能會被返回多次。如果一個元素是在遍歷過程中被添加到數據集或者從數據集中被刪除,那么這個元素可能被返回,也可能不被返回。3.2 返回的結果有可能會重復
Scan 命令每次返回的結果有可能會重復,所以要在應用層進行去重處理。
總結
以上是生活随笔為你收集整理的Redis Scan 命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中循环结构分有,python
- 下一篇: php 如何实现无状态化,服务无状态化设