# Redis 配置案例#關(guān)于單位,當(dāng)你需要指定內(nèi)存的大小時(shí),可以使用如下的單位來指定#(譯者注,為什么會(huì)存在1000為單位,我認(rèn)為是考慮到硬盤的容量單位是以1000來進(jìn)行計(jì)算而非程序中的1024)#(因此 使用 1000為單位可以進(jìn)一步地精確估算出所需的實(shí)際硬盤容量)## 1k => 1000 bytes# 1kb => 1024 bytes# 1m => 1000000 bytes# 1mb => 1024*1024 bytes# 1g => 1000000000 bytes# 1gb => 1024*1024*1024 bytes## 單位是大小寫不敏感的 所以 1GB 1Gb 1gB 是一樣的################################## INCLUDES #####################################如果你擁有一個(gè)標(biāo)準(zhǔn)的配置模板,并且希望在該模板之上坐一些個(gè)性化的修改,你可以#使用include 指令來引入其他的配置文件。##注意:"include" 不會(huì)被 admin 或者 Redis Sentinel "CONFIG REWRITE" 命令覆蓋。#(譯者注:"CONFIG REWRITE" 是redis 2.8 引入的新命令,用來重寫配置)#由于redis以最終的配置作為實(shí)際配置,因此我們希望你將include命令放置在配置文件的最前面#以防配置被覆蓋#如果你打算使用另外的 conf文件來覆蓋當(dāng)前文件的配置,那么最好將include指令放置到該文件的末尾## 即最后生效原則,最后被解析的配置將作為最后的配置## include /path/to/local.conf# include /path/to/other.conf################################ GENERAL ###################################### redis 默認(rèn)不是以一個(gè)守護(hù)進(jìn)程來運(yùn)行的,使用 yes,可以讓redis作為守護(hù)進(jìn)程來運(yùn)行# 注意:當(dāng)redis作為守護(hù)進(jìn)程的時(shí)候 /var/run/redis.pid 作為 pid 文件#daemonize no# 當(dāng)redis以守護(hù)進(jìn)程運(yùn)行時(shí),將會(huì)使用/var/run/redis.pid作為 pid文件的位置,也就是#上一個(gè)指令所說的默認(rèn),你可以根據(jù)自己的需要修改它#pidfile /var/run/redis.pid# 在指定的端口上進(jìn)行監(jiān)聽,默認(rèn)是 6379# 如果端口設(shè)置為0,那么redis就不會(huì)在TCP socket上進(jìn)行監(jiān)聽# (譯者注:不在tcp socket上進(jìn)行監(jiān)聽,不代表沒法連接,只是無法使用網(wǎng)絡(luò)連接而已)port 6379# TCP listen() backlog值#(譯者注:backlog值是指目前最大的連接隊(duì)列,因?yàn)門CP連接是三次握手)#(沒有完成三次握手和尚未被accept的connect都會(huì)處于連接隊(duì)列中,但是backlog的實(shí)際值與操作系統(tǒng)相關(guān))#(并非設(shè)置多少就是多少,只能說調(diào)整得大一些可以在同一時(shí)間應(yīng)對(duì)更多的連接請(qǐng)求)##在一個(gè)并發(fā)量高的環(huán)境中,你需要指定一個(gè)比較大的backlog值來避免慢連接(由于網(wǎng)絡(luò)原因握手速度慢)的情況#注意,linux內(nèi)核會(huì)默認(rèn) 使用/proc/sys/net/core/somaxconn 的值來削減 backlog的實(shí)際值,#因此你需要確保提升 somaxconn 和 tcp_max_syn_backlog 這兩個(gè)值來確保此處的backlog生效#(譯者注:只有 當(dāng)每一個(gè)請(qǐng)求都重新發(fā)起一個(gè)連接的時(shí)候,backlog值的增大才能影響到并發(fā)量)#(在tcp穩(wěn)定連接的時(shí)候,或連接復(fù)用(連接池的使用),backlog值對(duì)并發(fā)沒有任何影響)#tcp-backlog 511##默認(rèn)情況下redis會(huì)在所有的可用網(wǎng)絡(luò)接口中進(jìn)行監(jiān)聽,如果你想讓redis在指定的網(wǎng)絡(luò)接口中#監(jiān)聽,那么可以使用bind 命令來指定redis的監(jiān)聽接口#(譯者科普:網(wǎng)絡(luò)的中的服務(wù)是通過 ip+進(jìn)程 來進(jìn)行區(qū)分的,當(dāng)一個(gè)服務(wù)器擁有兩個(gè)ip時(shí) )#(自然就在網(wǎng)絡(luò)中擁有兩個(gè)人身份,如 內(nèi)網(wǎng),外網(wǎng),當(dāng)你只想讓redis在一個(gè)網(wǎng)絡(luò)上監(jiān)聽時(shí),就可以使用如下的配置)# (127.0.0.1 就是指定只能本機(jī)進(jìn)行網(wǎng)絡(luò)訪問)# 例如:## bind 192.168.1.100 10.0.0.1# bind 127.0.0.1##指定unix sock的路徑來進(jìn)行連接監(jiān)聽,默認(rèn)是不指定,因此redis不會(huì)在unix socket上進(jìn)行監(jiān)聽#(譯者注:這個(gè)是用來進(jìn)行進(jìn)程間通信的時(shí)候指定的)# unixsocket /tmp/redis.sock# unixsocketperm 755# 關(guān)閉掉空閑N秒的連接(0則是不處理空閑連接)timeout 0# TCP keepalive.###如果該值不為0,將使用 SO_KEEPALIVE 這一默認(rèn)的做法來向客戶端連接發(fā)送TCP ACKs ##這樣的好處有以下兩個(gè)原因# 1)檢測(cè)已經(jīng)死亡的對(duì)端(譯者注:TCP的關(guān)閉會(huì)存在無法完成4次握手的情況,如斷電,斷網(wǎng),數(shù)據(jù)丟失等等)# 2)保持連接在網(wǎng)絡(luò)環(huán)境中的存活##tcp-keepalive 0# 指定日志的記錄級(jí)別的# 可以是如下的幾個(gè)值之一# debug (盡可能多的日志信息,用于開發(fā)和測(cè)試之中)# verbose (少但是有用的信息, 沒有debug級(jí)別那么混亂)# notice (適量的信息,用于生產(chǎn)環(huán)境)# warning (只有非常重要和關(guān)鍵的信息會(huì)被記錄)loglevel notice# 指定日志文件的位置. 為空時(shí)將輸出到標(biāo)準(zhǔn)輸出設(shè)備# 如果你在demo模式下使用標(biāo)準(zhǔn)輸出的日志,日志將會(huì)輸出到 /dev/nulllogfile ""# 當(dāng)設(shè)置 'syslog-enabled'為 yes時(shí), 允許記錄日志到系統(tǒng)日志中。# 以及你可以使用更多的日志參數(shù)來滿足你的要求# syslog-enabled no# 指定在系統(tǒng)日志中的身份# syslog-ident redis# 指定系統(tǒng)日志的能力. 必須是 LOCAL0 到 LOCAL7 之間(閉區(qū)間).# syslog-facility local0#設(shè)置數(shù)據(jù)庫的編號(hào). 默認(rèn)的數(shù)據(jù)庫是DB 0#使得你可以在每一個(gè)連接的基礎(chǔ)之上使用 SELECT <dbid> 來指定另外的數(shù)據(jù)庫,但是這個(gè)值必須在 0到 'database'-1之間databases 16################################ SNAPSHOTTING ################################## 保存 DB 到硬盤:## save <seconds> <changes>## 將會(huì)在<seconds> 和 <changes>兩個(gè)值同時(shí)滿足時(shí),將DB數(shù)據(jù)保存到硬盤中# 其中<seconds> 每多少秒,<changes>是改變的key的數(shù)量## 在以下的例子中,將會(huì)存在如下的行為# 當(dāng)存在最少一個(gè)key 變更時(shí),900秒(15分鐘)后保存到硬盤# 當(dāng)存在最少10個(gè)key變更時(shí),300秒后保存到硬盤# 當(dāng)存在最少1000個(gè)key變更時(shí),60秒后保存到硬盤## 提示: 你可以禁用如下的所有 save 行## 你可以刪除所有的save然后設(shè)置成如下這樣的情況#### save ""save 900 1save 300 10save 60 10000## 作為默認(rèn),redis會(huì)在RDB快照開啟和最近后臺(tái)保存失敗的時(shí)候停止接受寫入(最少一個(gè)保存點(diǎn))#這會(huì)使得用戶察覺(通常比較困難)到數(shù)據(jù)不會(huì)保持在硬盤上的正確性,否則很難發(fā)現(xiàn)#這些災(zāi)難會(huì)發(fā)生## 如果后臺(tái)保存程序再次開始工作,reidis會(huì)再次自動(dòng)允許寫入##然而如果對(duì)redis服務(wù)器設(shè)置了合理持續(xù)的監(jiān)控,那么你可以關(guān)閉掉這個(gè)選項(xiàng)。#這會(huì)導(dǎo)致redis將繼續(xù)進(jìn)行工作,無論硬盤,權(quán)限或者其他的是否有問題##stop-writes-on-bgsave-error yes# 是否在dump到 rdb 數(shù)據(jù)庫的時(shí)候使用LZF來壓縮字符串# 默認(rèn)是 yes,因?yàn)檫@是一個(gè)優(yōu)良的做法## 如果你不想耗費(fèi)你的CPU處理能力,你可以設(shè)置為 no,但是這會(huì)導(dǎo)致你的數(shù)據(jù)會(huì)很大rdbcompression yes# 從RDB的版本5開始,CRC64校驗(yàn)值會(huì)寫入到文件的末尾#這會(huì)使得格式化過程中,使得文件的完整性更有保障,但是這會(huì)在保存和加載的時(shí)候損失不少的性能(大概在10%)#你可以關(guān)閉這個(gè)功能來獲得最高的性能##RDB文件會(huì)在校驗(yàn)功能關(guān)閉的時(shí)候,使用0來作為校驗(yàn)值,這將告訴加載代碼來跳過校驗(yàn)步驟rdbchecksum yes# DB的文件名稱dbfilename dump.rdb# 工作目錄.## DB將會(huì)使用上述 'dbfilename'指定的文件名寫入到該目錄中# # 追加的文件也會(huì)在該目錄中創(chuàng)建# # 注意,你應(yīng)該在這里輸入的是一個(gè)目錄而不是一個(gè)文件名dir ./################################# REPLICATION ################################## 主從復(fù)制。使用 slaveof 命令來 指導(dǎo)redis從另一個(gè)redis服務(wù)的拷貝中來創(chuàng)建一個(gè)實(shí)例##注意:這個(gè)配置是主從結(jié)構(gòu)的從(主從結(jié)構(gòu)的從,怎么那么拗口呢)redis的本地配置##如下例子,這個(gè)配置指導(dǎo) slave (從redis) 通過另一個(gè)redis的實(shí)例的ip和端口號(hào)來獲取DB數(shù)據(jù)#### slaveof <masterip> <masterport>## 如果主服務(wù)器開啟了密碼保護(hù)(使用下面的"requirepass"配置)# 這個(gè)配置就是告訴從服務(wù)在發(fā)起向主服務(wù)器的異步復(fù)制的請(qǐng)求之前使用如下的密碼進(jìn)行認(rèn)證,#否則主服務(wù)器會(huì)拒絕這個(gè)請(qǐng)求#### masterauth <master-password>## 如果從服務(wù)器失去了和主服務(wù)器之間的連接,或者當(dāng)復(fù)制仍然處于處理狀態(tài)的時(shí)候# 從服務(wù)器做出如下的兩個(gè)行為## 1)如果 slave-serve-stale-data 被設(shè)置為 yes(默認(rèn)值),從服務(wù)器將會(huì)持續(xù)# 回復(fù)來自客戶端的請(qǐng)求,可能會(huì)回復(fù)已經(jīng)過期的數(shù)據(jù),或者返回空的數(shù)據(jù),當(dāng)從服務(wù)器第一次異步請(qǐng)求數(shù)據(jù)時(shí)。## 2)如果 slave-serve-stale-data 被設(shè)置為 no ,從服務(wù)器就會(huì)返回"SYNC with master in progress"# 這個(gè)錯(cuò)誤,來應(yīng)答所有命令除了 INFO 和 SLAVEOF#slave-serve-stale-data yes### 你可以配置一個(gè)從服務(wù)器的實(shí)例是否接受寫請(qǐng)求,# 從服務(wù)器在存儲(chǔ)一些短暫的數(shù)據(jù)的的時(shí)候,接收寫請(qǐng)求是一件非常正確的事情# (因?yàn)閿?shù)據(jù)在向主服務(wù)器同步之后非常容易擦除)但是會(huì)因?yàn)榕渲貌徽_而導(dǎo)致一些問題## 從redis 2.6開始默認(rèn)從服務(wù)器是只讀的服務(wù)器####提示:只讀的從服務(wù)器并不是設(shè)計(jì)用來公開給不受信任的互聯(lián)網(wǎng)客戶端的,它#僅僅是一個(gè)用來防止對(duì)實(shí)例進(jìn)行誤操作的保護(hù)層。只讀從服務(wù)器默認(rèn)用來輸出管理命令#例如 CONFIG, DEBUG 和其他。如果你想限制它的規(guī)模,你可以使用'rename-command'來#提高它的安全性,使得她作為一個(gè)影子來執(zhí)行管理或者危險(xiǎn)的命令##slave-read-only yes# 從服務(wù)器在預(yù)設(shè)的間隔中發(fā)送送一個(gè)ping到目標(biāo)服務(wù)器。你可以通過修改repl-ping-slave-period#的值來修改它,默認(rèn)是10秒鐘### repl-ping-slave-period 10# repl-timeout設(shè)置了以下的復(fù)制超時(shí)值:## 1) 在從服務(wù)器中,使用同步IO進(jìn)行大規(guī)模傳輸.# 2) 在從服務(wù)器中,主服務(wù)器的超時(shí)(ping,數(shù)據(jù))# 3) 在主服務(wù)器中. 從服務(wù)器的超時(shí)(對(duì)pings的響應(yīng))### 確保這個(gè)值大于 指定的repl-ping-slave-period 值,否則當(dāng)主從之間是低流量時(shí)# 會(huì)檢測(cè)到超時(shí)的情況## repl-timeout 60# 在從服務(wù)器同步之后是否關(guān)閉TCP_NODELAY?### 如果你選擇 "yes",redis將會(huì)使用一個(gè)很小的TCP包和很小的帶寬來向從服務(wù)器發(fā)送數(shù)據(jù)。# 如果使用默認(rèn)的設(shè)置這會(huì)增加數(shù)據(jù)復(fù)制到從服務(wù)器之間的延遲。如果使用默認(rèn)配置的linux內(nèi)核# 這個(gè)延遲會(huì)高達(dá)到40毫秒###如果你選擇 "no",數(shù)據(jù)復(fù)制到從服務(wù)器將會(huì)減少延遲,但是會(huì)使用更多的帶寬。##作為默認(rèn)我們?yōu)榈脱舆t進(jìn)行優(yōu)化,但是在一個(gè)高流量的情況下或者當(dāng)主服務(wù)器和從服務(wù)器#有很多hops的時(shí)候,將該值設(shè)置為yes會(huì)更好# (譯者注:這就是一個(gè)網(wǎng)絡(luò)調(diào)優(yōu)的問題,默認(rèn)的TCP內(nèi)核會(huì)使用Nagle,即將小的數(shù)據(jù)包合并成大的數(shù)據(jù)包(及yes的情況))# (在等待合并的過程種,肯定會(huì)存在等待后續(xù)數(shù)據(jù)的步驟,因此這會(huì)導(dǎo)致數(shù)據(jù)的延遲)# (yes,就是使用TCP的默認(rèn)情況開啟Nagle算法,no就是關(guān)閉Nagle算法)repl-disable-tcp-nodelay no###設(shè)置復(fù)制的backlog值。(這個(gè)backlog和tcp中的backlog不一樣)##這個(gè)backlog值是一個(gè)緩沖區(qū),當(dāng)從服務(wù)器斷開連接之后,主服務(wù)器將更新的數(shù)據(jù)放置#在這個(gè)緩沖區(qū)中,因?yàn)楫?dāng)從服務(wù)重新連接上來時(shí)候不是所有的數(shù)據(jù)都需要同步,因此從這個(gè)#緩沖區(qū)中取數(shù)據(jù)就可以同步到和主服務(wù)器一樣的狀態(tài)###這個(gè)值設(shè)置得越大,從服務(wù)器的掉線時(shí)間就可以越長,上線后就可以進(jìn)行局部更新#(譯者注:當(dāng)?shù)艟€時(shí)間過長而無法進(jìn)行局部更新,那么從服務(wù)器就會(huì)再一次進(jìn)行同步所有的數(shù)據(jù),耗時(shí)和當(dāng)時(shí)的數(shù)據(jù)量成正比)#當(dāng)且僅當(dāng)?shù)谝粋€(gè)從服務(wù)器連接到服務(wù)器之后這個(gè)緩存才會(huì)被分配## repl-backlog-size 1mb## # 當(dāng)從服務(wù)器在長時(shí)間內(nèi)沒有連接到主服務(wù)器時(shí),backlog的緩存將會(huì)被釋放。# 以下的選項(xiàng)就是自 從服務(wù)器最后一次斷掉和主服務(wù)器之間的# 連接開始N秒后清空backlog的緩存## 設(shè)置為0意味著永遠(yuǎn)不會(huì)清空backlog## repl-backlog-ttl 3600### 在redis的信息輸出中我們使用一個(gè)整型值來表示從服務(wù)器的優(yōu)先值##這個(gè)優(yōu)先級(jí)的作用是,在主從結(jié)構(gòu)種,當(dāng)主服務(wù)器不能正常工作的時(shí)候時(shí)候,#將一個(gè)從服務(wù)器提升為主服務(wù)器,提升的依據(jù)就是這個(gè)值。## 假設(shè)又三個(gè) 優(yōu)先級(jí)分別為 25 10 100 的服務(wù)器,將優(yōu)先將數(shù)值最少的提升為主服務(wù)器# 即最小值優(yōu)先# 如果優(yōu)先級(jí)設(shè)置為0,意味著將不會(huì)又機(jī)會(huì)成為主服務(wù)器# 默認(rèn)優(yōu)先級(jí)是100slave-priority 100## 下面的值用來設(shè)置主服務(wù)器停止接受寫入事件的情況。# 如果從服務(wù)器的連接小于N # 從服務(wù)器的數(shù)據(jù)落后 小于等于M秒# # N個(gè)從服務(wù)器必須是在線的狀態(tài)## lag的單位是秒,它必須 <=指定的值,它從最后一次收到ping包的時(shí)間開始計(jì)算。 # 通常ping包都是每秒發(fā)送一次### 這個(gè)選項(xiàng)并不擔(dān)保N個(gè)副本都會(huì)接受寫入,但是會(huì)確保在指定的時(shí)間沒有足夠的從服務(wù)可用的時(shí)候# 窗口上顯示丟失寫入### 例如要求最少三個(gè)從服務(wù)器在lag<=10秒## min-slaves-to-write 3# min-slaves-max-lag 10## 設(shè)置任意一個(gè)為0都會(huì)導(dǎo)致關(guān)閉這項(xiàng)特性## 默認(rèn)min-slaves-to-write 設(shè)置為0(關(guān)閉這個(gè)特性)# min-slaves-max-lag 設(shè)置為10################################## SECURITY ##################################### 要求客戶端在處理其他指令之前先發(fā)起AUTH <PASSWORD>## 這在你不信任其他的接入主機(jī)上的redis-server是比較有用## 這個(gè)選項(xiàng)應(yīng)當(dāng)注釋掉來保證向后的兼容性,畢竟大部分的人都不需要鑒權(quán)驗(yàn)證(因?yàn)樗麄兌歼\(yùn)行自己的sever)## #注意,由于redis太快,所以每秒鐘可以嘗試150K次密碼,因此你應(yīng)該設(shè)置一個(gè)#非常強(qiáng)壯的密碼來防止別人的破解## requirepass foobared# 命令重命名.### 它用來改變共享環(huán)境中危險(xiǎn)命令的名字,在這個(gè)例子中# CONFIG 命令被重命名為一個(gè)難以猜解的名字。# 這會(huì)對(duì)內(nèi)部用戶的工具有效,但是對(duì)一般的客戶端無效。## Example:## rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52### 可以使用一個(gè)空字符串來抹殺這個(gè)命令## rename-command CONFIG ""## 請(qǐng)注意,改變記錄在AOF文件中的命令名稱或者傳輸?shù)綇姆?wù)會(huì)導(dǎo)致問題# AOF file or transmitted to slaves may cause problems.################################### LIMITS ###################################### 設(shè)置同一時(shí)間的客戶端最大連接數(shù),默認(rèn)的限制是10000個(gè)客戶端。#然而如果redis服務(wù)不設(shè)置這個(gè)限制值那么最大的用戶數(shù)就是最大文件描述符數(shù)-32.###一旦連接的用戶數(shù)超出了限制值,redis將會(huì)關(guān)閉新的連接并且發(fā)送 'max number of client reached'## maxclients 10000# 不使用超出指定大小的內(nèi)存,#當(dāng)redis使用到的內(nèi)存達(dá)到限定值的時(shí)候,將會(huì)根據(jù)淘汰策略試圖移除一部分key### 如果根據(jù)相關(guān)策略無法移除key,或者策略被設(shè)置為 'noeviction',redis將會(huì)對(duì)#使用到內(nèi)存的命令返回錯(cuò)誤,比如 SET LPUSH等,并且進(jìn)入只讀模式僅僅響應(yīng)只讀的命令如GET## 這個(gè)選項(xiàng)在你將redis當(dāng)做一個(gè)LRU緩存和設(shè)置一個(gè)內(nèi)存大小限制的時(shí)候十分有用。#### 警告:如果你的從服務(wù)器關(guān)聯(lián)到一個(gè)有最大內(nèi)存限制的redis實(shí)例上,# # 主服務(wù)器向從服務(wù)器輸出的緩存屬于被該服務(wù)器使用的內(nèi)存的一部分。#因此 網(wǎng)絡(luò)問題和重新同步引發(fā)的復(fù)制,不會(huì)觸發(fā)淘汰key的循環(huán),##反過來,從服務(wù)器的輸出緩存將會(huì)被觸發(fā)淘汰的DEL key,直到數(shù)據(jù)庫清空####簡單來說,如果你擁有一個(gè)從服務(wù)器,我們建議你將這個(gè)值#設(shè)置為少于系統(tǒng)可用的最大內(nèi)存,以便系統(tǒng)可以騰出空間來安放#從服務(wù)器的輸出緩存(但是如果策略是noeviction 那就沒這個(gè)必要)## maxmemory <bytes># 最大內(nèi)存策略: 當(dāng)redis使用的內(nèi)存達(dá)到指定的最大值時(shí),你可以使用如下的5種# 策略來應(yīng)對(duì)這種情況## volatile-lru -> 使用LRU算法依據(jù)過期時(shí)間來移除key# allkeys-lru -> 使用LRU算法來移除任何key# volatile-random -> 根據(jù)過期時(shí)間設(shè)置隨即移除key# allkeys-random -> 隨即移除任何一個(gè)key# volatile-ttl -> 移除一個(gè)最近過期時(shí)間的key# noeviction -> 所有key用不過期(即不移除任何key),對(duì)于任何寫操作都返回一個(gè)錯(cuò)誤信息# # 提示: 在以上的所有策略中,當(dāng)不存在一個(gè)key滿足以上的淘汰策略時(shí)(即無法空出內(nèi)存時(shí))# 任何寫操作都會(huì)返回錯(cuò)誤信息## 目前為止具有寫入操作的指令是: 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## 默認(rèn)值為:## maxmemory-policy volatile-lru## LRU和最小TTL算法都不是精確的算法,但是是近似的算法,#因此你可以選擇一些樣本大小來進(jìn)行測(cè)試,對(duì)于一個(gè)默認(rèn)的redis實(shí)例#將會(huì)選選擇3個(gè)key,并且挑選其中之一作為最近最少的Key,你可以使用如下參數(shù)修改例子的數(shù)量大小### maxmemory-samples 3############################## APPEND ONLY MODE ################################ Redis默認(rèn)使用異步存儲(chǔ)數(shù)據(jù)到硬盤上.## 這個(gè)模式非常合適一些應(yīng)用,但是當(dāng)redis的進(jìn)程出現(xiàn)問題# 或者停電的時(shí)候,會(huì)丟失一些寫入的數(shù)據(jù)(丟失的多少根據(jù)保存點(diǎn)的設(shè)置)## # Append Only 文件(Append Only file),是一個(gè)備選的持久化模型,# 它提供了更好的續(xù)航能力,對(duì)于一個(gè)使用默認(rèn)數(shù)據(jù)同步文件策略的實(shí)例#redis可能會(huì)因?yàn)橐粋€(gè)戲劇性的災(zāi)難比如停電等丟失一秒鐘的數(shù)據(jù)##或者由于redis進(jìn)程本身的錯(cuò)誤僅僅寫入一個(gè)數(shù)據(jù),但操作系統(tǒng)一直運(yùn)行#### AOF和RDB可以毫無問題地共存,因此你可以同時(shí)開啟他們,# # 如果你開啟了AOF,redis會(huì)在啟動(dòng)時(shí)加載AOF,因?yàn)锳OF有更好的魯棒性## 你可以從 http://redis.io/topics/persistence 獲取更多的信息appendonly no# append only file 的名稱 (默認(rèn)是: "appendonly.aof")appendfilename "appendonly.aof"# fsync() 調(diào)用告訴操作系統(tǒng)立即將數(shù)據(jù)寫入到硬盤中,而不是寫入到輸出緩沖區(qū)# 等待足夠的數(shù)據(jù)再寫入。一些操作系統(tǒng)會(huì)立即將數(shù)據(jù)寫入到硬盤中,一些其他的#操作系統(tǒng)則只是盡可能快地將數(shù)據(jù)寫入硬盤中## # Redis支持三種不同的模式:## no:不進(jìn)行強(qiáng)制同步,僅僅讓操作系統(tǒng)根據(jù)自身的決策寫入到硬盤中。這種速度更快 # always:在每一次追加寫入操作都采用強(qiáng)制同步,特點(diǎn)是慢,安全。# everysec:每間隔一秒鐘強(qiáng)制同步數(shù)據(jù)。折中的方案### 默認(rèn)采用 "everysec"作為速度和安全性之間的平衡方案# 你將根據(jù)自己的需求決定采用更快的方案或者更安全的方案。# 選擇no,何時(shí)寫入數(shù)據(jù)將由操作系統(tǒng)決定,你可以由此獲取最快的速度# 選擇always,數(shù)據(jù)將立即寫入到硬盤中,你可以獲得更高的數(shù)據(jù)安全性## 更多的信息可以從以下地址中獲取:# http://antirez.com/post/redis-persistence-demystified.html## 如果不開啟該選項(xiàng)默認(rèn)使用"everysec".# appendfsync alwaysappendfsync everysec# appendfsync no### 當(dāng)AOF的強(qiáng)制寫入策略設(shè)置為 always 或者 everysec,并且一個(gè)后臺(tái)保存進(jìn)程#(一個(gè)后臺(tái)保存進(jìn)程或者 AOF 日志后臺(tái)重寫)會(huì)占用硬盤的大量I/O資源,在一些linux# 的配置中redis會(huì)因?yàn)?fsync() 調(diào)用而長期鎖定。特別的是在目前我們沒法解決這個(gè)問題# 即使采用另外的線程來運(yùn)行強(qiáng)制同步也會(huì)鎖定住我們的 同步 write(2)調(diào)用## 為了減輕這個(gè)問題,下面的選項(xiàng)將會(huì)在GBSAVE 或者BGREWRITEAOF運(yùn)行時(shí)# 預(yù)防主進(jìn)程調(diào)用fsync()## 這意味著當(dāng)另一個(gè) 子進(jìn)程在保存的時(shí)候,Redis的保存策略將處于"appendfsync none"這樣的類似狀態(tài)# 在實(shí)際應(yīng)用當(dāng)中,這意味著在最壞的情況下將會(huì)失去30秒的日志(使用linux默認(rèn)的設(shè)置)## # 如果你采用yes,那么將會(huì)存在一個(gè)潛在的隱患,不然請(qǐng)?jiān)O(shè)置它為 "no",# 這是一個(gè)為了穩(wěn)定的安全性選擇#no-appendfsync-on-rewrite no# 自動(dòng)改寫append only 文件.## redis會(huì)在AOF日志文件增長到指定百分比的時(shí)候通過調(diào)用BGREWRITEAOF來自動(dòng)重寫日志文件# # 他是這樣工作的:redis會(huì)記住最后一次改寫后AOF文件的大小(如果重寫自重啟以來#尚未發(fā)生,那么AOF文件的大小就是啟動(dòng)以來使用的大小)### 這個(gè)基準(zhǔn)值將會(huì)和當(dāng)前值進(jìn)行比較,如果當(dāng)前值比設(shè)定的百分比還要大,重寫事件就會(huì)發(fā)生。## 并且你需要指定一個(gè)AOF重寫的最小值,這用來避免當(dāng)重寫文件的百分比增長符合目標(biāo)# 但是整個(gè)文件依然很小的時(shí)候### 將 auto-aof-rewrite-percentage 設(shè)置為0則可以關(guān)閉掉AOF自動(dòng)重寫的功能#auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb################################ LUA SCRIPTING ################################ 以毫秒為單位限定lua腳本的最大執(zhí)行時(shí)間.### 當(dāng)lua腳本在超出最大允許執(zhí)行時(shí)間之后,redis會(huì)記錄下這個(gè)腳本到日志中,#并且會(huì)向這個(gè)請(qǐng)求返回error的錯(cuò)誤#### 僅當(dāng) SCRIPT KILL 和 SHUTDOWN NOSAVE 命令可用的時(shí)候# 一個(gè)運(yùn)行時(shí)間超過最大限定時(shí)間的腳本才會(huì)繼續(xù)執(zhí)行# SCRIPT KILL用來停止一個(gè)沒有調(diào)用寫入命令的腳本# 當(dāng)用戶不想等待腳本的自然中止但腳本又在進(jìn)行寫操作的時(shí)候# 采用 SHUTDOWN NOSAVE 是解決這個(gè)問題的唯一辦法,他可以立即停掉整個(gè)腳本### 設(shè)置為0 或者一個(gè)負(fù)數(shù)來取消時(shí)間限定.lua-time-limit 5000################################## SLOW LOG #################################### # slow log(慢日志)用來記錄執(zhí)行時(shí)間超過指定值的查詢。# 執(zhí)行時(shí)間不包含 I/O操作,比如和客戶端交互,發(fā)送應(yīng)答等等# 僅僅是執(zhí)行命令的真實(shí)時(shí)間,(僅僅是線程因?yàn)閳?zhí)行這個(gè)命令而鎖定且無法處理其他請(qǐng)求的階段)### 你可以使用兩個(gè)參數(shù)來配置 slow log,一個(gè)是以微秒為單位的命令執(zhí)行時(shí)間值,# 另一個(gè)是slow log 的長度(即記錄的最大數(shù)量)# 當(dāng)一個(gè)新的命令被記錄到slow log的時(shí)候,最舊的一條記錄將會(huì)被移除。### 下面的值將會(huì)被解釋為 微秒 為單位,所以 1000000 微秒為 1秒# # 將這個(gè)值設(shè)置為一個(gè)負(fù)數(shù),將關(guān)閉掉slow log ,如果設(shè)置為0,則記錄所有的命令#(默認(rèn)是10毫秒)slowlog-log-slower-than 10000# 因?yàn)檫@會(huì)消耗內(nèi)存,因此實(shí)際上并不是限制到這個(gè)長度.# 你可以使用 SLOWLOG RESET來回收占用的內(nèi)存slowlog-max-len 128################################ LATENCY MONITOR ################################ redis延遲監(jiān)控子系統(tǒng)例子與操作系統(tǒng)收集的redis實(shí)例相關(guān)的數(shù)據(jù)不同## 通過LATENCY命令,可以為用戶打印出相關(guān)信息的圖形和報(bào)告##這個(gè)系統(tǒng)只會(huì)記錄運(yùn)行時(shí)間超出指定時(shí)間值的命令,如果設(shè)置為0,這個(gè)監(jiān)控將會(huì)被關(guān)閉### 默認(rèn)的情況下,延遲監(jiān)控是關(guān)閉,因?yàn)槿绻銢]有延遲的問題大部分情況下不需要#,并且收集數(shù)據(jù)的行為會(huì)對(duì)性能造成影響,雖然這個(gè)影響很小可以在大負(fù)荷下工作# #延遲監(jiān)控可以使用如下命令來打開## "CONFIG SET latency-monitor-threshold <milliseconds>".latency-monitor-threshold 0############################# Event notification ###############################redis 可以在key 空間中采用發(fā)布訂閱模式來通知事件的發(fā)生##這個(gè)功能的文檔可以查看 http://redis.io/topics/keyspace-events# ##對(duì)于一個(gè)實(shí)例,如果鍵空間事件通知是啟用狀態(tài),當(dāng)一個(gè)客戶端執(zhí)行在一個(gè)#存儲(chǔ)在Database 0名為"foo"的key的DEL(刪除)操作時(shí),#有如下兩條信息將會(huì)通過發(fā)布訂閱系統(tǒng)產(chǎn)生### PUBLISH __keyspace@0__:foo del# PUBLISH __keyevent@0__:del foo### 以下是可選的redis事件通知,每個(gè)類別的事件可以由一個(gè)字符進(jìn)行描述## K Keyspace events, published with __keyspace@<db>__ prefix.# E Keyevent events, published with __keyevent@<db>__ prefix.# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ...# $ String commands# l List commands# s Set commands# h Hash commands# z Sorted set commands# x Expired events (events generated every time a key expires)# e Evicted events (events generated when a key is evicted for maxmemory)# A Alias for g$lshzxe, so that the "AKE" string means all the events.## The "notify-keyspace-events" takes as argument a string that is composed# by zero or multiple characters. The empty string means that notifications# are disabled at all.## 例子1: 啟用 list 和 generic 事件, ## notify-keyspace-events Elg## 例子2 2: 要想訂閱通道名為__keyevent@0__:expired 上expired keys的事件:## notify-keyspace-events Ex### 默認(rèn)不啟用所有的通知,因?yàn)榇蟛糠值挠脩舨恍枰@些功能,而且這些功能會(huì)帶來一些開銷## 如果你沒有指定 K 或者 E,沒有事件會(huì)被傳遞#notify-keyspace-events ""############################### ADVANCED CONFIG #################################創(chuàng)建空白哈希表時(shí),程序默認(rèn)使用 REDIS_ENCODING_ZIPLIST 編碼,當(dāng)以下任何一個(gè)條件被滿#足時(shí),程序?qū)⒕幋a從切換為 REDIS_ENCODING_HT#哈希表中某個(gè)鍵或某個(gè)值的長度大于 server.hash_max_ziplist_value (默認(rèn)值為 64)。#壓縮列表中的節(jié)點(diǎn)數(shù)量大于 server.hash_max_ziplist_entries (默認(rèn)值為 512 )。## ziplist是一個(gè)解決空間的緊湊的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),但是當(dāng)數(shù)據(jù)超過閾值時(shí),將采用原生的數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)##hash-max-ziplist-entries 512hash-max-ziplist-value 64## 與hash表類似,#list-max-ziplist-entries 512list-max-ziplist-value 64## 設(shè)置特殊編碼的唯一情況:# 當(dāng)一個(gè)set僅僅由一個(gè)基數(shù)為10最大位數(shù)為64位的有符號(hào)整形的字符串構(gòu)成的時(shí)候##以下配置設(shè)置了set的限制大小,當(dāng)小于這個(gè)值的時(shí)候?qū)?huì)使用一個(gè)更緊湊的數(shù)據(jù)結(jié)構(gòu)來保存#以期減少內(nèi)存占用#set-max-intset-entries 512## 與hash和list類似 zsort也采用如下的配置來選擇是否進(jìn)行特殊編碼來節(jié)省空間#zset-max-ziplist-entries 128zset-max-ziplist-value 64## HyperLogLog 稀疏表示字節(jié)限制# 這個(gè)限制包含了16個(gè)字節(jié)的頭部,當(dāng)一個(gè)HyperLogLog使用sparse representation# 超過了這個(gè)顯示,它就會(huì)轉(zhuǎn)換到dense representation上# #hll-sparse-max-bytes 3000## active rehashing使用CPU時(shí)間的每100毫秒中的1毫秒來進(jìn)行rehashing工作# 來rehash redis的主hash表(rehash的時(shí)候在代碼種引入記時(shí)來保證)## lazy rehashing :逐步hash,每一次添加查找刪除進(jìn)行一次rehash的步驟# 又稱惰性hash# # 因?yàn)閔ash的再散列會(huì)導(dǎo)致整個(gè)進(jìn)程的stop,為了避免長時(shí)間的stop,以上的策略都是在分散整個(gè)# rehash的過程(參照《redis設(shè)計(jì)與實(shí)現(xiàn)》的字典部分)#activerehashing yes## 客戶端輸出緩沖區(qū)顯示可以用來解決由于某些原因?qū)е碌膹?qiáng)制斷線# 而造成的不能讀到足夠的數(shù)據(jù)# 一個(gè)比較常見的原因是發(fā)布訂閱模式種,客戶端不能足夠快速地消費(fèi)發(fā)布者生產(chǎn)的信息## 這個(gè)限制可以設(shè)置為如下的三種類型:## normal -> 正常普通的客戶端,包含監(jiān)控客戶端# slave -> 主從服務(wù)器的從客戶端# pubsub -> 訂閱了最少一個(gè)頻道的客戶端## 每一個(gè) client-output-buffer-limit 格式如下:## client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>#### 在兩種情況下服務(wù)器認(rèn)為客戶端不是意外臨時(shí)掉線# # 1.緩沖區(qū)的數(shù)據(jù)達(dá)到硬限制# 2.緩沖區(qū)的數(shù)據(jù)達(dá)到軟限制,同時(shí)時(shí)間超過了指定值## 因?yàn)橐粋€(gè)客戶離線,有可能是臨時(shí)性的網(wǎng)絡(luò)故障,或者傳輸問題# 也有可能是永久性離線 或者強(qiáng)制性離線,此時(shí)服務(wù)器將不會(huì)保留他的緩存數(shù)據(jù)# 以下的設(shè)置就是為了判斷這一情況的#### 硬限制和軟限制都可以通過將其設(shè)置為0來關(guān)閉掉client-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60## redis會(huì)按照一定的頻率來處理諸如 關(guān)閉超時(shí)連接,清理沒有被使用的過期key等等此類后臺(tái)任務(wù)## 并不是所有的任務(wù)都以相同的頻率來執(zhí)行的,redis通過一個(gè)hz的值來決定處理這些(如上所述的后臺(tái)任務(wù))任務(wù)的頻率### 提高這個(gè)值會(huì)使用更多的cpu時(shí)間來在redis閑置的時(shí)候處理以上的,但是以此同時(shí)# 超時(shí)的連接的處理和過期key的清理則會(huì)更精確## hz的取值范圍在1到500,不建議設(shè)置為超過100的值,默認(rèn)是10hz 10## 當(dāng)子進(jìn)程重寫AOF文件的時(shí)候,以下選項(xiàng)將會(huì)允許等到存在32MB數(shù)據(jù)的時(shí)候才調(diào)用強(qiáng)制同步# 這樣可以降低IO上的延遲#aof-rewrite-incremental-fsync yes
新聞熱點(diǎn)
疑難解答
圖片精選