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