Redis性能優(yōu)化準則!必須遵守的十條軍規(guī)
前言
Redis 作為現(xiàn)在最流行的內(nèi)存數(shù)據(jù)庫,已經(jīng)成為緩存界的扛把子。在使用過程中我們必然希望能夠充分發(fā)揮 Redis的 強大性能,為此本文總結(jié)了正確使用 Redis 的十條準則。
正文
1. 避免慢查詢命令
顧名思義,慢查詢命令就是執(zhí)行起來比較慢的命令。Redis 本身為我們提供了很多命令,但是在使用過程中,會導致不同的處理速度,稍有不慎就會造成性能變慢。
舉個簡單例子,我們有一個 set ,如果我們想要得到它其中的所有成員時。不要使用 SMEMBERS 命令,而是去用 SSCAN。因為后者是通過多次迭代將數(shù)據(jù)返回,防止一次性拉取大量數(shù)據(jù)帶來的阻塞。
2. 一定不要使用 Keys 命令
生產(chǎn)環(huán)境下,數(shù)據(jù)量一般都比較大。一旦使用 Keys 命令,會遍歷已經(jīng)存儲的所有Key,延時非常高,很容易拖垮 Redis。
3. 對 Key 要設置過期時間
Redis 作為一個存儲介質(zhì),內(nèi)存資源還是相當寶貴的。因此我們需要根據(jù)業(yè)務需求,對應地將 Key 設置過期時間,讓空間能夠定期的得到釋放。
4. 不要給大量的 Key 設置相同的過期時間
如果大量的 Key 在相同的時間過期,會造成緩存雪崩問題。在這個時間節(jié)點,緩存失效,直接到達數(shù)據(jù)庫,對數(shù)據(jù)庫造成巨大的壓力。最簡單的解決辦法就是在給每個 Key 設置過期時間的時候,加上一個隨機值。
5. 選擇與業(yè)務相對應的數(shù)據(jù)結(jié)構(gòu)
Redis 為我們提供了五種基本數(shù)據(jù)結(jié)構(gòu):String、Hash、List、Set、Zset。還有幾種擴展的類型:HyperLogLog、BitMap等。如果想實現(xiàn)一個排行榜的功能,首推肯定是選擇Zset,因為它自帶了排行的能力,省去了我們自己實現(xiàn)的過程。
6. 選擇適用的持久化策略
Redis 有兩種最常見的持久化策略 ,簡單介紹下:
AOF 日志 :以追加的方式,把所有指令記錄到日志中。
RDB 快照:以快照 SNAPSHOT 的方式,把某一時刻的內(nèi)存數(shù)據(jù)完整的記錄下來。
不同的持久化策略對性能的要求不同,所以在使用中需要選取適應的策略。
7. 采用高速固態(tài)硬盤
有條件的情況下,盡可能使用高速固態(tài)硬盤。Redis 作為緩存,一般處理的數(shù)據(jù)量非常大,對磁盤和性能壓力也非常大。
8. 使用 Redis 集群
”三個臭皮匠頂過諸葛亮“,一臺機器的內(nèi)存空間和處理能力終究是有限的。面對大規(guī)模高并發(fā)的場景,采用 Redis 集群顯得尤為重要。
9. 優(yōu)化客戶端
在客戶端與 Redis 的連接上,盡可能使用 Redis 連接池。本質(zhì)上和線程池、數(shù)據(jù)庫連接池都是一樣的道理。就是為了減少頻繁創(chuàng)建和銷毀連接,能夠讓資源更好地進行復用,減少不必要的網(wǎng)絡傳輸。
10. 選擇合適的分布式架構(gòu)
Redis 提供了幾種分布式架構(gòu):
a. 主從同步
b. 哨兵模式
c. Redis Cluster 集群模式
首推 Cluster 集群模式,它能夠?qū)崿F(xiàn)讀寫壓力自動分流和自動容災。但是配置和問題處理對經(jīng)驗能力要求比較高。所以可以根據(jù)自己業(yè)務系統(tǒng)的情況,去有針對性地選擇。如果項目不大,其實也沒有必要直接就采用 Cluster 集群模式。
總結(jié)希望通過本文能夠幫助大家對 Redis 有更好地使用,所有的技術(shù)都是為了業(yè)務服務,選取最合適的才是最好的。
本文轉(zhuǎn)載自微信公眾號「Craig無忌」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Craig無忌公眾號。