方法一:keys 指令 - 會導致線程阻塞,不推薦
KEYS pattern #用法 KEYS t?? #查詢如two,ttt這類的key KEYS * #查詢所有key
Redis的單線程的。KEYS命令一次性返回所有匹配的key,keys指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。
所以應該在生產環境禁止用使用keys和類似的命令smembers,這種時間復雜度為O(N),且會阻塞主線程的命令,是非常危險的。
方法二:scan 指令
//指令指定返回條數,所以能用在生產環境下 SCAN cursor [MATCH pattern] [COUNT count]
每次執行都只會返回少量元素,所以可以用於生產環境,而不會出現像 KEYS 或者 SMEMBERS 命令帶來的可能會阻塞服務器的問題。
SCAN命令是一個基於游標的迭代器。這意味着命令每次被調用都需要使用上一次這個調用返回的游標作為該次調用的游標參數,以此來延續之前的迭代過程
當SCAN命令的游標參數(即cursor)被設置為 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值為 0 的游標時, 表示迭代已結束。
scan缺陷
在對鍵進行增量式迭代的過程中, 鍵可能會被修改, 所以增量式迭代命令只能對被返回的元素提供有限的保證 。
scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用keys指令長。
