如何訪問redis中海量資料,服務不會受影響?
我們知道使用keys可以找出想要的結果,但是redis有乙個很關鍵的特性:單執行緒。keys演算法是遍歷演算法,複雜度是0(n),資料越多時間越高。keys指令會順序執行,這將導致執行緒阻塞一段時間,直到執行完畢。想象一下如果一次找出幾百萬以上的資料,執行keys命令會帶來什麼後果?卡頓,假死。如果是重要的核心業務恐怕要造成不小的損失。那麼我們如何去遍歷大資料量呢?
redis在2.8版本以後提供了scan這個命令。scan 命令格式scan有什麼特點:
scan cursor [match pattern] [count count]
scan 游標 match 《返回和給定模式相匹配的元素》 count 每次迭代所返回的元素數量。
scan 命令是增量的迴圈,每次條用只會反回一小部分的元素。所有不會讓redis假死。
scan 命令返回的是乙個游標,從0開始遍歷,到0結束遍歷。
舉例
127.0.0.1:6379> scan 0 match mtsu* count 10
1) "244"
2) 1) "mtsubmitid:128464154332"
2) "mtsubmitid:128463915872"
3) "mtsubmitid:128464745924"
4) "mtsubmitid:128463892716"
5) "mtsubmitid:128464775064"
6) "mtsubmitid:128463758432"
7) "mtsubmitid:128464611971"
從0開始遍歷,返回了游標244,又返回了資料,繼續scan遍歷,就要從244開始
127.0.0.1:6379> scan 244 match mtsu* count 10
1) "390"
2) 1) "mtsubmitid:128464736797"
2) "mtsubmitid:128464571625"
3) "mtsubmitid:128464559272"
4) "mtsubmitid:128464163953"
5) "mtsubmitid:128463748985"
6) "mtsubmitid:128464777189"
7) "mtsubmitid:128464161014"
如何訪問redis中的海量資料
前言事故產生 分析原因 解決方案 總結有時候我們需要知道線上的redis的使用情況,尤其需要知道一些字首的key值,那我們怎麼去檢視呢?因為我們的使用者token快取是採用了 user token userid 格式的key,儲存使用者的token的值。我們運維為了幫助開發小夥伴們查一下線上現在有多...
面試高頻 如何訪問 Redis 中的海量資料?
有時候我們需要知道線上的redis的使用情況,尤其需要知道一些字首的key值,那我們怎麼去檢視呢?因為我們的使用者token快取是採用了 user token userid 格式的key,儲存使用者的token的值。我們運維為了幫助開發小夥伴們查一下線上現在有多少登入使用者,直接用了keys use...
如何訪問redis中的海量資料?避免事故產生
前言事故產生 分析原因 解決方案 總結 有時候我們需要知道線上的redis的使用情況,尤其需要知道一些字首的key值,讓我們怎麼去檢視呢?今天老顧分享乙個小知識點 因為我們的使用者token快取是採用了 user token userid 格式的key,儲存使用者的token的值。我們運維為了幫助開...