標籤:
隨著redis的發展,越來越多的架構用它取代了memcached作為快取服務器的角色,它有幾個很突出的特點:
1. 除了Hash,還提供了Sorted Set, List等資料結構
2. 可以持久化到磁碟
3. 支援cluster (3.0)
它的效能和memcached不相上下,再加上流行的其他組件(比如隊列)也會用到redis,從架構簡單出發,已經沒有必要混用redis和memcached了。
寫篇短文介紹一下用redis作為快取服務器配置時候需要注意幾個點。
Redis配置
作為快取服務器,如果不加以限制記憶體的話,就很有可能出現將整台伺服器記憶體都耗光的情況,可以在redis的設定檔裡面設定:
如果記憶體到達了指定的上限,還要往redis裡面添加更多的緩衝內容,需要設定清理內容的策略:
1 2 |
maxmemory-policy allkeys-lru
|
清理策略有多種,redis的官方文檔有一篇很詳細的說明: http://redis.io/topics/lru-cache
Redis監控
redis提供了INFO這個命令,能夠隨時監控伺服器的狀態,只用telnet到對應伺服器的連接埠,執行命令即可:
1 2 |
telnet localhost 6379
info
|
在輸出的資訊裡面有這幾項和緩衝的狀態比較有關係:
1 2 3 4 5 |
keyspace_hits:14414110
keyspace_misses:3228654
used_memory:433264648
expired_keys:1333536
evicted_keys:1547380
|
通過計算hits和miss,我們可以得到緩衝的命中率:14414110 / (14414110 + 3228654) = 81% ,一個緩衝失效機制,和到期時間設計良好的系統,命中率可以做到95%以上,對於整體效能提升是很大的。
used_memory,expired_keys,evicted_keys這3個資訊的具體含義,redis的官方也有一篇很詳細的說明: http://redis.io/commands/info
有個ruby gem叫redis-stat,它利用INFO命令展現出更直觀的資訊報表,推薦:
https://github.com/junegunn/redis-stat
最佳化Rails的緩衝配置
Rails在用redis作為緩衝的時候,配置很簡單,官方文檔是用schema的方式來寫的:
1 |
config.cache_store = :redis_store, "redis://localhost:6379/0/cache"
|
由於實在太簡單了,很多人就直接用這個預設設定了,但實際上還有一些很有用的參數可以通過hash options的方式來寫,比如壓縮超過32K的資料壓縮以後再放入緩衝,再比如設定預設所有的key失效時間為8小時:
1 |
config.cache_store = :redis_store, {:host => ‘redis.server‘, :port => 6379, :compress => true, :expires_in => 8.hours, :compress_threshold => 32.kilobytes}
|
用一個實際案例來作為例子,一台redis快取服務器在最佳化配置之前,佔用4.2G左右的記憶體,快取命中率在70%左右。
我們先在伺服器上執行BGSAVE命令,將記憶體dump下來,然後用 https://github.com/sripathikrishnan/redis-rdb-tools 這個工具,將dump的資料,解析成csv檔案:
1 |
rdb -c memory /var/redis/6379/dump.rdb > memory.csv
|
用excel開啟分析,按key進行排序和統計,我們可以看到哪一些類型的緩衝在伺服器上最多,調整這個類型緩衝的失效時間和失效機制,再通過redis-stat來觀察進行微調,提高整體的命中率。
通過分析佔用記憶體比較大的key,發現有30%左右的相同類型key,用了95%的記憶體,這些緩衝大部分是html的片段快取,通過設定compress_threshold和compress參數,讓整體記憶體佔用從4.2G,下降到了1.3G。
來自:https://ruby-china.org/topics/22761
Redis 作為快取服務器的配置