redis 之如何訪問海量資料。

2021-09-25 03:42:46 字數 1350 閱讀 8397

如何訪問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的值。我們運維為了幫助開...