Redis迭代查询详解及其使用:Scan命令、Sscan命令、Hscan命令、Zscan命令
一、總結
Scan命令又細分為:scan命令,Sscan命令、Hscan命令、Zscan命令。
- scan命令用于迭代字符串中的元素。
- Sscan命令用于迭代集合鍵中的元素。
- Hscan命令用于迭代哈希鍵中的鍵值對。
- Zscan命令用于迭代有序集合中的元素(包括元素成員和元素分值)。
二、scan的由來
Redis中的Keys命令和Smembers命令類似于數據庫中的全表掃描,其中,Smembers命令返回集合中的所有的成員,與數據庫中的全表掃描無異。由于Redis是單線程,而Keys命令和Smembers命令會造成Redis線程的堵塞,在生產環境需要十分慎重的使用。
為了避免Redis線程的堵塞,出現了查詢迭代命令,也就是Scan命令,其用于迭代當前數據庫中的緩存數據。Scan 命令是一個基于游標的迭代器,每次被調用之后, 都會向用戶返回一個新的游標, 用戶在下次迭代時需要使用這個新游標作為Scan命令的游標參數, 以此來延續之前的迭代過程。
Scan命令返回一個包含兩個元素的數組,
第一個元素:是用于進行下一次迭代的新游標(如果新游標返回 0 表示迭代已結束)?
第二個元素:則是一個數組, 這個數組中包含了所有被迭代的元素。
在同一時間,可以有任意多個客戶端對同一數據集進行迭代,客戶端每次執行迭代都需要傳入一個游標,并在迭代執行之后獲得一個新的游標,而這個游標就包含了迭代的所有狀態,因此,服務器無須為迭代記錄任何狀態。因為迭代的所有狀態都保存在游標里面,而服務器無須為迭代保存任何狀態,所以客戶端可以在中途停止一個迭代,而無須對服務器進行任何通知。即使有任意數量的迭代在中途停止,也不會產生任何問題。
例如:
以下是一個SCAN命令的迭代過程示例:
127.0.0.1:6379> scan 0 MATCH ops-coffee-*
1)"38"
2)?"ops-coffee-25"
? ? "ops-coffee-19"
? ? "ops-coffee-29"
? ? "ops-coffee-10"
? ? "ops-coffee-23"
? ? "ops-coffee-5"
? ? "ops-coffee-14"
? ? "ops-coffee-16"
? ? "ops-coffee-11"
? ? "ops-coffee-15"
? ? "ops-coffee-7"
? ? "ops-coffee-1"
127.0.0.1:6379> scan 38 MATCH ops-coffee-* COUNT 1000
1) "0"
2) "ops-coffee-13"
? ? "ops-coffee-9"
? ? "ops-coffee-21"
? ? "ops-coffee-6"
? ? "ops-coffee-30"
? ? "ops-coffee-20"
? ? "ops-coffee-2"
? ? "ops-coffee-12"
? ? "ops-coffee-28"
? ? "ops-coffee-3"
? ? "ops-coffee-26"
? ? "ops-coffee-4"
? ? "ops-coffee-31"
? ? "ops-coffee-8"
? ? "ops-coffee-22"
? ? "ops-coffee-27"
? ? "ops-coffee-18"
? ? "ops-coffee-24"
? ? "ops-coffee-17"
參考自:https://www.jianshu.com/p/e325015ad5fa
上面這個例子的意思是掃描所有前綴為“ops-coffee-”的key
- 第一次迭代:使用0作為游標,表示開始一次新的迭代,同時使用了MATCH匹配前綴為ops-coffee-的key,返回了游標值38以及遍歷到的數據。
- 第二次迭代:使用的是第一次迭代時返回的游標,也即是命令回復第一個元素的值38,同時通過將COUNT選項的參數設置為1000,強制命令為本次迭代掃描更多元素。
在第二次調用SCAN命令時,命令返回了游標0,這表示迭代已經結束,整個數據集已經被完整遍歷過了。
三、擴展
1. linux shell命令
KEYS命令的時間復雜度為O(n),而SCAN命令會將遍歷操作分解成m次時間復雜度為O(1)的操作來執行,從而解決使用keys命令遍歷大量數據而導致服務器阻塞的情況,使用下邊的指令可以達到優雅刪除的目的:
redis-cli --scan --pattern "ops-coffee-*" | xargs -L 2000 redis-cli del
其中xargs -L指令表示xargs一次讀取的行數,也就是每次刪除的key數量,一次讀取太多xargs會報錯
2.??sscan?
類似的SCAN命令,對于Redis不同的數據類型還有另外幾個SSCAN、HSCAN和ZSCAN,使用方法類似:
sscan ops-coffee 0 MATCH v1*
1) "7"
2) "v15"
? ? "v13"
? ? "v12"
? ? "v10"
? ? "v14"
? ? "v1"
與SCAN命令不同的是這幾個命令需要多加一個key的參數,例如本例中的ops-coffee
轉載自:?
Redis迭代查詢詳解:Scan命令、Sscan命令、Hscan命令、Zscan命令 - MyBatis中文官網
redis scan 優雅的批量刪除 - 簡書
總結
以上是生活随笔為你收集整理的Redis迭代查询详解及其使用:Scan命令、Sscan命令、Hscan命令、Zscan命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《冰河的渗透实战笔记》电子书,442页,
- 下一篇: PHP中文手册1