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