1. 參數調優
1.1 關閉AOF
只做純內存的緩存,其實只需要RDB就好了,不需要AOF,因爲AOF性能比RDB差些,消耗的磁盤空間也更大,我們只需要RDB做冷備。相對於AOF持久化機制來說,直接基於RDB數據文件來重啓和恢復redis進程,更加快速。使用RDB來進行快速的數據恢復,達到緩存預熱的目的。
1.2 修改RDB配置
redis.conf文件,去配置持久化
save 900 1
save 300 10
save 60 10000
每隔60s,如果有超過10000個key發生了變更,那麼就生成一個新的dump.rdb文件
具體根據生產環境情況進行調整
1.3 overcommit_memory
0: 檢查有沒有足夠內存,沒有的話申請內存失敗
1: 允許使用內存直到用完爲止
2: 內存地址空間不能超過swap + 50%驗證
如果是0的話,可能導致類似fork等操作執行失敗,申請不到足夠的內存空間
cat /proc/sys/vm/overcommit_memory
echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
1.4 swapiness
cat /proc/version,查看linux內核版本
如果linux內核版本<3.5,那麼swapiness設置爲0,這樣系統寧願swap也不會oom killer(殺掉進程)
如果linux內核版本>=3.5,那麼swapiness設置爲1,這樣系統寧願swap也不會oom killer
保證redis不會被殺掉
echo 0 > /proc/sys/vm/swappiness
echo vm.swapiness=0 >> /etc/sysctl.conf
1.5 最大打開文件句柄
ulimit -n 10032 10032
百度一下,不同的操作系統,版本,設置的方式都不太一樣
1.6 緩存清理設置
redis.conf
maxmemory,設置redis用來存放數據的最大的內存大小,一旦超出這個內存大小之後,就會立即使用LRU算法清理掉部分數據
如果用LRU,那麼就是將最近最少使用的數據從緩存中清除出去
對於64 bit的機器,如果maxmemory設置爲0,那麼就默認不限制內存的使用,直到耗盡機器中所有的內存爲止; 但是對於32 bit的機器,有一個隱式的閒置就是3GB
maxmemory-policy,可以設置內存達到最大閒置後,採取什麼策略來處理
(1)noeviction: 如果內存使用達到了maxmemory,client還要繼續寫入數據,那麼就直接報錯給客戶端
(2)allkeys-lru: 就是我們常說的LRU算法,移除掉最近最少使用的那些keys對應的數據
(3)volatile-lru: 也是採取LRU算法,但是僅僅針對那些設置了指定存活時間(TTL)的key纔會清理掉
(4)allkeys-random: 隨機選擇一些key來刪除掉
(5)volatile-random: 隨機選擇一些設置了TTL的key來刪除掉
(6)volatile-ttl: 移除掉部分keys,選擇那些TTL時間比較短的keys
1.7 redis的LRU近似算法
redis採取的是LRU近似算法,也就是對keys進行採樣,然後在採樣結果中進行數據清理
redis 3.0開始,在LRU近似算法中引入了pool機制,表現可以跟真正的LRU算法相當,但是還是有所差距的,不過這樣可以減少內存的消耗
redis LRU算法,是採樣之後再做LRU清理的,跟真正的、傳統、全量的LRU算法是不太一樣的
maxmemory-samples,比如5,可以設置採樣的大小,如果設置爲10,那麼效果會更好,不過也會耗費更多的CPU資源