1、外置配置檔案導入(INCLUDES).... 1
2、啟動加載子產品(MODULES).... 2
3、網絡配置(NETWORK).... 3
4、通用配置(GENERAL)... 6
5、主從配置.... 12
6、安全配置.... 15
7、用戶端配置.... 16
9、記憶體相關配置.... 16
10、惰性删除配置(非阻塞删除配置).... 17
11、僅追加模式配置.... 18
12、LUA腳本配置... 21
13、叢集配置.... 21
14、慢請求日志配置.... 23
15、延遲監控配置.... 24
16、事件通知配置.... 24
17、進階配置.... 25
本文主要目的是對Redis 4.0.11配置項進行了解、說明和記錄。
1、外置配置檔案導入(INCLUDES)
include /path/to/common.conf
配置作用:
該配置用于導入外部配置檔案,如當你有一個通用的redis配置檔案時,可使用該配置項導入,可導入多個外置配置檔案。
注意事項:
- redis總是使用最後一個配置項作為其配置,是以如果你想将include中的配置覆寫原配置檔案中配置,則需要将include放在配置檔案最後;若想配置檔案的配置覆寫include中的配置,則include放在配置檔案頭部。(如配置檔案中有appendonly配置,include檔案中也有appendonly配置,若需要include選項覆寫配置檔案中選項,則将include配置放在檔案末尾)
- config rewrite指令可重寫配置檔案中的配置(詳見https://redis.io/commands/config-rewrite),但不會重寫include中的配置。
2、啟動加載子產品(MODULES)
loadmodule /path/to/my_module.so
配置作用:
該選項用于redis-server啟動時指定加載自定義子產品。Redis自定義擴充子產品功能是4.0以後新加入的一個重要功能,該功能允許使用者在redis本身資料結構的基礎上做相關調整或自定義功能增加。
官方提供的相關擴充開發模闆詳見:https://github.com/RedisLabsModules/redex
相關部落格可參考: http://xiaorui.cc/2016/12/08/redis-modules擴充子產品的開發使用/
3、網絡配置(NETWORK)
bind 127.0.0.1
配置作用:
指定redis-server綁定的主機位址。若此選項不設定,則會接受所有網絡接口(網卡)的請求。
Redis配置中預設綁定127.0.0.1,即隻接受本地回環位址的連接配接請求,無法通過遠端連接配接。此選項可以綁定多個ip,多個ip用空格隔開。
如設定bind參數為 bind 168.0.100.1,其中綁定ip為本地區域網路位址,這種方式使用redis-cli指令不允許連接配接,可指定位址連接配接:
redis-cli -h 168.0.100.1
protected-mode yes
配置作用:
redis保護模式是3.2版本之後加入的新特性,它是為了禁止公網通路redis,用于加強redis的安全。如不設定,預設啟用,若啟用該功能,隻能通過回環位址(127.0.0.1)通路redis服務。啟用該選項的兩個前提是:
- 沒有bind ip
- 沒有設定通路密碼
port 6379
配置作用:
設定redis服務監聽的端口,預設為6379,若設定為0,則不監聽任何TCP套接字。
tcp-backlog 511
配置作用:
Backlog是積壓的意思,該配置用于指定最大TCP監聽隊列(全連接配接隊列大小限制)。該配置主要作用場景是高QPS的場景,在每秒高請求的情況下,我們需要提高tcp-backlog來避免緩慢用戶端連接配接的問題,該值預設為511。生産環境中建議将該值設定為32767,同時設定系統tcp-backlog大小。
注意問題:
1、Linux核心對于tcp-backlog也有限制,該值不可超過系統的/proc/sys/net/core/somaxconn的值(一般預設為128),若超過則以系統somaxconn為準,是以要增大該值需要将tcp-backlog與somaxconn值同時增大。
若要修改系統TCP監聽隊列最大值,可使用如下方法:
(1)直接修改/proc/sys/net/core/somaxconn,由于/proc下都是記憶體資料的映射,是以系統重新開機,該值将失效。
(2)在檔案/etc/sysctl.conf中增加一行:net.core.somaxconn = 32767,然後執行stsctl -p生效。
2、注意全連接配接隊列與半連接配接隊列的差別,此處限制的為全連接配接隊列大小。
參考連結:
https://www.cnblogs.com/Orgliny/p/5780796.html
https://www.cnblogs.com/jcli/p/3911505.html
unixsocket /tmp/redis.sock
配置作用:
用于指定redis-server監聽的unix域套接字路徑,上述若port配置置為0,這個時候redis-server不監聽tcp套接字,可使用域套接字來提供服務,若隻限制本機使用redis服務可用于提高性能。預設不啟用。
unixsocketperm 700
配置作用:
配置unix域套接字使用權限
timeout 0
配置作用:
機關s,設定用戶端空閑逾時斷開連接配接時間。即當用戶端空閑時間超過timeout時,服務端會主動斷開連接配接,若設定為0表示服務端不主動斷開連接配接。
建議該值使用0,redis用戶端使用長連接配接,程序退出時主動關閉連接配接;若不需要長連接配接也可以直接将該值設定為120
tcp-keepalive 300
配置作用:
機關為秒,若該值非0,redis-server則在與用戶端缺乏通訊時每300s發送一次ACK心跳包檢測用戶端的健康狀态,避免redis-server被阻塞。
設定tcp-alive的兩個好處:1、檢測挂掉的對端,及時适當tcp連結 2、降低裝置出問題而導緻的網絡看似連接配接,卻已經與對端斷開的問題。
注意問題:
由于确認對端關閉需要double check用戶端是否真的出問題,是以若用戶端真的出問題,則關閉該連接配接需要兩倍的keepalive時間,此處即600s。redis推薦該值為300(3.2.1版本之後)
4、通用配置(GENERAL)
daemonize no
配置作用:
該配置的作用是用來執行redis是否以守護程序的方式啟動,若該值為yes, redis-server将背景運作,它會将pid寫入pidfile指定的檔案中。
若設定為no,啟動将直接進入指令行界面。該配置預設配置為no。
supervised no
配置作用:
若通過upstart或者systemd啟動redis,可設定此選項來監控redis運作,可選選項如下:
supervis no :不進行監控
supervised upstart :通過将Redis置于SIGSTOP模式來啟動信号
supervised systemd :signal systemd将READY = 1寫入$ NOTIFY_SOCKET
supervised auto :檢測upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET環境變量
pidfile /var/run/redis_6379.pid
配置作用:
用于指定以deamonize運作模式下pid的路徑,它會将pid寫入該檔案中。
loglevel notice
配置作用:
指定redis-server運作時的日志級别
可選級别有:
debug : 記錄大量日志資訊,适用于開發、測試階段
verbose :較多日志資訊,但是沒有debug級别資訊多
notice : 适量日志資訊,使用于生産環境
warning:僅有部分重要、關鍵資訊才會被記錄
logfile /path/redis.log
配置作用:
指定redis-server運作日志檔案。若為空,将日志輸出至标準輸出,當啟用daemonize,日志将被重定向到/dev/null
syslog-enabled no
配置作用:
用于設定是否将日志輸出到系統日志。預設為no,建議設定為no
syslog-ident redis
配置作用:
用于設定系統日志的辨別符,若syslog-enable為no,則該選項不起作用。
syslog-facility local0
配置作用:
指定syslog裝置,必須是USER或LOCAL0-LOCAL7,若syslog-enable為no,則該選項不起作用。
databases 16
配置作用:
設定redis資料庫的數目,用戶端連接配接時時預設資料庫為DB 0,但可以在每個連接配接上使用select選擇要操作的DB。
always-show-logo
配置作用:
是否一直顯示圖示。Redis-4.0後加入快照配置(SNAPSHOTTING)
redis提供了主動和被動的兩種方式來儲存快照,當redis啟動的時候可直接從rdb快照檔案中恢複資料。
主動方式redis提供了兩個指令save和bgsave來主動儲存快照。兩者的差別就是save為阻塞式,而bgsave指令會派生出一個子程序,然後由子程序建立rdb檔案,是以bgsave不會阻塞redis伺服器程序。
被動方式使用者可通過配置快照相關配置,即save配置,當狀态達到配置中指定的狀态的時候,redis-server将自動觸發bgsave生成資料快照。
bgsave的大緻工作流程:
參考:https://juejin.im/post/5b70dfcf518825610f1f5c16
save <seconds> <changes>
例如:
save 900 1
save 300 10
save 60 10000
配置作用:
用于指定redis寫磁盤的政策,可設定多個政策。當時間和變化數同時滿足設定的值的時候,redis将寫磁盤。如save 900 1表示900s内有1個以上變化的時候redis将寫磁盤;save 300 10表示300s内有10個以上變化将寫磁盤;save 60 10000表示當600s内有10000個以上的變化的時候redis将寫磁盤,。
将save配置注釋或者save “”的時候将不寫磁盤。
當執行shutdown指令的時候,若有至少一個儲存點在等待,将自動執行save指令存盤。對于一些信号處理,如直接killall redis-server,redis-server将捕捉該信号,調用shutdown指令,然後存盤,這個時候不會丢失資料;若執行kill -9 xxx,redis将捕捉不到,不會shutdown并存盤,此時将有可能導緻資料丢失。(可做實驗證明)
參考文檔:https://redis.io/topics/signals
Redis快照的優點:
- RDB資料格式是一種經過壓縮的二進制資料格式,可以友善的在網絡中進行傳輸和儲存。
- Redis儲存快照的方式是fork出來一個子程序,該子程序進行儲存快照,對伺服器的性能不會造成太大的性影響
- 可以通過定期備份rdb儲存資料狀态,用于突發故障時的資料恢複。
- Rdb在恢複資料集比較大的資料時速度比aof快。
Redis快照的缺點:
- 當伺服器發生崩潰的時候可能會丢失一段時間的資料,丢失資料的時間段根據存盤的配置決定。
- 從上面bgsave的工作流程可以看出來,redis伺服器fork子程序的操作時阻塞的,當資料量過多或者fork過于頻繁的時候将會影響伺服器的讀寫性能。
stop-writes-on-bgsave-error yes
配置說明:
預設情況下,當RDB持久化出現錯誤時,redis将拒絕所有的寫請求,這樣可以保證redis資料的一緻性,直到下一次RDB持久化成功,redis會自動恢複接受寫請求。但是如果出現這種情況是需要redis可以繼續對外提供服務,可使用該參數指定。
yes:RDB持久化出現錯誤不能繼續對外提供服務,不關心資料不一緻或者有其他政策控制這種不一緻。
no:RDB持久化出現錯誤可以繼續對外提供服務。
Rdbcompression yes
配置說明:
設定是否對存儲到磁盤的快照進行壓縮,yes:壓縮,損耗CPU性能,節省磁盤存儲空間;no:不壓縮,快照占磁盤空間較大,節省CPU計算資源。依據實際情況選擇,預設壓縮。
rdbchecksum yes
配置說明:
從RDB版本5開始,RDB檔案末尾會添加一個CRC64校驗和,這樣有利于提高RDB檔案的容錯性,但是當儲存或加載RDB檔案的時候會損耗10%左右的性能,如果追求高性能可以将該選項關閉,此時save時将在檔案預設添加校驗和0,表示不校驗checksum。
dbfilename dump.rdb
配置說明:
設定快照檔案名
dir ./
配置說明:
設定快照檔案的檔案夾(必須是檔案夾),資料庫将寫入這個目錄,rdb和aof都将寫到這個檔案夾下。
5、主從配置
slaveof <masterip> <masterport>
配置說明:
指定目前redis執行個體為另一個示例的slave。
masterauth <master-password>
配置說明:
若master設定了requirepass密碼認證,則其對應的slave需要将該參數設定為master的密碼才能連結master。該參數預設為空。
slave-serve-stale-data yes
配置說明:
當slave與master失去聯系或者正在複制資料的過程中,當請求到達slave伺服器,會有兩種表現:
yes:slave仍然應答用戶端請求,但是傳回的資料可能是比較舊的資料。
no:執行info和slaveof之外的指令時,slave都将傳回” SYNC with master in progress”的錯誤
slave-read-only yes
配置說明:
用于設定slave是否隻讀。若該參數設定no,則slave可寫。但是注意從庫寫入的資料不會同步到master和其他slave,當主庫修改了資料,從庫的資料會因為自動同步被覆寫。
repl-diskless-sync no
配置說明:
RDB複制是否啟用無磁盤(socket)複制方式。
當啟動一個slave節點或者slave節點斷線重連的時候,slave節點會發送一個psync指令給master。若slave是新啟動的節點,将會觸發全量複制,若為斷線重連的節點,那麼master将隻會複制slave缺少部分的資料。
主從複制的簡單過程:當觸發一個全量複制任務的時候,master将會啟動一個背景線程,開始生成一份RDB快照檔案,同時還會将從用戶端收到的所有寫指令緩存在記憶體中。RDB檔案生成完畢之後,master會将這個RDB檔案發送給slave,slave會先寫入本地磁盤,然後再從磁盤中将資料加載到記憶體中;然後master會将記憶體中緩存的寫指令發送給slave,slave也會同步這些資料。
RDB檔案從master向slave複制的方式有兩種:
- 基于磁盤方式複制:此時master會fork出一個新的程序将RDB檔案寫入檔案,然後父程序将該檔案逐個發送給多個slave節點
- 基于socket方式複制:master直接将rdb資料通過socket發送給多個slave。
參考連結:
https://my.oschina.net/andylucc/blog/683631
https://blog.csdn.net/caokun12321/article/details/81225410
repl-diskless-sync-delay 5
配置說明:
當啟用無磁盤(socket)複制方式的時候,一旦複制傳送開始,新的slave請求需要等待這次傳輸完畢之後進行下一次RDB傳輸才能得到服務。是以為了能讓後續的slave能夠盡量趕上本次複制,redis提供了該參數設定複制開始的延遲,機關為s。
如該參數設定為5,則當有新的slave開始複制的時候,master将會等待5s,觀察是否有新的slave需要複制,5s之後才進行資料複制。
注意:該配置隻有當無磁盤複制啟用的時候才會生效。
repl-ping-slave-period 10
配置說明:
配置slave周期性向master ping的時間間隔,即slaveàmaster的心跳間隔。
參考連結:
http://blog.chinaunix.net/uid-20682147-id-5816952.html
repl-timeout 10
配置說明:
主從複制連接配接逾時時間。Master和slave都有逾時時間的設定。Master檢測到slave上次發送的時間超過repl-timeout,則認為slave離線,清除該slave資訊。Slave檢測到上次和master互動的時間超過repl-timeout,則任務master離線。
注意該時間一定要大于repl-ping-slave-period,否則可能會因為網絡原因導緻誤判。
repl-disable-tcp-nodelay no
配置說明:
主從同步後是否禁用slave的TCP_NODELAY選項。該選項預設為no,當該選項設定為yes,redis将使用更少數量的TCP包和更少的寬帶将資料同步到slave,但是它會帶來更高的資料延遲,使用預設配置的linux核心最多可以達到40ms。預設情況下推薦将該參數設定為no,以得到更小的資料延遲,但是在資料傳輸量較大的場景下,建議選擇為yes。
TCP_NODELAY:該選項是用來控制是否開啟Nagle算法,該算法要求一個TCP連接配接上最多隻能有一個未被确認的小分組,在該小分組确認來到之前,不能發送其他小分組。詳細參考:https://www.jianshu.com/p/ccafdeda0b95
repl-backlog-size 1mb
配置說明:
複制積壓緩沖區是一個固定長度的FIFO的環形隊列,緩沖區大小由該參數指定,預設大小為1M,該緩沖區在master中隻有一個,所有的slave共享此緩沖區,它的作用是用于備份最近主庫發送給從庫的資料。
在主從指令傳播階段,主節點除了将寫指令發送給從節點外,還會發送一份到複制積壓緩沖區,作為寫指令的備份。除了存儲最近的寫指令,複制積壓緩沖區中還存儲了每個位元組相應的複制偏移量,由于複制積壓緩沖區固定大小先進先出的隊列,是以它總是儲存的是最近redis執行的指令。
參考連結:
http://mdba.cn/2015/03/17/redis%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%EF%BC%882%EF%BC%89-replication-buffer%E4%B8%8Ereplication-backlog/
https://juejin.im/post/5b67029c6fb9a04fa42fd592
repl-backlog-ttl 3600
配置說明:
當master沒有slave連接配接的時候,一段時間會釋放複制緩沖區的記憶體,該參數就是用來設定該時間,機關為s,0表示不釋放。時間從最後一個slave斷開的時間開始計算。
slave-priority 100
配置說明:
當master不可用的時候,Redis Sentinel會根據slave的優先級選舉一個提升為master。slave-priority值越小,越優先當選為master。0表示永遠不會被提升為master。預設優先級是100。
min-slaves-to-write 3
配置說明:
設定當master最少有N個健康的slave的時候,才允許被寫入。0表示關閉該功能。此設定可以較大程度上保證資料不丢失。
min-slaves-max-lag 10
配置說明:
用于确定目前slave是否為健康。若slave與master的延時>設定的秒數,則認為該slave是不健康的,預設為10。延遲的秒數從master最後收到slave的ping開始計算。
6、安全配置
requirepass mypassword
配置說明:
指定redis認證連結密碼,若不設定預設為不需要密碼認證。對于部署在内網中的redis伺服器,沒必要設定密碼,但是在不受信任的網絡中,則需要設定密碼防止外人惡意攻擊。
設定密碼後,使用用戶端操作時,有多種方法指定密碼通路redis-server,常見的有以下兩種:
(1)redis-cli -p 6380 -a test_password(直接在shell指定密碼)
(2)redis-cli -p 6380(連接配接後通過auth指定密碼)
127.0.0.1:6380> auth test_password
rename-command CONFIG myconfig
配置說明:
對指令進行重命名。對于一些敏感或者危險的操作,我們可以對其進行重命名,禁止用戶端使用,這樣隻能使用redis-cli内部工具進行連接配接使用新指令操作,達到安全的目的。
rename-command另外一個重要的作用是禁用指定指令,隻需要将指令rename為空字元串即可。可設定多個。
7、用戶端配置
maxclients 10000
配置說明:
設定redis伺服器最大用戶端連接配接數。預設為10000, 0表示不限制。由于redis預留了一些連接配接内部使用,是以建議該值最小設定為32。當用戶端連接配接數超出該限制,redis-server将拒絕新的連接配接。
9、記憶體相關配置
maxmemory <bytes>
配置說明:
設定redis最大占用記憶體,設定為0表示不限制。當記憶體資料将要達到maxmemory設定的值的時候。Redis将根據配置的資料驅逐政策,對記憶體資料進行淘汰。若淘汰之後資料還是達到maxmemory的值,則redis-server将不對外提供寫操作,隻應答讀請求。
maxmemory-policy <policy>
配置說明:
Redis記憶體資料淘汰機制,當redis使用記憶體将要達到maxmemory指定的限制時,redis将啟用該政策淘汰資料。資料淘汰政策如下:
volatile-lru -> 從已設定過期時間的記憶體資料集中挑選最近最少使用的資料 淘汰;
volatile-lfu -> 從已設定過期時間的記憶體資料集中挑選最少使用的資料 淘汰;
volatile-ttl -> 從已設定過期時間的記憶體資料集中挑選即将過期的資料 淘汰;
volatile-random -> 從已設定過期時間的記憶體資料集中任意挑選資料 淘汰;
allkeys-lru -> 從記憶體資料集中挑選最近最少使用的資料 淘汰;
allkeys-lfu -> 從記憶體資料集中挑選最少使用的資料 淘汰;
allkeys-random -> 從資料集中任意挑選資料 淘汰;
noeviction -> 不淘汰任何資料,當記憶體滿時直接報錯。(預設)
maxmemory-samples 5
配置說明:
執行淘汰政策時選用樣本數,由于LRU,LFU和TTL算法都是近似的算法,是以改變樣本大小可以調整算法的精度。Redis預設樣本為5個,即随機算則5個key進行檢驗并淘汰其中一個,因為5個key可以得到足夠精确的結果,10個key接近真實的LRU,3個key速度快但是不精确,是以一般預設使用5個。
replica-ignore-maxmemory yes
配置說明:
從redis5開始,預設情況下副本将忽略其maxmemory設定(除非在故障轉移或者手動将其提升為master)。這意味着在發生資料淘汰的時候是由主伺服器處理,主伺服器将del指令發送到從,然後進行删除,保證主從資料的一緻。但是如果從伺服器是可寫的或者希望從伺服器具有不同的記憶體設定,就可以改變該預設值。
10、惰性删除配置(非阻塞删除配置)
Redis-server删除資料時提供了兩種删除資料的原語。分别是阻塞式删除和非阻塞删除。阻塞式删除當key比較小的時候,删除操作的效率會達到其他O(1)或O(log(n))的性能,但是當删除的key關聯的資料過多的時候,删除将耗時較長,會導緻阻塞,其他指令不能執行,這個時候就需要考慮非阻塞式删除。
資料删除包括兩種,一種是主動删除,如使用者删除某一個key,或者清空資料庫的所有資料;另外一種是被動删除,如redis key過期、記憶體耗盡時的資料自動淘汰。
對于主動删除,redis提供了unlink指令來被動删除某一個key,即為del的異步指令;還提供了async選項,在flashall 或者flushdb的時候添加async選項可以達到意不删除的效果。
對于被動删除,我們可以通過配置來設定資料的異步删除。Redis提供的被動異步删除政策有以下幾種,這幾種配置預設關閉,若啟用異步删除,将對應的值設定為yes
lazyfree-lazy-eviction no
針對redis記憶體使用達到maxmeory,并設定有淘汰政策時,在被動淘汰key時,是否采用lazy free機制;
lazyfree-lazy-expire no
針對設定有TTL的鍵,達到過期時間後,被redis清理删除時是否采用lazy free機制;此場景建議開啟,因為TTL本身是自适應調整速度的。
lazyfree-lazy-server-del no
内部删除選項,針對有些指令在處理已存在的鍵時,會帶有一個隐式的DEL鍵的操作。比如rename oldkey newkey時,如果newkey存在需要删除newkey,如果這些目标鍵是一個big key,那就會引入阻塞删除的性能問題。 此參數設定就是解決這類問題,建議可開啟。
slave-lazy-flush no
針對slave進行全量資料同步,slave在加載master的RDB檔案前,會運作flushall來清理自己的資料場景;
參數設定決定是否采用異步flush機制。異步flush清空從節點本地資料庫,可減少全量同步耗時,進而減少主庫因輸出緩沖區爆漲引起的記憶體使用增長。
11、僅追加模式配置
Redis提供了兩種資料持久化的方式,分别是RDB資料快照和AOF持久化兩種模式。redis預設啟用RDB資料快照,相關說明可以參考上面的配置,相比于資料快照,AOF可提供更好的持久性,從上面可以看出資料快照模式在server當機的時候,會丢失幾s内寫入的資料(丢失資料的時yo由save配置決定),但是使用預設資料的fsync政策,redis在服務斷電或者當機的時候隻會丢失1s的資料。
當RDB和AOF持久化政策同時啟用的時候,redis-server在起來的時候将會優先從aof檔案恢複資料,這樣就導緻一個問題,若redis-server第一次以AOF模式啟動的時候,它将不能加載原rdb中的資料,導緻啟動後原資料為空。
參考:https://blog.51cto.com/11736068/1981965
appendonly no
配置說明:
是否啟用AOF持久化。預設不啟用。
appendfilename "appendonly.aof"
配置說明:
AOF檔案名,aof檔案存儲路徑為上面dir指定的路徑,與rdb檔案在相同路徑。
appendfsync everysec
配置說明:
AOF下可以通過配置appendfsync參數設定redis-server調用fsync()函數将緩沖區的資料刷到磁盤上的政策。預設情況下,大多數作業系統将緩存區的資料寫入磁盤的政策是當緩沖區滿或者達到30s時,才會将緩沖區資料寫入磁盤。
但是也可以通過調用fsync()函數強制将緩沖區的資料刷到磁盤上。Redis提供了以下選項,設定fsync調用政策。
no : 不調用fsync()函數,完全依賴作業系統的寫磁盤政策。這種伺服器性能最高,但是斷電或者伺服器當機的時候就有可能丢失30s的資料,對于資料可靠性較高的系統不建議使用此配置。。
everysec: redis每秒調用一次fsync函數,将緩沖區資料寫到磁盤。
always:redis沒接收到一次寫請求将都調用一次fsync函數,這樣嚴重影響redis server的讀寫性能。
故一般建議該值使用預設值,即everysec
no-appendfsync-on-rewrite
配置說明:
在aof重寫或者寫入rdb檔案的時候,會執行大量的IO,對于everysec和always的aof模式來說,執行fsync會造成阻塞過長時間。該參數可以控制當進行rewrite的時候是否調用fsync函數刷盤。
no : rewrite期間依然執行fsync函數刷盤,這樣更能保證redis持久化特性,但是會影響伺服器的讀寫性能。(預設為no)
Yes:rewrite期間不調用fsync刷盤,可以保證伺服器對外提供高性能服務,但是在當機的時候可能會丢失較長時間的資料。
若對系統的性能要求不是特别高,建議使用預設值no。
auto-aof-rewrite-percentage 100
AOF 持久化是通過儲存被執行的寫指令來記錄資料庫狀态的,是以AOF檔案的大小随着時間的流逝一定會越來越大;
為了解決AOF檔案體積膨脹的問題,Redis提供了AOF重寫功能:Redis伺服器可以建立一個新的AOF檔案來替代現有的AOF檔案,新舊兩個檔案所儲存的資料庫狀态是相同的,但是新的AOF檔案不會包含任何浪費空間的備援指令,通常體積會較舊AOF檔案小很多。
配置說明:
aof自動重寫配置。當目前aof檔案大小超過上一次重寫的aof檔案大小的百分比之多少時調用BGREWRITEAOF重寫。如該值為100時,當AOF日志檔案是上一次重寫大小的兩倍的時候将觸發重寫操作。
auto-aof-rewrite-min-size 64mb
配置說明:
aof自動重寫配置。設定允許重寫的最小aof檔案大小,避免了達到約定百分比但尺寸仍然很小的情況還要重寫。
aof-load-truncated yes
配置說明:
當redis所在伺服器當機的時候,可能會導緻aof檔案被截斷,這個時候aof檔案将不完整,尤其是在ext4檔案系統沒有添加data=ordered選項的時候會出現。這個時候redis啟動的時候有兩種選擇,1:直接報錯,抛出一個錯誤等待使用者修複,2、加載盡可能多的資料并正常啟動服務。
yes: server将加載盡可能多的資料并正常啟動
no : 伺服器出現錯誤并拒絕啟動,需要使用者手動執行redis-check-aof指令才可以重新啟動。
aof-use-rdb-preamble no
配置說明:
[RDB file][AOF tail]
該新特性是redis4.0之後新添加的。它是一個支援RDB-AOF混合在持久化格式。在啟用該功能之後,AOF重寫産生的檔案将同時包含RDB格式的内容和AOF格式的内容,RDB檔案中用于記錄已有的資料,AOF格式檔案中包含最近發生變化的資料。這樣redis就兼有了RDB和AOF的優點。既能快速地生成重寫檔案,又能在出現問題時快速的載入資料。該功能預設關閉,為了避免資料格式更改出現以外。
12、LUA腳本配置
lua-time-limit 5000
配置說明:
以毫秒為機關執行lua腳本最大的執行時間。一般建議為5s,因為一般lua腳本的執行是毫秒級别的。當lua腳本指令逾時之後,redis-server會做如下操作:
- 在日志中記錄該腳本執行時間過長
- 調用write的lua腳本隻能被SHUTDOWN NOSAVE指令處理,該指令會丢失最近一次持久化後的資料
- 沒有調用寫操作的lua腳本可以被SCRIPT KILL處理。
- 開始接受其他指令,對于普通指令均會傳回busy的錯誤,僅僅會處理SHUTDOWN NOSAVE和SCRIPT KILL指令。
參考:https://my.oschina.net/floor/blog/1603116
13、叢集配置
cluster-enabled yes
配置說明:
是否啟用叢集配置,預設不開啟。
cluster-config-file nodes-6379.conf
配置說明:
叢集中的每個節點都有一個叢集相關的配置檔案,其儲存了叢集的相關資訊。改檔案不手動配置,而是由節點自身生成并更新該檔案。注意,叢集中所有執行個體的該配置檔案名不能沖突。
cluster-node-timeout 15000
配置說明:
叢集節點間的連結逾時毫秒(預設為15s)。當叢集之間連接配接逾時超過該值,将被認為該節點處于不可用狀态。
cluster-slave-validity-factor 10
配置說明:
當叢集中某個master進行故障轉移的時候,全部slave都會請求申請成為新的master,但是有些slave已經和maste斷開較長一段時間了,這時這個slave上的資料就會過于陳舊,這樣的slave不能提升為master。對于slave,沒有比較精确的衡量标準去衡量它的資料age,是以redis提供了兩個檢查:
- 如果有多個slave伺服器可以進行故障轉移,他們之間将會交換消息,以試圖以最佳的複制偏移量給slave提供故障轉移優勢。(slave之間互相交換資料,使資料盡量達到最新)
- 計算每個slave與master最後一次互動的時間。互動可能為最後一次Ping的時間、接受指令或者與master斷開的時間。若該時間過去太久将不會進行故障轉移。
cluster-slave-validity-factor參數用來衡量slave與master資料斷開時間過長的一個标準,比較slave斷線時間與(node-timeout * slave-validity-factor) + repl-ping-slave-period,當斷線時間小于該時間的時候才能進行故障轉移。
注意該值預設為10,若該值過大,可能會導緻slave資料過于陳舊也會發聲故障轉移;若該值過小,可能會導緻沒有可選的slave更新為master。
cluster-migration-barrier 1
配置說明:
Redis叢集中的slave節點可以遷移到沒有slater節點或者slave節點全部停止工作的master節點下,這種機制提高了redis叢集地抵禦故障的能力,不然的話,如果master節點下沒有正在工作的節點,這台master節點将會成為孤兒節點。
該參數的作用用于指定:當該叢集下master節點的slave數量大于該值的時候,其他的節點才能遷移到孤兒master節點下。
如目前值為1,則隻有目前master節點下至少有兩個slave節點的時候才可以将其中一個節點遷移到孤兒master節點下。若該值為2,則master節點下至少有3個節點,其中一個節點才能遷移到孤兒節點下。
若要禁用slave節點遷移,可以将該值設定成一個比較大的值即可。但是設定為0會比較危險。
cluster-require-full-coverage yes
配置說明:
預設情況下,redis叢集中,如果有一個哈希槽沒有可用的節點為他提供服務(該哈希槽不屬于任何一個節點),redis将停止提供服務。也就是需要保證所有的哈希槽都正常,redis才能正常服務。但是,有的時候使用的訓示redis叢集的一個子集,這個時候就可以将該選項設定為no,使其正常服務。
cluster-slave-no-failover no
配置說明:
當master挂掉的時候,禁止slave發生故障轉移。尤其是在多資料中心的時候該選項可起很大作用。
14、慢請求日志配置
慢請求日志是用來記錄redis運作過程中執行比較慢的指令以及耗時。當指令執行時間超過某一個值的時候,将會儲存在慢請求日志中,慢請求日志隻存儲在記憶體中,不會寫檔案,是以記錄慢請求日志沒有IO操作。
檢視慢請求日志:
SLOWLOG GET 10(指定檢視的條數)
傳回資料:
1) (integer) 644 --- 編号
2) (integer) 1551360953 --- 指令執行時的時間戳
3) (integer) 630137 --- 指令執行時間(us)
4) 1) "PING" --- 指令組成的字元串清單
檢視慢請求日志條數:
SLOWLOG LEN
重置慢請求日志:
SLOWLOG RESET
參考:https://www.cnblogs.com/weihanli/p/redis-slowlog.html
slowlog-log-slower-than 10000
配置說明:
用于設定記錄慢請求日志的最小時間(機關微妙)。若指令運作超過該時間,将被記錄到慢請求日志中。注意:負數将禁用慢查詢日志;0會強制記錄所有日志。由于是IO操作,是以記錄所有的操作對性能也不會有太大的影響。
slowlog-max-len 128
配置說明:
最大慢查詢日志條數。當慢查詢日志超過設定值的時候,redis将剔除最老的記錄。
15、延遲監控配置
Redis2.8.13引入了延遲監控新功能,它可以幫助使用者檢查和定位可能的延遲問題。Redis會耗時将大于等于門檻值的操作記錄下來,并生成監控資訊便于使用者檢視。詳細說明參考:http://ghoulich.xninja.org/2016/12/08/how-to-use-latency-monitor-in-redis/
latency-monitor-threshold 0
配置說明:
設定監控門檻值,隻監控耗時大于上述值的操作。若設定為0,表示不啟用該功能。
16、事件通知配置
Redis2.8.0之後,添加了事件通知新特性,而這個新特性是依賴釋出訂閱模式實作的。我們可以通過對該功能進行配置來獲知某一時間的發生,依賴該功能可以實作定時器等等。但是該功能不是可靠地時間通知,當用戶端斷開後,将丢失所有斷開期間的時間通知,而且并不能確定事件通知的到達。如果不使用該功能建議關閉,因為當資料集較大的時候可能會影響redis的性能。
事件通知的應用可參考:https://blog.csdn.net/kunpeng1987/article/details/79624915
notify-keyspace-events “”
配置說明:
參數是一下字元的任意組合,它指定了伺服器該發送哪些類型的通知:
K : 鍵空間通知,所有通知以 keyspace@ 為字首
E : 鍵事件通知,所有通知以 keyevent@ 為字首
g : DEL 、 EXPIRE 、 RENAME 等類型無關的通用指令的通知
$ : 字元串指令的通知
l : 清單指令的通知
s : 集合指令的通知
h : 哈希指令的通知
z : 有序集合指令的通知
x : 過期事件:每當有過期鍵被删除時發送
e : 驅逐(evict)事件:每當有鍵因為 maxmemory 政策而被删除時發送
A : 參數 g$lshzxe 的别名
當配置參數為空的時候表示不啟用該功能。
具體使用教程可參考:https://blog.csdn.net/qijiqiguai/article/details/78229111
17、進階配置
進階配置中主要涉及了redis對特定資料結構進行記憶體優化的一些參數。
對于hash map類型,當hash key中的field個數和所占記憶體大小小于某個值的時候,其存儲方式實際上是采用zipmap的方式存儲的,而不是hash-table,這樣可以節省很多記憶體,原因它省去了hash map很多中繼資料的存儲開銷。雖然zipmap的添加、删除、查找的複雜度都是O(n),但是在資料集較小的情況下,其性能與hash-map的性能還是差不多的。當hash key超過某一個大小或者field個數超過一定限制後,redis會在内部自動将zipmap存儲重組為正常的hashtable。
對于list資料類型,當資料集小于一定值的時候,其壓縮存儲方式為ziplist。
對于set資料類型,當資料集小于一定值的時候,其壓縮存儲方式為inset。
對于zset資料類型,當資料集小于一定值的時候,其壓縮存儲方式為ziplist。
參考:https://blog.csdn.net/freebird_lb/article/details/7733994
https://blog.csdn.net/session_time/article/details/52792190
http://zhangtielei.com/posts/blog-redis-quicklist.html
hash-max-ziplist-entries 512
配置說明:
指定該參數ziplist中存儲的filed數最大為512,當超過該值将重組為hash table。
hash-max-ziplist-value 64
配置說明:
機關位元組,指定該參數ziplist中存儲的值大小最大為64位元組,當超過該大小将被重組為hash table。
list-max-ziplist-size -2
配置說明:
當該值為正值的時候,表示以list中的元素的個數為限制決定是否使用ziplist;當該值為負值的時候,表示以list的大小為限制決定是否使用ziplist。
負值可選項有以下幾種:
-1 : 每個list的大小不能超過4kb
-2 : 每個list的大小不能超過8kb(預設)
-3 : 每個list的大小不能超過16kb
-4 : 每個list的大小不能超過32kb
-5 : 每個list的大小不能超過64kb
如list-max-ziplist-size 10 表示當list中的元素數超過10個時候,list将被從ziplist重組為list結構。list-max-ziplist-size -2表示當list value大小超過8kb的時候,list将被從ziplist重組為list結構。
list-compress-depth 0
配置說明:
當清單很長的時候,最容易被通路的就是清單兩端的資料,中間的資料被通路的頻率比較低,通路性能也比較低。是以redis提供這個選項,能夠把中間的資料節點進行壓縮,進一步的節省記憶體空間。
0 : 表示所有資料都不壓縮。(預設)
1 : 表示quicklist兩端各有1個資料不被壓縮
2 : 表示quicklist兩端各有2個資料不被壓縮
3 : 表示quicklist兩端各有3個資料不被壓縮
……
set-max-intset-entries 512
配置說明:
指定set中最大記錄數為512是才使用intset資料結構存儲,超過該限制将被重組為Dict結構。
zset-max-ziplist-entries 128
配置說明:
指定zset中最大記錄數為128時使用ziplist結構,超過該限制被重組為hash map結構。
zset-max-ziplist-value 64
配置說明:
指定zset中最大大小為64位元組時使用ziplist結構,超過該限制被重組為hash map結構。
hll-sparse-max-bytes 3000
配置說明:
機關位元組。指定HyperLogLog 稀疏表示位元組限制。當value小于等于指定值的時候使用稀疏表示方式,超過該值則使用稠密資料結構。預設為3000。
關于稀疏和稠密資料和結構可參考:https://github.com/LH0702/Single-learn/issues/11
activerehashing yes
配置說明:
預設情況下redis每秒進行10次rehash,用于盡快釋放記憶體。預設該操作開啟,若對實時性要求比較高,可将該選項置為no;若對實時性要求沒那麼高,最好開啟次參數盡快釋放記憶體。
client-output-buffer-limit normal 0 0 0
配置說明:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
用于配置用戶端輸出緩沖限制,是redis server的一種保護機制。client-output-buffer是在server端實作的一個讀取緩沖區。redis server在接收到用戶端的請求後,把影響結果寫入到client buffer中,而不是直接發送給用戶端。server把結果寫入到client buffer中後,繼續處理用戶端的其他請求。這樣異步處理方式使redis server不會因為網絡原因阻塞其他請求的處理。
class:用戶端種類
- normal : 普通的用戶端
- slave : 從庫的複制用戶端
- pubsub:釋出訂閱的用戶端
hard limit:緩沖區大小硬性限制。0表示不限制
soft limit:緩沖區大小軟性限制。0表示不限制
soft seconds:緩沖區大小達到了soft limit值的持續時間。
Redis server觸發保護機制主要有兩種情況:
- client buffer達到了soft limit 并且持續了soft seconds時間,将立即斷開和用戶端的連結
- client buffer達到了hasr limit。Server也立即斷開與用戶端的連結。
由于client buffer實際上占用了redis資料記憶體空間。是以當client buffer較大時可能會導緻記憶體空間不足,報OOM錯誤(記憶體不足)。是以該值一定不要使用預設值。需要根據需要自行設定。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
參考連結:http://mdba.cn/2015/03/19/redis%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6%EF%BC%884%EF%BC%89-client-buffer/
client-query-buffer-limit 1gb
配置說明:
Redis為每個用戶端配置設定了輸入緩沖區,它的作用是将用戶端發送的指令臨時儲存,同時redis從輸入緩沖中取出指令并執行。輸入緩沖區為用戶端發送指令到服務端執行指令提供了緩沖。當緩沖區大小超過限制(預設為1GB)的時候,用戶端将被強制關閉。可通過client list指令檢視所有的用戶端和輸入輸出緩沖區。
由于輸入緩沖區的記憶體與輸出緩沖區記憶體相同,都是用的redis-server得資料空間,是以讓輸入緩沖區過大也可能會出現OOM問題。
若不設定,則限制為1gb也可以根據實際情況手動設定其他值,注意此值為每個用戶端的最大查詢緩沖。
參考:https://blog.csdn.net/sunhuiliang85/article/details/75092403
proto-max-bulk-len 512mb
配置說明:
指定redis單個請求的元素的大小限制,預設上限為512mb,即redis中任意一個string大小不能超過512mb,無論是key還是value,建議不要小于512mb,具體可以參考以下連結。
https://github.com/antirez/redis/issues/757
hz 10
配置說明:
該參數用于設定redis調用内部函數執行背景任務的頻率。後面的值表示1s内執行多少次,預設為10,建議不要超過100。
如redis會定時調用内部函數進行關閉逾時的用戶端連接配接,清除過期的redis key等等。
這個值越大耗費的CPU也随之增加,使得redis執行背景任務的靈敏度提高,如過期的key可以更快的清除。
aof-rewrite-incremental-fsync yes
配置說明:
當子程序重寫AOF檔案,以下選項開啟時,AOF檔案會每産生32M資料調用fsync函數同步一次。這有助于更快寫入檔案到磁盤避免延遲
https://blog.csdn.net/COOL_CR/article/details/52411172
https://github.com/RedisLabsModules/redex
https://blog.csdn.net/u012152619/article/details/52821201
https://www.jianshu.com/p/5a187bfd4a06
http://xiaorui.cc/2016/12/08/redis-module
https://luoming1224.github.io/2018/11/11/[redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0]redis4.0%E6%96%B0%E7%89%B9%E6%80%A7-%E9%9D%9E%E9%98%BB%E5%A1%9E%E5%88%A0%E9%99%A4/