隨著(zhù)redis的發(fā)展,越來(lái)越多的架構用它取代了memcached作為緩存服務(wù)器的角色,它有幾個(gè)很突出的特點(diǎn):
1. 除了Hash,還提供了Sorted Set, List等數據結構
2. 可以持久化到磁盤(pán)
3. 支持cluster (3.0)
它的性能和memcached不相上下,再加上流行的其他組件(比如隊列)也會(huì )用到redis,從架構簡(jiǎn)單出發(fā),已經(jīng)沒(méi)有必要混用redis和memcached了。
寫(xiě)篇短文介紹一下用redis作為緩存服務(wù)器配置時(shí)候需要注意幾個(gè)點(diǎn)。
作為緩存服務(wù)器,如果不加以限制內存的話(huà),就很有可能出現將整臺服務(wù)器內存都耗光的情況,可以在redis的配置文件里面設置:
# 限定最多使用1.5GB內存maxmemory 1536mb
如果內存到達了指定的上限,還要往redis里面添加更多的緩存內容,需要設置清理內容的策略:
# 設置策略為清理最少使用的key對應的數據maxmemory-policy allkeys-lru
清理策略有多種,redis的官方文檔有一篇很詳細的說(shuō)明: http://redis.io/topics/lru-cache
redis提供了INFO這個(gè)命令,能夠隨時(shí)監控服務(wù)器的狀態(tài),只用telnet到對應服務(wù)器的端口,執行命令即可:
telnet localhost 6379info
在輸出的信息里面有這幾項和緩存的狀態(tài)比較有關(guān)系:
keyspace_hits:14414110keyspace_misses:3228654used_memory:433264648expired_keys:1333536evicted_keys:1547380
通過(guò)計算hits和miss,我們可以得到緩存的命中率:14414110 / (14414110 + 3228654) = 81% ,一個(gè)緩存失效機制,和過(guò)期時(shí)間設計良好的系統,命中率可以做到95%以上,對于整體性能提升是很大的。
used_memory,expired_keys,evicted_keys這3個(gè)信息的具體含義,redis的官方也有一篇很詳細的說(shuō)明: http://redis.io/commands/info
有個(gè)ruby gem叫redis-stat,它利用INFO命令展現出更直觀(guān)的信息報表,推薦:
https://github.com/junegunn/redis-stat
Rails在用redis作為緩存的時(shí)候,配置很簡(jiǎn)單,官方文檔是用schema的方式來(lái)寫(xiě)的:
config.cache_store = :redis_store, "redis://localhost:6379/0/cache"
由于實(shí)在太簡(jiǎn)單了,很多人就直接用這個(gè)默認設置了,但實(shí)際上還有一些很有用的參數可以通過(guò)hash options的方式來(lái)寫(xiě),比如壓縮超過(guò)32K的數據壓縮以后再放入緩存,再比如設置默認所有的key失效時(shí)間為8小時(shí):
config.cache_store = :redis_store, {:host => 'redis.server', :port => 6379, :compress => true, :expires_in => 8.hours, :compress_threshold => 32.kilobytes} 用一個(gè)實(shí)際案例來(lái)作為例子,一臺redis緩存服務(wù)器在優(yōu)化配置之前,占用4.2G左右的內存,緩存命中率在70%左右。
我們先在服務(wù)器上執行BGSAVE命令,將內存dump下來(lái),然后用 https://github.com/sripathikrishnan/redis-rdb-tools 這個(gè)工具,將dump的數據,解析成csv文件:
rdb -c memory /var/redis/6379/dump.rdb > memory.csv
用excel打開(kāi)分析,按key進(jìn)行排序和統計,我們可以看到哪一些類(lèi)型的緩存在服務(wù)器上最多,調整這個(gè)類(lèi)型緩存的失效時(shí)間和失效機制,再通過(guò)redis-stat來(lái)觀(guān)察進(jìn)行微調,提高整體的命中率。
通過(guò)分析占用內存比較大的key,發(fā)現有30%左右的相同類(lèi)型key,用了95%的內存,這些緩存大部分是html的片段緩存,通過(guò)設置compress_threshold和compress參數,讓整體內存占用從4.2G,下降到了1.3G。
來(lái)自:https://ruby-china.org/topics/22761
聯(lián)系客服