關於redis的keys命令的效能問題

2022-06-17 23:57:09 字數 1677 閱讀 8020

**

keys pattern

查詢所有符合給定模式patternkey

keys *

匹配資料庫中所有key

keys h?llo

匹配hellohallohxllo等。

keys h*llo

匹配hlloheeeeello等。

keys h[ae]llo

匹配hellohallo,但不匹配hillo

特殊符號用\隔開

notice:

keys 的速度非常快,但在乙個大的資料庫中使用它仍然可能造成效能問題,如果你需要從乙個資料集中查詢特定的 key ,你最好還是用 redis 的集合結構(set)來代替。

keys模糊匹配,請大家在實際運用的時候忽略掉。因為keys會引發redis鎖,並且增加redis的cpu占用,情況是很惡劣的

實際應用中有時候會出現需要遍歷redis中的所有鍵值的需求,比如清理沒用的鍵等等。但是keys這個命令效能真的很差,redis官方文件是這麼說的:

由於執行keys命令,redis會鎖定,如果資料龐大的話可能需要幾秒或更長,對於生產伺服器上鎖定幾秒這絕對是災難了

如果有這種需求的話可以自己對鍵值做索引,比如把各種鍵值存到不同的set裡面,分類建立索引,這樣就可以很快的得到資料,但是這樣也存在乙個明顯的缺點,就是浪費寶貴的空間,要知道這可是記憶體空間啊,所以還是要合理考慮,當然也可以想辦法,比如對於有規律的鍵值,可以儲存他們的始末值等等。

使用redis的時候要注意很多細節,當時的leader說過一句話很受啟發,雖然redis只提供了五種型別,但是用起來不一定就只有五種,比如string型別,你可以儲存任何你自己定義的型別,所以思想不能侷限,靈活的設定資料結構。還有就是雖然redis訪問很快,但是正常生產環境,redis伺服器肯定和web伺服器不是在一起,有時候甚至是在不同的地區,所以網路通訊延遲就很重要了,所以要減少訪問次數,一次訪問完成更多的工作,否則你會發現做同樣的事redis還沒有關係型資料庫快,所以redis存的時候一定要有技巧,盡可能減少訪問次數。

從redis的官方文件上看,2.8版本之後scan命令已經可用,允許使用游標從keyspace中檢索鍵。對比keys命令,雖然scan無法一次性返回所有匹配結果,但是卻規避了阻塞系統這個高風險,從而也讓一些操作可以放在主節點上執行。

需要注意的是,scan 命令是乙個基於游標的迭代器。scan 命令每次被呼叫之後, 都會向使用者返回乙個新的游標,使用者在下次迭代時需要使用這個新游標作為 scan 命令的游標引數, 以此來延續之前的迭代過程。同時,使用scan,使用者還可以使用keyname模式和count選項對命令進行調整。scan相關命令還包括sscan 命令、hscan 命令和 zscan 命令,分別用於集合、雜湊鍵及有續集等。

另一方面,使用redis的時候一定要注意控制key,對於key的命令要制定乙個完善的方案,這樣才能對redis裡面的資料可控,避免出現沒用資料長時間佔據資料庫這種情況,也可以避免上面說的這種查詢鍵值的操作。

關於redis的keys命令的效能問題

keys pattern 查詢所有符合給定模式pattern的key。keys 匹配資料庫中所有key。keys h?llo匹配hello,hallo和hxllo等。keys h llo匹配hllo和heeeeello等。keys h ae llo匹配hello和hallo,但不匹配hillo。特殊...

關於redis的keys命令的效能問題

查詢所有符合給定模式pattern的key。keys 匹配資料庫中所有key。keys h?llo匹配hello,hallo和hxllo等。keys h llo匹配hllo和heeeeello等。keys h ae llo匹配hello和hallo,但不匹配hillo 實際應用中有時候會出現需要遍歷...

關於redis的keys命令的效能問題

keys pattern 查詢所有符合給定模式pattern的key。keys 匹配資料庫中所有key。keys h?llo 匹配hello,hallo和hxllo等。keys h llo 匹配hllo和heeeeello等。keys h ae llo 匹配hello和hallo,但不匹配hillo...