首頁 > 後端開發 > php教程 > 十個正確使用Redis的技巧

十個正確使用Redis的技巧

小云云
發布: 2023-03-17 21:58:01
原創
2427 人瀏覽過

Redis 在目前的科技社群裡是非常熱門的。從來自 Antirez 一個小小的個人專案到成為記憶體資料儲存產業的標準,Redis已經走過了很長的一段路,大多數人可以正確地使用Redis,下面我們將探索正確使用 Redis 的10個技巧。

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最佳化經驗總結

php操作redis的常用方法總結

以上是十個正確使用Redis的技巧的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板