Redis正確使用的十個技巧

2021-07-30 23:58:38 字數 4160 閱讀 1876

redis 在當前的技術社群裡是非常熱門的。從來自 

antirez 

乙個小小的個人專案到成為記憶體資料儲存行業的標準,

redis

已經走過了很長的一段路。本文和大家分享的是使用redis 資料庫

1、停止使用 

keys *

okay,以挑戰這個命令開始這篇文章,或許並不是乙個好的方式,但其確實可能是最重要的一點。很多時候當我們關注乙個

redis

例項的統計資料, 我們會快速地輸入

」keys *」

命令,這樣

key的資訊會很明顯地展示出來。平心而論,從程式化的角度出發往往傾向於寫出下面這樣的偽**:

for key in 'keys *':

doallthethings()

但是當你有1300萬個

key時,執行速度將會變慢。因為

keys

命令的時間複雜度是

o(n)

,其中n

是要返回的

keys

的個數,這樣這個命令的複雜度就取決於資料庫的大小了。並且在這個操作執行期間,其它任何命令在你的例項中都無法執行。

作為乙個替代命令,看一下 scan 吧,其允許你以一種更友好的方式來執行

… scan 

通過增量迭代的方式來掃瞄資料庫。這一操作基於游標的迭代器來完成的,因此只要你覺得合適,你可以隨時停止或繼續。

2、找出拖慢 

redis 

的罪魁禍首

由於 redis 沒有非常詳細的日誌,要想知道在 

redis 

例項內部都做了些什麼是非常困難的。幸運的是 

redis 

提供了乙個下面這樣的命令統計工具:

127.0.0.1:6379> info commandstats # commandstats cmdstat_get:calls=78,usec=608,usec_per_call=7.79 cmdstat_setex:calls=5,usec=71,usec_per_call=14.20 cmdstat_keys:calls=2,usec=42,usec_per_call=21.00 cmdstat_info:calls=10,usec=1931,usec_per_call=193.10

通過這個工具可以檢視所有命令統計的快照,比如命令執行了多少次,執行命令所耗費的毫秒數(每個命令的總時間和平均時間

) 只需要簡單地執行 config resetstat 命令就可以重置,這樣你就可以得到乙個全新的統計結果。

3、將 

redis-benchmark 

結果作為參考,而不要一概而論

redis 之父 

salvatore 

就說過:

「通過執行

get/set

命令來測試

redis

就像在雨天檢測法拉利的雨刷清潔鏡子的效果

」。很多時候人們跑到我這裡,他們想知道為什麼自己的 

redis-benchmark

統計的結果低於最優結果 。但我們必須要把各種不同的真實情況考慮進來,例如:

· 可能受到哪些客戶端執行環境的限制?

· 是同乙個版本號嗎?

· 測試環境中的表現與應用將要執行的環境是否一致?

redis-benchmark的測試結果提供了乙個保證你的 

redis-server 

不會執行在非正常狀態下的基準點,但是你永遠不要把它作為乙個真實的

「壓力測試

」。壓力測試需要反應出應用的執行方式,並且需要乙個盡可能的和生產相似的環境。 4、

hashes 

是你的最佳選擇

以一種優雅的方式引入 hashes 吧。

hashes 

將會帶給你一種前所未有的體驗。之前我曾看到過許多類似於下面這樣的

key結構:

foo:first_name foo:last_name foo:address

上面的例子中,foo 可能是乙個使用者的使用者名稱,其中的每一項都是乙個單獨的 

key。這就增加了 犯錯的空間,和一些不必要的 

key。使用 

hash 

代替吧,你會驚奇地發現竟然只需要乙個 

key 

: 127.0.0.1:6379> hset foo first_name "joe"

(integer) 1 127.0.0.1:6379> hset foo last_name "engel"

(integer) 1 127.0.0.1:6379> hset foo address "1 fanatical pl"

(integer) 1 127.0.0.1:6379> hgetall foo 1) "first_name" 2) "joe" 3) "last_name" 4) "engel" 5) "address" 6) "1 fanatical pl" 127.0.0.1:6379> hget foo first_name "joe"

5、設定 

key 

值的存活時間

無論什麼時候,只要有可能就利用key超時的優勢。乙個很好的例子就是儲存一些諸如臨時認證

key之類的東西。當你去查詢乙個授權

key時

——以 

oauth

為例——

通常會得到乙個超時時間。這樣在設定

key的時候,設成同樣的超時時間,

redis

就會自動為你清除!而不再需要使用

keys *

來遍歷所有的

key了,怎麼樣很方便吧?

6、選擇合適的**策略

既然談到了清除key這個話題,那我們就來聊聊**策略。當 

redis 

的例項空間被填滿了之後,將會嘗試**一部分

key。根據你的使用方式,我強烈建議使用 

volatile-lru 

策略——

前提是你對

key已經設定了超時。但如果你執行的是一些類似於 

cache 

的東西,並且沒有對 

key 

設定超時機制,可以考慮使用 

allkeys-lru 

**機制。我的建議是先在這裡檢視一下可行的方案。

7、如果你的資料很重要,請使用 

try/except

如果必須確保關鍵性的資料可以被放入到 redis 的例項中,我強烈建議將其放入 

try/except 

塊中。幾乎所有的

redis

客戶端採用的都是

「傳送即忘

」策略,因此經常需要考慮乙個 

key 

是否真正被放到 

redis 

資料庫中了。至於將 

try/expect 

放到redis 

命令中的複雜性並不是本文要講的,你只需要知道這樣做可以確保重要的資料放到該放的地方就可以了。

8、不要耗盡乙個例項

無論什麼時候,只要有可能就分散多redis例項的工作量。從

3.0.0

版本開始,

redis

就支援集群了。

redis

集群允許你基於

key範圍分離出部分包含主

/從模式的

key。完整的集群背後的「魔法

」可以在這裡找到。但如果你是在找教程,那這裡是乙個再適合不過的地方了。如果不能選擇集群,考慮一下命名空間吧,然後將你的

key分散到多個例項之中。關於怎樣分配資料,在

redis.io

9、核心越多越好嗎?

當然是錯的。redis 是乙個單執行緒程序,即使啟用了持久化最多也只會消耗兩個核心。除非你計畫在一台主機上執行多個例項

——希望只會是在開發測試的環境下!

——否則的話對於乙個 

redis 

例項是不需要

2個以上核心的。

10、高可用

到目前為止 redis sentinel 已經經過了很全面的測試,很多使用者已經將其應用到了生產環境中(包括 

objectrocket 

)。如果你的應用重度依賴於 

redis 

,那就需要想出乙個高可用方案來保證其不會掉線。當然,如果不想自己管理這些東西,

objectrocket 

提供了乙個高可用平台,並提供

7×24

小時的技術支援,有意向的話可以考慮一下。

十個正確使用 Redis 的技巧

redis 在當前的技術社群裡是非常熱門的。從來自 antirez 乙個小小的個人專案到成為記憶體資料儲存行業的標準,redis已經走過了很長的一段路。隨之而來的一系列最佳實踐,使得大多數人可以正確地使用 redis。下面我們將探索正確使用 redis 的10個技巧。okay,以挑戰這個命令開始這篇...

Redis正確使用的十個技巧

redis 在當前的技術社群裡是非常熱門的。從來自 antirez 乙個小小的個人專案到成為記憶體資料儲存行業的標準,redis已經走過了很長的一段路。1 停止使用 keys okay,以挑戰這個命令開始這篇文章,或許並不是乙個好的方式,但其確實可能是最重要的一點。很多時候當我們關注乙個redis例...

使用 Istio 的十個技巧

如果大家正在學習或使用 istio,那麼以下有關 istio 的十個技巧,可能會對大家進一步了解 istio 和 envoy proxy 有所幫助。使用 kubectl sniff 和 wireshark 不知道大家有沒有聽說過 wireshark。sniff 提供了一種抽象概念,讓我們可以偵聽那些...