十個正確使用 Redis 的技巧

來源:互聯網
上載者:User

標籤:

十個正確使用 Redis 的技巧

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 ,那就需要想出一個高可用方案來保證其不會掉線。

免費領取兄弟連IT教育原創雲端運算培訓視頻/細說linux教程,詳情諮詢官網客服:http://www.itxdl.cn/linux/  或者勾搭Q2430675018~

歡迎加入linux交流群 478068715

 

 

十個正確使用 Redis 的技巧

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.