本文摘抄自大鵬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)閉此重寫功能劲藐。