Redis配置解析

本文摘抄自大鵬redis教程

我們可以在啟動redis-server時指定應該加載的配置文件赃阀,方法如下:

$ ./redis-server /path/to/redis.conf

在配置文件的開頭部分瘩将,首先明確了一些度量單位:

# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes

可以看出,redis配置中對單位的大小寫不敏感凹耙,1GB姿现、1Gb和1gB都是相同的。由此也說明肖抱,redis只支持bytes备典,不支持bit單位

redis支持“主配置文件中引入外部配置文件”意述,很像C/C++中的include指令提佣,比如:

include /path/to/other.conf

如果你看過redis的配置文件吮蛹,會發(fā)現(xiàn)還是很有條理的。redis配置文件被分成了幾大塊區(qū)域拌屏,它們分別是:

  • 通用(general)
  • 快照(snapshotting)
  • 復制(replication)
  • 安全(security)
  • 限制(limits)
  • 追加模式(append only mode)
  • LUA腳本(lua scripting)
  • 慢日志(slow log)
  • 事件通知(event notification)

下面我們就來逐一講解潮针。

通用

默認情況下,redis并不是以daemon形式來運行的倚喂。通過daemonize配置項可以控制redis的運行形式每篷,如果改為yes,那么redis就會以daemon形式運行:

daemonize no

當以daemon形式運行時端圈,redis會生成一個pid文件焦读,默認會生成在/var/run/redis.pid。當然舱权,你可以通過pidfile來指定pid文件生成的位置矗晃,比如:

pidfile /path/to/redis.pid

默認情況下,redis會響應本機所有可用網(wǎng)卡的連接請求宴倍。當然张症,redis允許你通過bind配置項來指定要綁定的IP,比如:

bind 192.168.1.2 10.8.4.2

redis的默認服務端口是6379鸵贬,你可以通過port配置項來修改俗他。如果端口設置為0的話,redis便不會監(jiān)聽端口了恭理。

port 6379

有些同學會問“如果redis不監(jiān)聽端口拯辙,還怎么與外界通信呢”,其實redis還支持通過unix socket方式來接收請求颜价⊙谋#可以通過unixsocket配置項來指定unix socket文件的路徑,并通過unixsocketperm來指定文件的權(quán)限周伦。

unixsocket /tmp/redis.sockunixsocketperm 755

當一個redis-client一直沒有請求發(fā)向server端夕春,那么server端有權(quán)主動關(guān)閉這個連接,可以通過timeout來設置“空閑超時時限”专挪,0表示永不關(guān)閉及志。

timeout 0

TCP連接保活策略寨腔,可以通過tcp-keepalive配置項來進行設置速侈,單位為秒,假如設置為60秒迫卢,則server端會每60秒向連接空閑的客戶端發(fā)起一次ACK請求倚搬,以檢查客戶端是否已經(jīng)掛掉,對于無響應的客戶端則會關(guān)閉其連接乾蛤。所以關(guān)閉一個連接最長需要120秒的時間每界。如果設置為0捅僵,則不會進行保活檢測眨层。

tcp-keepalive 0

redis支持通過loglevel配置項設置日志等級庙楚,共分四級,即debug趴樱、verbose馒闷、notice、warning伊佃。

loglevel notice

redis也支持通過logfile配置項來設置日志文件的生成位置窜司。如果設置為空字符串沛善,則redis會將日志輸出到標準輸出航揉。假如你在daemon情況下將日志設置為輸出到標準輸出,則日志會被寫到/dev/null中金刁。

logfile ""

如果希望日志打印到syslog中帅涂,也很容易,通過syslog-enabled來控制尤蛮。另外媳友,syslog-ident還可以讓你指定syslog里的日志標志,比如:

syslog-ident redis

而且還支持指定syslog設備产捞,值可以是USER或LOCAL0-LOCAL7醇锚。具體可以參考syslog服務本身的用法茉继。

syslog-facility local0

對于redis來說糊余,可以設置其數(shù)據(jù)庫的總數(shù)量,假如你希望一個redis包含16個數(shù)據(jù)庫顶瞳,那么設置如下:

databases 16

這16個數(shù)據(jù)庫的編號將是0到15看靠。默認的數(shù)據(jù)庫是編號為0的數(shù)據(jù)庫赶促。用戶可以使用select <DBid>來選擇相應的數(shù)據(jù)庫。

快照

快照挟炬,主要涉及的是redis的RDB持久化相關(guān)的配置鸥滨,我們來一起看一看。
我們可以用如下的指令來讓數(shù)據(jù)保存到磁盤上谤祖,即控制RDB快照功能:

save <seconds> <changes>

舉例來說:

save 900 1 //表示每15分鐘且至少有1個key改變婿滓,就觸發(fā)一次持久化
save 300 10 //表示每5分鐘且至少有10個key改變,就觸發(fā)一次持久化
save 60 10000 //表示每60秒至少有10000個key改變粥喜,就觸發(fā)一次持久化

如果你想禁用RDB持久化的策略凸主,只要不設置任何save指令就可以,或者給save傳入一個空字符串參數(shù)也可以達到相同效果容客,就像這樣:

save ""

如果用戶開啟了RDB快照功能秕铛,那么在redis持久化數(shù)據(jù)到磁盤時如果出現(xiàn)失敗约郁,默認情況下,redis會停止接受所有的寫請求但两。這樣做的好處在于可以讓用戶很明確的知道內(nèi)存中的數(shù)據(jù)和磁盤上的數(shù)據(jù)已經(jīng)存在不一致了鬓梅。如果redis不顧這種不一致,一意孤行的繼續(xù)接收寫請求谨湘,就可能會引起一些災難性的后果绽快。

如果下一次RDB持久化成功,redis會自動恢復接受寫請求紧阔。
當然坊罢,如果你不在乎這種數(shù)據(jù)不一致或者有其他的手段發(fā)現(xiàn)和控制這種不一致的話,你完全可以關(guān)閉這個功能擅耽,以便在快照寫入失敗時活孩,也能確保redis繼續(xù)接受新的寫請求。配置項如下:

stop-writes-on-bgsave-error yes

對于存儲到磁盤中的快照乖仇,可以設置是否進行壓縮存儲憾儒。如果是的話,redis會采用LZF算法進行壓縮乃沙。如果你不想消耗CPU來進行壓縮的話起趾,可以設置為關(guān)閉此功能,但是存儲在磁盤上的快照會比較大警儒。

rdbcompression yes

在存儲快照后训裆,我們還可以讓redis使用CRC64算法來進行數(shù)據(jù)校驗,但是這樣做會增加大約10%的性能消耗蜀铲,如果你希望獲取到最大的性能提升边琉,可以關(guān)閉此功能。

rdbchecksum yes

我們還可以設置快照文件的名稱蝙茶,默認是這樣配置的:

dbfilename dump.rdb

最后艺骂,你還可以設置這個快照文件存放的路徑。比如默認設置就是當前文件夾:

dir ./

復制

redis提供了主從同步功能隆夯。
通過slaveof配置項可以控制某一個redis作為另一個redis的從服務器钳恕,通過指定IP和端口來定位到主redis的位置。一般情況下蹄衷,我們會建議用戶為從redis設置一個不同頻率的快照持久化的周期忧额,或者為從redis配置一個不同的服務端口等等。

slaveof <masterip> <masterport>

如果主redis設置了驗證密碼的話(使用requirepass來設置)愧口,則在從redis的配置中要使用masterauth來設置校驗密碼睦番,否則的話,主redis會拒絕從redis的訪問請求。

masterauth <master-password>

當從redis失去了與主redis的連接托嚣,或者主從同步正在進行中時巩检,redis該如何處理外部發(fā)來的訪問請求呢?這里示启,從redis可以有兩種選擇:
第一種選擇:如果slave-serve-stale-data設置為yes(默認)兢哭,則從redis仍會繼續(xù)響應客戶端的讀寫請求。
第二種選擇:如果slave-serve-stale-data設置為no夫嗓,則從redis會對客戶端的請求返回“SYNC with master in progress”迟螺,當然也有例外,當客戶端發(fā)來INFO請求和SLAVEOF請求舍咖,從redis還是會進行處理矩父。

你可以控制一個從redis是否可以接受寫請求。將數(shù)據(jù)直接寫入從redis排霉,一般只適用于那些生命周期非常短的數(shù)據(jù)窍株,因為在主從同步時,這些臨時數(shù)據(jù)就會被清理掉郑诺。自從redis2.6版本之后夹姥,默認從redis為只讀杉武。
slave-read-only yes
只讀的從redis并不適合直接暴露給不可信的客戶端辙诞。為了盡量降低風險,可以使用rename-command指令來將一些可能有破壞力的命令重命名轻抱,避免外部直接調(diào)用飞涂。比如:

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

從redis會周期性的向主redis發(fā)出PING包。你可以通過repl_ping_slave_period指令來控制其周期祈搜。默認是10秒较店。

repl-ping-slave-period 10

在主從同步時,可能在這些情況下會有超時發(fā)生:
以從redis的角度來看容燕,當有大規(guī)模IO傳輸時梁呈。
以從redis的角度來看,當數(shù)據(jù)傳輸或PING時蘸秘,主redis超時
以主redis的角度來看官卡,在回復從redis的PING時,從redis超時

用戶可以設置上述超時的時限醋虏,不過要確保這個時限比repl-ping-slave-period的值要大寻咒,否則每次主redis都會認為從redis超時。

repl-timeout 60

我們可以控制在主從同步時是否禁用TCP_NODELAY颈嚼。如果開啟TCP_NODELAY毛秘,那么主redis會使用更少的TCP包和更少的帶寬來向從redis傳輸數(shù)據(jù)。但是這可能會增加一些同步的延遲,大概會達到40毫秒左右叫挟。如果你關(guān)閉了TCP_NODELAY艰匙,那么數(shù)據(jù)同步的延遲時間會降低,但是會消耗更多的帶寬抹恳。

repl-disable-tcp-nodelay no

我們還可以設置同步隊列長度旬薯。隊列長度(backlog)是主redis中的一個緩沖區(qū),在與從redis斷開連接期間适秩,主redis會用這個緩沖區(qū)來緩存應該發(fā)給從redis的數(shù)據(jù)绊序。這樣的話,當從redis重新連接上之后秽荞,就不必重新全量同步數(shù)據(jù)骤公,只需要同步這部分增量數(shù)據(jù)即可。

repl-backlog-size 1mb

如果主redis等了一段時間之后扬跋,還是無法連接到從redis阶捆,那么緩沖隊列中的數(shù)據(jù)將被清理掉。我們可以設置主redis要等待的時間長度钦听。如果設置為0洒试,則表示永遠不清理。默認是1個小時朴上。

repl-backlog-ttl 3600

我們可以給眾多的從redis設置優(yōu)先級垒棋,在主redis持續(xù)工作不正常的情況,優(yōu)先級高的從redis將會升級為主redis痪宰。而編號越小叼架,優(yōu)先級越高。比如一個主redis有三個從redis衣撬,優(yōu)先級編號分別為10乖订、100、25具练,那么編號為10的從redis將會被首先選中升級為主redis乍构。當優(yōu)先級被設置為0時,這個從redis將永遠也不會被選中扛点。默認的優(yōu)先級為100哥遮。

slave-priority 100

假如主redis發(fā)現(xiàn)有超過M個從redis的連接延時大于N秒,那么主redis就停止接受外來的寫請求占键。這是因為從redis一般會每秒鐘都向主redis發(fā)出PING昔善,而主redis會記錄每一個從redis最近一次發(fā)來PING的時間點,所以主redis能夠了解每一個從redis的運行情況畔乙。

min-slaves-to-write 3
min-slaves-max-lag 10

上面這個例子表示君仆,假如有大于等于3個從redis的連接延遲大于10秒,那么主redis就不再接受外部的寫請求。上述兩個配置中有一個被置為0返咱,則這個特性將被關(guān)閉钥庇。默認情況下min-slaves-to-write為0,而min-slaves-max-lag為10咖摹。

安全

我們可以要求redis客戶端在向redis-server發(fā)送請求之前评姨,先進行密碼驗證。當你的redis-server處于一個不太可信的網(wǎng)絡環(huán)境中時萤晴,相信你會用上這個功能吐句。由于redis性能非常高,所以每秒鐘可以完成多達15萬次的密碼嘗試店读,所以你最好設置一個足夠復雜的密碼嗦枢,否則很容易被黑客破解。

requirepass zhimakaimen

這里我們通過requirepass將密碼設置成“芝麻開門”屯断。
redis允許我們對redis指令進行更名文虏,比如將一些比較危險的命令改個名字,避免被誤執(zhí)行殖演。比如可以把CONFIG命令改成一個很復雜的名字氧秘,這樣可以避免外部的調(diào)用,同時還可以滿足內(nèi)部調(diào)用的需要:

rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c89

我們甚至可以禁用掉CONFIG命令趴久,那就是把CONFIG的名字改成一個空字符串:

rename-command CONFIG ""

但需要注意的是丸相,如果你使用AOF方式進行數(shù)據(jù)持久化,或者需要與從redis進行通信朋鞍,那么更改指令的名字可能會引起一些問題已添。

限制

我們可以設置redis同時可以與多少個客戶端進行連接。默認情況下為10000個客戶端滥酥。當你無法設置進程文件句柄限制時,redis會設置為當前的文件句柄限制值減去32畦幢,因為redis會為自身內(nèi)部處理邏輯留一些句柄出來坎吻。
如果達到了此限制,redis則會拒絕新的連接請求宇葱,并且向這些連接請求方發(fā)出“max number of clients reached”以作回應瘦真。

maxclients 10000

我們甚至可以設置redis可以使用的內(nèi)存量。一旦到達內(nèi)存使用上限黍瞧,redis將會試圖移除內(nèi)部數(shù)據(jù)诸尽,移除規(guī)則可以通過maxmemory-policy來指定。
如果redis無法根據(jù)移除規(guī)則來移除內(nèi)存中的數(shù)據(jù)印颤,或者我們設置了“不允許移除”您机,那么redis則會針對那些需要申請內(nèi)存的指令返回錯誤信息,比如SET、LPUSH等际看。但是對于無內(nèi)存申請的指令咸产,仍然會正常響應,比如GET等仲闽。

maxmemory <bytes>

需要注意的一點是脑溢,如果你的redis是主redis(說明你的redis有從redis),那么在設置內(nèi)存使用上限時赖欣,需要在系統(tǒng)中留出一些內(nèi)存空間給同步隊列緩存屑彻,只有在你設置的是“不移除”的情況下,才不用考慮這個因素顶吮。
對于內(nèi)存移除規(guī)則來說酱酬,redis提供了多達6種的移除規(guī)則。他們是:

volatile-lru:使用LRU算法移除過期集合中的key
allkeys-lru:使用LRU算法移除key
volatile-random:在過期集合中移除隨機的key
allkeys-random:移除隨機的key
volatile-ttl:移除那些TTL值最小的key云矫,即那些最近才過期的key膳沽。
noeviction:不進行移除。針對寫操作让禀,只是返回錯誤信息挑社。
```
無論使用上述哪一種移除規(guī)則,如果沒有合適的key可以移除的話巡揍,redis都會針對寫請求返回錯誤信息痛阻。
```
maxmemory-policy volatile-lru
```
LRU算法和最小TTL算法都并非是精確的算法,而是估算值腮敌。所以你可以設置樣本的大小阱当。假如redis默認會檢查三個key并選擇其中LRU的那個,那么你可以改變這個key樣本的數(shù)量糜工。
 
####追加模式
默認情況下弊添,redis會異步的將數(shù)據(jù)持久化到磁盤。這種模式在大部分應用程序中已被驗證是很有效的捌木,但是在一些問題發(fā)生時油坝,比如斷電,則這種機制可能會導致數(shù)分鐘的寫請求丟失刨裆。
如博文上半部分中介紹的澈圈,追加文件(Append Only File)是一種更好的保持數(shù)據(jù)一致性的方式。即使當服務器斷電時帆啃,也僅會有1秒鐘的寫請求丟失瞬女,當redis進程出現(xiàn)問題且操作系統(tǒng)運行正常時,甚至只會丟失一條寫請求努潘。
我們建議大家诽偷,AOF機制和RDB機制可以同時使用坤学,不會有任何沖突。
```
appendonly no
```
我們還可以設置aof文件的名稱:
```
appendfilename "appendonly.aof"
```
fsync()調(diào)用渤刃,用來告訴操作系統(tǒng)立即將緩存的指令寫入磁盤拥峦。一些操作系統(tǒng)會“立即”進行,而另外一些操作系統(tǒng)則會“盡快”進行卖子。
redis支持三種不同的模式:
*  no:不調(diào)用fsync()略号。而是讓操作系統(tǒng)自行決定sync的時間。這種模式下洋闽,redis的性能會最快玄柠。
*  always:在每次寫請求后都調(diào)用fsync()。這種模式下诫舅,redis會相對較慢羽利,但數(shù)據(jù)最安全。
*  everysec:每秒鐘調(diào)用一次fsync()刊懈。這是性能和安全的折衷这弧。
```
appendfsync everysec
```

當fsync方式設置為always或everysec時,如果后臺持久化進程需要執(zhí)行一個很大的磁盤IO操作虚汛,那么redis可能會在fsync()調(diào)用時卡住匾浪。目前尚未修復這個問題,這是因為即使我們在另一個新的線程中去執(zhí)行fsync()卷哩,也會阻塞住同步寫調(diào)用蛋辈。

為了緩解這個問題,我們可以使用下面的配置項将谊,這樣的話冷溶,當BGSAVE或BGWRITEAOF運行時,fsync()在主進程中的調(diào)用會被阻止尊浓。這意味著當另一路進程正在對AOF文件進行重構(gòu)時逞频,redis的持久化功能就失效了,就好像我們設置了“appendsync none”一樣眠砾。如果你的redis有時延問題虏劲,那么請將下面的選項設置為yes。否則請保持no褒颈,因為這是保證數(shù)據(jù)完整性的最安全的選擇。
```
no-appendfsync-on-rewrite no
```
我們允許redis自動重寫aof励堡。當aof增長到一定規(guī)模時谷丸,redis會隱式調(diào)用BGREWRITEAOF來重寫log文件,以縮減文件體積应结。
redis是這樣工作的:redis會記錄上次重寫時的aof大小刨疼。假如redis自啟動至今還沒有進行過重寫泉唁,那么啟動時aof文件的大小會被作為基準值。這個基準值會和當前的aof大小進行比較揩慕。如果當前aof大小超出所設置的增長比例亭畜,則會觸發(fā)重寫。另外迎卤,你還需要設置一個最小大小拴鸵,是為了防止在aof很小時就觸發(fā)重寫。
```
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
```
如果設置auto-aof-rewrite-percentage為0蜗搔,則會關(guān)閉此重寫功能劲藐。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市樟凄,隨后出現(xiàn)的幾起案子聘芜,更是在濱河造成了極大的恐慌,老刑警劉巖缝龄,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汰现,死亡現(xiàn)場離奇詭異,居然都是意外死亡叔壤,警方通過查閱死者的電腦和手機瞎饲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來百新,“玉大人企软,你說我怎么就攤上這事》雇” “怎么了仗哨?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铅辞。 經(jīng)常有香客問我厌漂,道長,這世上最難降的妖魔是什么斟珊? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任苇倡,我火速辦了婚禮,結(jié)果婚禮上囤踩,老公的妹妹穿的比我還像新娘旨椒。我一直安慰自己,他們只是感情好堵漱,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布综慎。 她就那樣靜靜地躺著,像睡著了一般勤庐。 火紅的嫁衣襯著肌膚如雪示惊。 梳的紋絲不亂的頭發(fā)上好港,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音米罚,去河邊找鬼钧汹。 笑死,一個胖子當著我的面吹牛录择,可吹牛的內(nèi)容都是我干的拔莱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼糊肠,長吁一口氣:“原來是場噩夢啊……” “哼辨宠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起货裹,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嗤形,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弧圆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赋兵,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年搔预,在試婚紗的時候發(fā)現(xiàn)自己被綠了霹期。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拯田,死狀恐怖历造,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情船庇,我是刑警寧澤吭产,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站鸭轮,受9級特大地震影響臣淤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窃爷,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一邑蒋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧按厘,春花似錦医吊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至造虏,卻和暖如春御吞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背漓藕。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工陶珠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人享钞。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓揍诽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親栗竖。 傳聞我的和親對象是個殘疾皇子暑脆,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容