1 keys命令
可以使用正則查找匹配的結果。時間復雜度是O(N),N為redis中所有key的總數量。
該命令有致命的缺點:
a. 沒有limit,只能一次性獲取所有符合條件的key。如果數據量很大的話,就會產生無窮無盡的輸出。
b. keys命令是遍歷算法,遍歷全部的key,時間復雜度是O(N)。redis是單線程的,如果keys查詢的時間過長,redis的其它操作會被阻塞較長時間,造成redis較長時間的卡頓。要避免在生產環境使用該命令。
命令格式:keys pattern
2 scan命令
命令格式:scan cursor match pattern count num
redis2.8版本之后,可以使用scan命令進行正則匹配查找。與keys不同的是,scan命令不是一次性查找出所有滿足條件的key。而是根據游標和遍歷的字典槽數,使得每次查詢都限制在一定范圍內。
cursor = 0時表示開始查詢,第一次查詢。每次查詢結果中都會返回一個cursor,作為下次查詢的開始游標。當某次查詢返回的cursor=0時,表示已全部查詢完畢。
舉例:scan 命令查找模式匹配 user_info:*的key,每次查詢返回的1)是下次查詢開始的游標,2)是本次查詢匹配的結果。可以看出,第3次查詢返回的游標為0,表示全部查詢完畢。
count值設置為多少合適呢?
其實設置多少都可以,scan就是迭代查詢,多次迭代總可以遍歷完。但是如果設置的太大,超過總的key的數量,就相當於一次全部查詢出來啦,同keys沒啥區別啦。
localhost:6379> scan 0 match user_info:* count 10000 1) "6630" 2) 1) "user_info:web:82" 2) "user_info:web:2020" 3) "user_info:2014" 4) "user_info:web:1747" 5) "user_info:3703" 6) "user_info:1777" 7) "user_info:142" localhost:6379> scan 6630 match user_info:* count 10000 1) "651" 2) 1) "user_info:1922" 2) "user_info:web:1922" 3) "user_info:web:1777" 4) "user_info:web:142" 5) "user_info:web:1921" 6) "user_info:web:2024" 7) "user_info:web:1676" 8) "user_info:2020" 9) "user_info:web:2023" 10) "user_info:1774" localhost:6379> scan 651 match user_info:* count 10000 1) "0" 2) 1) "user_info:web:2037" 2) "user_info:web:344"
