SCAN命令是一個基于游標(biāo)的迭代器。這意味著命令每次被調(diào)用都需要使用上一次這個調(diào)用返回的游標(biāo)作為該次調(diào)用的游標(biāo)參數(shù)豌鸡,以此來延續(xù)之前的迭代過程
當(dāng)SCAN命令的游標(biāo)參數(shù)被設(shè)置為 0 時虽抄, 服務(wù)器將開始一次新的迭代虐秦, 而當(dāng)服務(wù)器向用戶返回值為 0 的游標(biāo)時异吻, 表示迭代已結(jié)束唱凯。
也就是說scan 0 是一次全新的查詢桨仿,直到返回的游標(biāo)值是0時睛低,才表示整個庫的查詢結(jié)束。
比如:
redis 127.0.0.1:6379> scan 0
1) "17"
2) 1) "key:12"
2) "key:8"
3) "key:4"
4) "key:14"
5) "key:16"
6) "key:17"
7) "key:15"
8) "key:10"
9) "key:3"
10) "key:7"
11) "key:1"
redis 127.0.0.1:6379> scan 17
1) "0"
2) 1) "key:5"
2) "key:18"
3) "key:0"
4) "key:2"
5) "key:19"
6) "key:13"
7) "key:6"
8) "key:9"
9) "key:11"
在上面這個例子中服傍, 第一次迭代使用 0 作為游標(biāo)钱雷, 表示開始一次新的迭代。
第二次迭代使用的是第一次迭代時返回的游標(biāo)吹零, 也即是命令回復(fù)第一個元素的值 —— 17 罩抗。
從上面的示例可以看到, SCAN 命令的回復(fù)是一個包含兩個元素的數(shù)組灿椅, 第一個數(shù)組元素是用于進行下一次迭代的新游標(biāo)套蒂, 而第二個數(shù)組元素則是一個數(shù)組, 這個數(shù)組中包含了所有被迭代的元素茫蛹。
在第二次調(diào)用 SCAN 命令時操刀, 命令返回了游標(biāo) 0 , 這表示迭代已經(jīng)結(jié)束婴洼, 整個數(shù)據(jù)集(collection)已經(jīng)被完整遍歷過了骨坑。
以 0 作為游標(biāo)開始一次新的迭代, 一直調(diào)用 SCAN 命令柬采, 直到命令返回游標(biāo) 0 欢唾, 我們稱這個過程為一次完整遍歷(full iteration)。
所以可以通過這個方法來查詢庫大的整個庫的key粉捻,如果庫小的話直接keys *搞定
可以使用下面的腳本來得到結(jié)果
#!/bin/bash
redis-cli -h 127.0.0.1 -p 6379 scan 0 > keys.txt
a=`head -1 keys.txt`
while [ $a -ne 0 ]
do
redis-cli -h 127.0.0.1 -p 6379 scan $a > key.txt
redis-cli -h 127.0.0.1 -p 6379 scan $a >> keys.txt
a=`head -1 key.txt`
sleep 1
done
如果指定庫的話改為 redis-cli -h 127.0.0.1 -p 6379 -n 1 scan 0 > keys.txt