#
?Redis示例配置文件
#
?注意單位問題:當需要設置內(nèi)存大小的時候,可以使用類似1k、5GB、4M這樣的常見格式:
#
#
?1k?=>?1000?bytes
#
?1kb?=>?1024?bytes
#
?1m?=>?1000000?bytes
#
?1mb?=>?1024*1024?bytes
#
?1g?=>?1000000000?bytes
#
?1gb?=>?1024*1024*1024?bytes
#
#
?單位是大小寫不敏感的,所以1GB?1Gb?1gB的寫法都是完全一樣的。
#
?Redis默認是不作為守護進程來運行的。你可以把這個設置為"yes"讓它作為守護進程來運行。
#
?注意,當作為守護進程的時候,Redis會把進程ID寫到?/var/run/redis.pid
daemonize?no
#
?當以守護進程方式運行的時候,Redis會把進程ID默認寫到?/var/run/redis.pid。你可以在這里修改路徑。
pidfile?
/
var
/
run
/
redis.pid
#
?接受連接的特定端口,默認是6379。
#
?如果端口設置為0,Redis就不會監(jiān)聽TCP套接字。
port?
6379
#
?如果你想的話,你可以綁定單一接口;如果這里沒單獨設置,那么所有接口的連接都會被監(jiān)聽。
#
#
?bind?127.0.0.1
#
?指定用來監(jiān)聽連接的unxi套接字的路徑。這個沒有默認值,所以如果你不指定的話,Redis就不會通過unix套接字來監(jiān)聽。
#
#
?unixsocket?/tmp/redis.sock
#
?unixsocketperm?755
#
一個客戶端空閑多少秒后關閉連接。(0代表禁用,永不關閉)
timeout?0
#
?設置服務器調(diào)試等級。
#
?可能值:
#
?debug?(很多信息,對開發(fā)/測試有用)
#
?verbose?(很多精簡的有用信息,但是不像debug等級那么多)
#
?notice?(適量的信息,基本上是你生產(chǎn)環(huán)境中需要的程度)
#
?warning?(只有很重要/嚴重的信息會記錄下來)
loglevel?verbose
#
?指明日志文件名。也可以使用"stdout"來強制讓Redis把日志信息寫到標準輸出上。
#
?注意:如果Redis以守護進程方式運行,而你設置日志顯示到標準輸出的話,那么日志會發(fā)送到?/dev/null
logfile?stdout
#
?要使用系統(tǒng)日志記錄器很簡單,只要設置?"syslog-enabled"?為?"yes"?就可以了。
#
?然后根據(jù)需要設置其他一些syslog參數(shù)就可以了。
#
?syslog-enabled?no
#
?指明syslog身份
#
?syslog-ident?redis
#
?指明syslog的設備。必須是一個用戶或者是?LOCAL0?~?LOCAL7?之一。
#
?syslog-facility?local0
#
?設置數(shù)據(jù)庫個數(shù)。默認數(shù)據(jù)庫是?DB?0,你可以通過SELECT?<dbid>?WHERE?dbid(0~'databases'?-?1)來為每個連接使用不同的數(shù)據(jù)庫。
databases?
16
#
###############################?快照?#################################
#
#
?把數(shù)據(jù)庫存到磁盤上:
#
#
???save?<seconds>?<changes>
#
???
#
???會在指定秒數(shù)和數(shù)據(jù)變化次數(shù)之后把數(shù)據(jù)庫寫到磁盤上。
#
#
???下面的例子將會進行把數(shù)據(jù)寫入磁盤的操作:
#
???900秒(15分鐘)之后,且至少1次變更
#
???300秒(5分鐘)之后,且至少10次變更
#
???60秒之后,且至少10000次變更
#
#
???注意:你要想不寫磁盤的話就把所有?"save"?設置注釋掉就行了。
save?
900
?
1
save?
300
?
10
save?
60
?
10000
#
?當導出到?.rdb?數(shù)據(jù)庫時是否用LZF壓縮字符串對象。
#
?默認設置為?"yes",所以幾乎總是生效的。
#
?如果你想節(jié)省CPU的話你可以把這個設置為?"no",但是如果你有可壓縮的key的話,那數(shù)據(jù)文件就會更大了。
rdbcompression?yes
#
?數(shù)據(jù)庫的文件名
dbfilename?dump.rdb
#
?工作目錄
#
#
?數(shù)據(jù)庫會寫到這個目錄下,文件名就是上面的?"dbfilename"?的值。
#
?
#
?累加文件也放這里。
#
?
#
?注意你這里指定的必須是目錄,不是文件名。
dir?.
/
#
################################?同步?#################################
#
#
?主從同步。通過?slaveof?配置來實現(xiàn)Redis實例的備份。
#
?注意,這里是本地從遠端復制數(shù)據(jù)。也就是說,本地可以有不同的數(shù)據(jù)庫文件、綁定不同的IP、監(jiān)聽不同的端口。
#
#
?slaveof?<masterip>?<masterport>
#
?如果master設置了密碼(通過下面的?"requirepass"?選項來配置),那么slave在開始同步之前必須進行身份驗證,否則它的同步請求會被拒絕。
#
#
?masterauth?<master-password>
#
?當一個slave失去和master的連接,或者同步正在進行中,slave的行為有兩種可能:
#
#
?1)?如果?slave-serve-stale-data?設置為?"yes"?(默認值),slave會繼續(xù)響應客戶端請求,可能是正常數(shù)據(jù),也可能是還沒獲得值的空數(shù)據(jù)。
#
?2)?如果?slave-serve-stale-data?設置為?"no",slave會回復"正在從master同步(SYNC?with?master?in?progress)"來處理各種請求,除了?INFO?和?SLAVEOF?命令。
#
slave
-
serve
-
stale
-
data?yes
#
?slave根據(jù)指定的時間間隔向服務器發(fā)送ping請求。
#
?時間間隔可以通過?repl_ping_slave_period?來設置。
#
?默認10秒。
#
#
?repl-ping-slave-period?10
#
?下面的選項設置了大塊數(shù)據(jù)I/O、向master請求數(shù)據(jù)和ping響應的過期時間。
#
?默認值60秒。
#
#
?一個很重要的事情是:確保這個值比?repl-ping-slave-period?大,否則master和slave之間的傳輸過期時間比預想的要短。
#
#
?repl-timeout?60
#
#################################?安全?###################################
#
?要求客戶端在處理任何命令時都要驗證身份和密碼。
#
?這在你信不過來訪者時很有用。
#
#
?為了向后兼容的話,這段應該注釋掉。而且大多數(shù)人不需要身份驗證(例如:它們運行在自己的服務器上。)
#
?
#
?警告:因為Redis太快了,所以居心不良的人可以每秒嘗試150k的密碼來試圖破解密碼。
#
?這意味著你需要一個高強度的密碼,否則破解太容易了。
#
#
?requirepass?foobared
#
?命令重命名
#
#
?在共享環(huán)境下,可以為危險命令改變名字。比如,你可以為?CONFIG?改個其他不太容易猜到的名字,這樣你自己仍然可以使用,而別人卻沒法做壞事了。
#
#
?例如:
#
#
?rename-command?CONFIG?b840fc02d524045429941cc15f59e41cb7be6c52
#
#
?甚至也可以通過給命令賦值一個空字符串來完全禁用這條命令:
#
#
?rename-command?CONFIG?""
#
##################################?限制?####################################
#
#
?設置最多同時連接客戶端數(shù)量。
#
?默認沒有限制,這個關系到Redis進程能夠打開的文件描述符數(shù)量。
#
?特殊值"0"表示沒有限制。
#
?一旦達到這個限制,Redis會關閉所有新連接并發(fā)送錯誤"達到最大用戶數(shù)上限(max?number?of?clients?reached)"
#
#
?maxclients?128
#
?不要用比設置的上限更多的內(nèi)存。一旦內(nèi)存使用達到上限,Redis會根據(jù)選定的回收策略(參見:maxmemmory-policy)刪除key。
#
#
?如果因為刪除策略問題Redis無法刪除key,或者策略設置為?"noeviction",Redis會回復需要更多內(nèi)存的錯誤信息給命令。
#
?例如,SET,LPUSH等等。但是會繼續(xù)合理響應只讀命令,比如:GET。
#
#
?在使用Redis作為LRU緩存,或者為實例設置了硬性內(nèi)存限制的時候(使用?"noeviction"?策略)的時候,這個選項還是滿有用的。
#
#
?警告:當一堆slave連上達到內(nèi)存上限的實例的時候,響應slave需要的輸出緩存所需內(nèi)存不計算在使用內(nèi)存當中。
#
?這樣當請求一個刪除掉的key的時候就不會觸發(fā)網(wǎng)絡問題/重新同步的事件,然后slave就會收到一堆刪除指令,直到數(shù)據(jù)庫空了為止。
#
#
?簡而言之,如果你有slave連上一個master的話,那建議你把master內(nèi)存限制設小點兒,確保有足夠的系統(tǒng)內(nèi)存用作輸出緩存。
#
?(如果策略設置為"noeviction"的話就不無所謂了)
#
#
?maxmemory?<bytes>
#
?內(nèi)存策略:如果達到內(nèi)存限制了,Redis如何刪除key。你可以在下面五個策略里面選:
#
?
#
?volatile-lru?->?根據(jù)LRU算法生成的過期時間來刪除。
#
?allkeys-lru?->?根據(jù)LRU算法刪除任何key。
#
?volatile-random?->?根據(jù)過期設置來隨機刪除key。
#
?allkeys->random?->?無差別隨機刪。
#
?volatile-ttl?->?根據(jù)最近過期時間來刪除(輔以TTL)
#
?noeviction?->?誰也不刪,直接在寫操作時返回錯誤。
#
?
#
?注意:對所有策略來說,如果Redis找不到合適的可以刪除的key都會在寫操作時返回一個錯誤。
#
#
???????這里涉及的命令:set?setnx?setex?append
#
???????incr?decr?rpush?lpush?rpushx?lpushx?linsert?lset?rpoplpush?sadd
#
???????sinter?sinterstore?sunion?sunionstore?sdiff?sdiffstore?zadd?zincrby
#
???????zunionstore?zinterstore?hset?hsetnx?hmset?hincrby?incrby?decrby
#
???????getset?mset?msetnx?exec?sort
#
#
?默認值如下:
#
#
?maxmemory-policy?volatile-lru
#
?LRU和最小TTL算法的實現(xiàn)都不是很精確,但是很接近(為了省內(nèi)存),所以你可以用樣例做測試。
#
?例如:默認Redis會檢查三個key然后取最舊的那個,你可以通過下面的配置項來設置樣本的個數(shù)。
#
#
?maxmemory-samples?3
#
#############################?純累加模式?###############################
#
?默認情況下,Redis是異步的把數(shù)據(jù)導出到磁盤上。這種情況下,當Redis掛掉的時候,最新的數(shù)據(jù)就丟了。
#
?如果不希望丟掉任何一條數(shù)據(jù)的話就該用純累加模式:一旦開啟這個模式,Redis會把每次寫入的數(shù)據(jù)在接收后都寫入?appendonly.aof?文件。
#
?每次啟動時Redis都會把這個文件的數(shù)據(jù)讀入內(nèi)存里。
#
#
?注意,異步導出的數(shù)據(jù)庫文件和純累加文件可以并存(你得把上面所有"save"設置都注釋掉,關掉導出機制)。
#
?如果純累加模式開啟了,那么Redis會在啟動時載入日志文件而忽略導出的?dump.rdb?文件。
#
#
?重要:查看?BGREWRITEAOF?來了解當累加日志文件太大了之后,怎么在后臺重新處理這個日志文件。
appendonly?no
#
?純累加文件名字(默認:"appendonly.aof")
#
?appendfilename?appendonly.aof
#
?fsync()?請求操作系統(tǒng)馬上把數(shù)據(jù)寫到磁盤上,不要再等了。
#
?有些操作系統(tǒng)會真的把數(shù)據(jù)馬上刷到磁盤上;有些則要磨蹭一下,但是會盡快去做。
#
#
?Redis支持三種不同的模式:
#
#
?no:不要立刻刷,只有在操作系統(tǒng)需要刷的時候再刷。比較快。
#
?always:每次寫操作都立刻寫入到aof文件。慢,但是最安全。
#
?everysec:每秒寫一次。折衷方案。
#
#
?默認的?"everysec"?通常來說能在速度和數(shù)據(jù)安全性之間取得比較好的平衡。
#
?如果你真的理解了這個意味著什么,那么設置"no"可以獲得更好的性能表現(xiàn)(如果丟數(shù)據(jù)的話,則只能拿到一個不是很新的快照);
#
?或者相反的,你選擇?"always"?來犧牲速度確保數(shù)據(jù)安全、完整。
#
#
?如果拿不準,就用?"everysec"
#
?appendfsync?always
appendfsync?everysec
#
?appendfsync?no
#
?如果AOF的同步策略設置成?"always"?或者?"everysec",那么后臺的存儲進程(后臺存儲或?qū)懭階OF日志)會產(chǎn)生很多磁盤I/O開銷。
#
?某些Linux的配置下會使Redis因為?fsync()?而阻塞很久。
#
?注意,目前對這個情況還沒有完美修正,甚至不同線程的?fsync()?會阻塞我們的?write(2)?請求。
#
#
?為了緩解這個問題,可以用下面這個選項。它可以在?BGSAVE?或?BGREWRITEAOF?處理時阻止?fsync()。
#
?
#
?這就意味著如果有子進程在進行保存操作,那么Redis就處于"不可同步"的狀態(tài)。
#
?這實際上是說,在最差的情況下可能會丟掉30秒鐘的日志數(shù)據(jù)。(默認Linux設定)
#
?
#
?如果你有延遲的問題那就把這個設為?"yes",否則就保持?"no",這是保存持久數(shù)據(jù)的最安全的方式。
no
-
appendfsync
-
on
-
rewrite?no
#
?自動重寫AOF文件
#
#
?如果AOF日志文件大到指定百分比,Redis能夠通過?BGREWRITEAOF?自動重寫AOF日志文件。
#
?
#
?工作原理:Redis記住上次重寫時AOF日志的大小(或者重啟后沒有寫操作的話,那就直接用此時的AOF文件),
#
???????????基準尺寸和當前尺寸做比較。如果當前尺寸超過指定比例,就會觸發(fā)重寫操作。
#
#
?你還需要指定被重寫日志的最小尺寸,這樣避免了達到約定百分比但尺寸仍然很小的情況還要重寫。
#
#
?指定百分比為0會禁用AOF自動重寫特性。
auto
-
aof
-
rewrite
-
percentage?
100
auto
-
aof
-
rewrite
-
min
-
size?64mb
#
#################################?慢查詢?nèi)罩?###################################
#
?Redis慢查詢?nèi)罩究梢杂涗洺^指定時間的查詢。運行時間不包括各種I/O時間。
#
?例如:連接客戶端,發(fā)送響應數(shù)據(jù)等。只計算命令運行的實際時間(這是唯一一種命令運行線程阻塞而無法同時為其他請求服務的場景)
#
?
#
?你可以為慢查詢?nèi)罩九渲脙蓚€參數(shù):一個是超標時間,單位為微妙,記錄超過個時間的命令。
#
?另一個是慢查詢?nèi)罩鹃L度。當一個新的命令被寫進日志的時候,最老的那個記錄會被刪掉。
#
#
?下面的時間單位是微秒,所以1000000就是1秒。注意,負數(shù)時間會禁用慢查詢?nèi)罩荆?則會強制記錄所有命令。
slowlog
-
log
-
slower
-
than?
10000
#
?這個長度沒有限制。只要有足夠的內(nèi)存就行。你可以通過?SLOWLOG?RESET?來釋放內(nèi)存。(譯者注:日志居然是在內(nèi)存里的Orz)
slowlog
-
max
-
len?
128
#
###############################?虛擬內(nèi)存?###############################
#
##?警告!虛擬內(nèi)存在Redis?2.4是反對的。
#
##?非常不鼓勵使用虛擬內(nèi)存!!
#
?虛擬內(nèi)存可以使Redis在內(nèi)存不夠的情況下仍然可以將所有數(shù)據(jù)序列保存在內(nèi)存里。
#
?為了做到這一點,高頻key會調(diào)到內(nèi)存里,而低頻key會轉(zhuǎn)到交換文件里,就像操作系統(tǒng)使用內(nèi)存頁一樣。
#
#
?要使用虛擬內(nèi)存,只要把?"vm-enabled"?設置為?"yes",并根據(jù)需要設置下面三個虛擬內(nèi)存參數(shù)就可以了。
vm
-
enabled?no
#
?vm-enabled?yes
#
?這是交換文件的路徑。估計你猜到了,交換文件不能在多個Redis實例之間共享,所以確保每個Redis實例使用一個獨立交換文件。
#
#
?最好的保存交換文件(被隨機訪問)的介質(zhì)是固態(tài)硬盤(SSD)。
#
#
?***?警告?***?如果你使用共享主機,那么默認的交換文件放到?/tmp?下是不安全的。
#
?創(chuàng)建一個Redis用戶可寫的目錄,并配置Redis在這里創(chuàng)建交換文件。
vm
-
swap
-
file?
/
tmp
/
redis.swap
#
?"vm-max-memory"?配置虛擬內(nèi)存可用的最大內(nèi)存容量。
#
?如果交換文件還有空間的話,所有超標部分都會放到交換文件里。
#
#
?"vm-max-memory"?設置為0表示系統(tǒng)會用掉所有可用內(nèi)存。
#
?這默認值不咋地,只是把你能用的內(nèi)存全用掉了,留點余量會更好。
#
?例如,設置為剩余內(nèi)存的60%-80%。
vm
-
max
-
memory?0
#
?Redis交換文件是分成多個數(shù)據(jù)頁的。
#
?一個可存儲對象可以被保存在多個連續(xù)頁里,但是一個數(shù)據(jù)頁無法被多個對象共享。
#
?所以,如果你的數(shù)據(jù)頁太大,那么小對象就會浪費掉很多空間。
#
?如果數(shù)據(jù)頁太小,那用于存儲的交換空間就會更少(假定你設置相同的數(shù)據(jù)頁數(shù)量)
#
#
?如果你使用很多小對象,建議分頁尺寸為64或32個字節(jié)。
#
?如果你使用很多大對象,那就用大一些的尺寸。
#
?如果不確定,那就用默認值?:)
vm
-
page
-
size?
32
#
?交換文件里數(shù)據(jù)頁總數(shù)。
#
?根據(jù)內(nèi)存中分頁表(已用/未用的數(shù)據(jù)頁分布情況),磁盤上每8個數(shù)據(jù)頁會消耗內(nèi)存里1個字節(jié)。
#
#
?交換區(qū)容量?=?vm-page-size?*?vm-pages
#
#
?根據(jù)默認的32字節(jié)的數(shù)據(jù)頁尺寸和134217728的數(shù)據(jù)頁數(shù)來算,Redis的數(shù)據(jù)頁文件會占4GB,而內(nèi)存里的分頁表會消耗16MB內(nèi)存。
#
#
?為你的應驗程序設置最小且夠用的數(shù)字比較好,下面這個默認值在大多數(shù)情況下都是偏大的。
vm
-
pages?
134217728
#
?同時可運行的虛擬內(nèi)存I/O線程數(shù)。
#
?這些線程可以完成從交換文件進行數(shù)據(jù)讀寫的操作,也可以處理數(shù)據(jù)在內(nèi)存與磁盤間的交互和編碼/解碼處理。
#
?多一些線程可以一定程度上提高處理效率,雖然I/O操作本身依賴于物理設備的限制,不會因為更多的線程而提高單次讀寫操作的效率。
#
#
?特殊值0會關閉線程級I/O,并會開啟阻塞虛擬內(nèi)存機制。
vm
-
max
-
threads?
4
#
##############################?高級配置?###############################
#
?當有大量數(shù)據(jù)時,適合用哈希編碼(需要更多的內(nèi)存),元素數(shù)量上限不能超過給定限制。
#
?你可以通過下面的選項來設定這些限制:
hash
-
max
-
zipmap
-
entries?
512
hash
-
max
-
zipmap
-
value?
64
#
?與哈希相類似,數(shù)據(jù)元素較少的情況下,可以用另一種方式來編碼從而節(jié)省大量空間。
#
?這種方式只有在符合下面限制的時候才可以用:
list
-
max
-
ziplist
-
entries?
512
list
-
max
-
ziplist
-
value?
64
#
?還有這樣一種特殊編碼的情況:數(shù)據(jù)全是64位無符號整型數(shù)字構(gòu)成的字符串。
#
?下面這個配置項就是用來限制這種情況下使用這種編碼的最大上限的。
set
-
max
-
intset
-
entries?
512
#
?與第一、第二種情況相似,有序序列也可以用一種特別的編碼方式來處理,可節(jié)省大量空間。
#
?這種編碼只適合長度和元素都符合下面限制的有序序列:
zset
-
max
-
ziplist
-
entries?
128
zset
-
max
-
ziplist
-
value?
64
#
?哈希刷新,每100個CPU毫秒會拿出1個毫秒來刷新Redis的主哈希表(頂級鍵值映射表)。
#
?redis所用的哈希表實現(xiàn)(見dict.c)采用延遲哈希刷新機制:你對一個哈希表操作越多,哈希刷新操作就越頻繁;
#
?反之,如果服務器非常不活躍那么也就是用點內(nèi)存保存哈希表而已。
#
?
#
?默認是每秒鐘進行10次哈希表刷新,用來刷新字典,然后盡快釋放內(nèi)存。
#
#
?建議:
#
?如果你對延遲比較在意的話就用?"activerehashing?no",每個請求延遲2毫秒不太好嘛。
#
?如果你不太在意延遲而希望盡快釋放內(nèi)存的話就設置?"activerehashing?yes"。
activerehashing?yes
#
#################################?包含?###################################
#
?包含一個或多個其他配置文件。
#
?這在你有標準配置模板但是每個redis服務器又需要個性設置的時候很有用。
#
?包含文件特性允許你引人其他配置文件,所以好好利用吧。
#
#
?include?/path/to/local.conf
#
?include?/path/to/other.conf