針對Redis的性能優化,主要從下面幾個層面入手:
最初的也是最重要的,確保沒有讓Redis執行耗時長的命令
使用pipelining將連續執行的命令組合執行,
使用pipelining時,只需要從客戶端一次向Redis發送多條命令(以\r\n)分隔,Redis就會依次執行這些命令,并且把每個命令的返回按順序組裝在一起一次返回,比如:
$ (printf "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379 +PONG +PONG +PONG
操作系統的Transparent huge pages(大內存頁)功能必須關閉,否則可能導致redis延遲和內存使用問題:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
如果在虛擬機中運行Redis,可能天然就有虛擬機環境帶來的固有延遲??梢酝ㄟ^./redis-cli --intrinsic-latency 100命令查看固有延遲。同時如果對Redis的性能有較高要求的話,應盡可能在物理機上直接部署Redis。
檢查數據持久化策略
考慮引入讀寫分離機制
用scan代替keys,因為keys會阻塞redis的單線程
為何要做集群分片:
Redis中存儲的數據量大,一臺主機的物理內存已經無法容納
Redis的寫請求并發量大,一個Redis實例以無法承載
當上述兩個問題出現時,就必須要對Redis進行分片了。
Redis的分片方案有很多種,例如很多Redis的客戶端都自行實現了分片功能,也有向Twemproxy這樣的以代理方式實現的Redis分片方案。然而首選的方案還應該是Redis官方在3.0版本中推出的Redis Cluster分片方案。
本文不會對Redis Cluster的具體安裝和部署細節進行介紹,重點介紹Redis Cluster帶來的好處與弊端。
能夠自動將數據分散在多個節點上
當訪問的key不在當前分片上時,能夠自動將請求轉發至正確的分片
當集群中部分節點失效時仍能提供服務
其中第三點是基于主從復制來實現的,Redis Cluster的每個數據分片都采用了主從復制的結構,原理和前文所述的主從復制完全一致,唯一的區別是省去了Redis Sentinel這一額外的組件,由Redis Cluster負責進行一個分片內部的節點監控和自動failover。
Redis Cluster中共有16384個hash slot,Redis會計算每個key的CRC16,將結果與16384取模,來決定該key存儲在哪一個hash slot中,同時需要指定Redis Cluster中每個數據分片負責的Slot數。Slot的分配在任何時間點都可以進行重新分配。
客戶端在對key進行讀寫操作時,可以連接Cluster中的任意一個分片,如果操作的key不在此分片負責的Slot范圍內,Redis Cluster會自動將請求重定向到正確的分片上。
Redis提供了5種數據淘汰策略:
volatile-lru:使用LRU算法進行數據淘汰(淘汰上次使用時間最早的,且使用次數最少的key),只淘汰設定了有效期的key
allkeys-lru:使用LRU算法進行數據淘汰,所有的key都可以被淘汰
volatile-random:隨機淘汰數據,只淘汰設定了有效期的key
allkeys-random:隨機淘汰數據,所有的key都可以被淘汰
volatile-ttl:淘汰剩余有效期最短的key
最好為Redis指定一種有效的數據淘汰策略以配合maxmemory設置,避免在內存使用滿后發生寫入失敗的情況。
一般來說,推薦使用的策略是volatile-lru,并辨識Redis中保存的數據的重要性。對于那些重要的,絕對不能丟棄的數據(如配置類數據等),應不設置有效期,這樣Redis就永遠不會淘汰這些數據。對于那些相對不是那么重要的,并且能夠熱加載的數據(比如緩存最近登錄的用戶信息,當在Redis中找不到時,程序會去DB中讀?。?,可以設置上有效期,這樣在內存不夠時Redis就會淘汰這部分數據。
配置方法:
maxmemory-policy volatile-lru #默認是noeviction,即不進行數據淘汰
本文參考資料https://www.cnblogs.com/276815076/p/7245333.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。