redis的keys命令與scan命令


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"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM