1. 程式人生 > 資料庫 >redis 用scan指令 代替keys指令(詳解)

redis 用scan指令 代替keys指令(詳解)

眾所周知,當redis中key數量越大,keys 命令執行越慢,而且最重要的會阻塞伺服器,對單執行緒的redis來說,簡直是災難,終於找到了替代命令scan。

SCAN cursor [MATCH pattern] [COUNT count]

SCAN 命令及其相關的 SSCAN 命令、 HSCAN 命令和 ZSCAN 命令都用於增量地迭代(incrementally iterate)一集元素(a collection of elements):

SCAN 命令用於迭代當前資料庫中的資料庫鍵。

SSCAN 命令用於迭代集合鍵中的元素。

HSCAN 命令用於迭代雜湊鍵中的鍵值對。

ZSCAN 命令用於迭代有序集合中的元素(包括元素成員和元素分值)。

以上列出的四個命令都支援增量式迭代, 它們每次執行都只會返回少量元素, 所以這些命令可以用於生產環境, 而不會出現像 KEYS命令、 SMEMBERS 命令帶來的問題 —— 當 KEYS 命令被用於處理一個大的資料庫時, 又或者 SMEMBERS 命令被用於處理一個大的集合鍵時, 它們可能會阻塞伺服器達數秒之久。

不過, 增量式迭代命令也不是沒有缺點的: 舉個例子, 使用 SMEMBERS 命令可以返回集合鍵當前包含的所有元素, 但是對於 SCAN 這類增量式迭代命令來說, 因為在對鍵進行增量式迭代的過程中, 鍵可能會被修改, 所以增量式迭代命令只能對被返回的元素提供有限的保證 (offer limited guarantees about the returned elements)。

因為 SCAN 、 SSCAN 、 HSCAN 和 ZSCAN 四個命令的工作方式都非常相似, 所以這個文件會一併介紹這四個命令, 但是要記住:

SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一個引數總是一個數據庫鍵。

而 SCAN 命令則不需要在第一個引數提供任何資料庫鍵 —— 因為它迭代的是當前資料庫中的所有資料庫鍵。

scan 0 預設返回10條資料。

127.0.0.1:6379> scan 0

1) "81920"
2) 1) "CMD:1000004739:4"
2) "CMD:1000010475:2"
3) "CMD:380071400001208:766"
4) "CMD:1000006866:LIST"

5) "CMD:380071400001208:20415"
6) "CMD:380071400001231:21530"
7) "CMD:380071400001208:21780"
8) "CMD:7485630165:LIST"
9) "CMD:1000001545:2"
10) "CMD:380071400001231:4387"

可以用count 引數指定返回資料量:

127.0.0.1:6379> scan 0 count 100

1) "104448"
2) 1) "CMD:1000004739:4"
2) "CMD:1000010475:2"
3) "CMD:380071400001208:766"
4) "CMD:1000006866:LIST"
5) "CMD:380071400001208:20415"
6) "CMD:380071400001231:21530"
7) "CMD:380071400001208:21780"
8) "CMD:7485630165:LIST"
9) "CMD:1000001545:2"
10) "CMD:380071400001231:4387"
......
94) "CMD:201610200062:6"
95) "CMD:VF3748211006:3"
96) "CMD:1000009121:4"
97) "CMD:380071400001231:6563"
98) "CMD:1000010252:ID"
99) "CMD:1000005261:5"
100) "SERVER:45568_0"

使用match 引數來匹配模式:

127.0.0.1:6379> scan 0 match CMD* count 100

1) "104448"
2) 1) "CMD:1000004739:4"
2) "CMD:1000010475:2"
3) "CMD:380071400001208:766"
4) "CMD:1000006866:LIST"
5) "CMD:380071400001208:20415"
6) "CMD:380071400001231:21530"
7) "CMD:380071400001208:21780"
8) "CMD:7485630165:LIST"
9) "CMD:1000001545:2"
10) "CMD:380071400001231:4387"
......
86) "CMD:201610200062:6"
87) "CMD:VF3748211006:3"
88) "CMD:1000009121:4"
89) "CMD:380071400001231:6563"
90) "CMD:1000010252:ID"
91) "CMD:1000005261:5"

最重要的是scan不會阻塞伺服器,現網環境也可以用,真方便。

以上這篇redis 用scan指令 代替keys指令(詳解)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。