linux 啟動 redis:cd /usr/local/redis-3.2.0
src/redis-server redis.conf //保證 redis 啟動時(shí)讀取的是配置完成的 redis.conf 文件
src/redis-cli //啟動客戶端
ps -ef|grep redis //查看 redis 進(jìn)程狀態(tài)
默認(rèn)的配置 redis.conf 文件中,首先約定了存儲單位:
1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 10241024 bytes
1g => 1000000000 bytes
1gb => 10241024*1024 bytes
Redis 配置中對單位的大小寫不敏感,1GB、1Gb和1gB都是相同的键菱。由此也說明瓷炮,Redis 只支持 bytes郑兴,不支持 bit 單位腥泥。
Redis 支持以 “includes” 的方式引入其他配置文件岩梳,比如:
include/path/to/local.conf
include/path/to/other.conf
需要注意的是唆樊,假如多個(gè)一個(gè)配置項(xiàng)在不同配置文件中都有定義宛琅,則以最后一行讀入的為準(zhǔn),就是說后面的配置項(xiàng)會覆蓋前面的配置項(xiàng)逗旁。
1.1通用配置
默認(rèn)情況下嘿辟,Redis 并不是以 daemon 形式來運(yùn)行的。通過 daemonize 配置項(xiàng)可以控制Redis的運(yùn)行形式片效,如果改為 yes红伦,那么 Redis 就會以 daemon 形式運(yùn)行:
daemonize no
當(dāng)以 daemon 形式運(yùn)行時(shí),Redis 會生成一個(gè) pid 文件淀衣,默認(rèn)會生成在 /var/run/Redis.pid 昙读。當(dāng)然,可以通過 pidfile 來指定 pid 文件生成的位置膨桥,比如:
pidfile /path/to/Redis.pid
默認(rèn)情況下蛮浑,Redis 會響應(yīng)本機(jī)所有可用網(wǎng)卡的連接請求。當(dāng)然只嚣,Redis 允許通過 bind 配置項(xiàng)來指定要綁定的IP沮稚,比如:
bind 192.168.1.2 10.8.4.2
Redis的默認(rèn)服務(wù)端口是6379,可以通過 port 配置項(xiàng)來修改册舞。如果端口設(shè)置為0的話蕴掏,Redis 便不會監(jiān)聽端口了。
port 6379
可是调鲸,如果Redis不監(jiān)聽端口盛杰,還怎么與外界通信呢?其實(shí)Redis還支持通過 unix socket 方式來接收請求藐石〖垂可以通過 unix socket 配置項(xiàng)來指定 unix socket 文件的路徑,并通過 unix socket perm 來指定文件的權(quán)限于微。
unixsocket /tmp/Redis.sock
unixsocketperm 700
在高 QPS 的環(huán)境下需要提高 backlog 的值來避免 TCP 的慢連接問題逗嫡。想要提高 backlog 的值办素,除了需要設(shè)置 Redis 的 tcp-backlog ,還要同時(shí)提高更改 Linux 的配置祸穷,否則,Linux內(nèi)核會默認(rèn)將其截取為 /proc/sys/net/core/somaxconn 的大小勺三。
tcp-backlog 511
當(dāng)一個(gè) Redis-client 一直沒有請求發(fā)向 server 端雷滚,那么 server 端有權(quán)主動關(guān)閉這個(gè)連接,可以通過timeout 來設(shè)置“空閑超時(shí)時(shí)限”吗坚,0表示永不關(guān)閉祈远。
timeout 0
TCP連接保活策略商源,可以通過 tcp-keepalive 配置項(xiàng)來進(jìn)行設(shè)置车份,單位為秒,假如設(shè)置為60秒牡彻,則 server 端會每60秒向連接空閑的客戶端發(fā)起一次 ACK 請求扫沼,以檢查客戶端是否已經(jīng)掛掉,對于無響應(yīng)的客戶端則會關(guān)閉其連接庄吼。所以關(guān)閉一個(gè)連接最長需要120秒的時(shí)間缎除。如果設(shè)置為0,則不會進(jìn)行弊苎埃活檢測器罐。
tcp-keepalive 0
Redis支持通過 loglevel 配置項(xiàng)設(shè)置日志等級,共分四級渐行,即 debug轰坊、verbose、notice祟印、warning肴沫。
loglevel notice
Redis也支持通過 logfile 配置項(xiàng)來設(shè)置日志文件的生成位置。如果設(shè)置為空字符串旁理,則 Redis 會將日志輸出到標(biāo)準(zhǔn)輸出樊零。假如在 daemon 情況下將日志設(shè)置為輸出到標(biāo)準(zhǔn)輸出,則日志會被寫到 /dev/null 中孽文。
logfile ""
如果希望日志打印到 syslog 中驻襟,也很容易,通過 syslog-enabled 來控制芋哭。另外沉衣,syslog-ident 還可以指定syslog 里的日志標(biāo)志,比如:
syslog-ident Redis
而且還支持指定 syslog 設(shè)備减牺,值可以是 USER 或 LOCAL0-LOCAL7 豌习。具體可以參考 syslog 服務(wù)本身的用法存谎。
syslog-facility local0
對于 Redis 來說,可以設(shè)置其數(shù)據(jù)庫的總數(shù)量肥隆,假如希望一個(gè) Redis 包含16個(gè)數(shù)據(jù)庫既荚,那么設(shè)置如下:
databases 16
這16個(gè)數(shù)據(jù)庫的編號將是0到15。默認(rèn)的數(shù)據(jù)庫是編號為0的數(shù)據(jù)庫栋艳。用戶可以使用 select <DBid> 來選擇相應(yīng)的數(shù)據(jù)庫恰聘。
1.2快照配置
快照,主要涉及的是 Redis 的 RDB 持久化相關(guān)的配置吸占。
可以用如下的指令來讓數(shù)據(jù)保存到磁盤上晴叨,即控制 RDB 快照功能:
save <seconds> <changes>
舉例來說:
save 900 1 //表示每15分鐘且至少有1個(gè) key 改變,就觸發(fā)一次持久化
save 300 10 //表示每5分鐘且至少有10個(gè) key 改變矾屯,就觸發(fā)一次持久化
save 60 10000 //表示每60秒至少有10000個(gè) key 改變兼蕊,就觸發(fā)一次持久化
如果想禁用 RDB 持久化的策略,只要不設(shè)置任何 save 指令就可以件蚕,或者給 save 傳入一個(gè)空字符串參數(shù)也可以達(dá)到相同效果孙技,就像這樣:
save""
如果用戶開啟了 RDB 快照功能,那么在 Redis 持久化數(shù)據(jù)到磁盤時(shí)如果出現(xiàn)失敗排作,默認(rèn)情況下绪杏,Redis 會停止接受所有的寫請求。這樣做的好處在于可以讓用戶很明確的知道內(nèi)存中的數(shù)據(jù)和磁盤上的數(shù)據(jù)已經(jīng)存在不一致了纽绍。如果 Redis 不顧這種不一致蕾久,一意孤行的繼續(xù)接收寫請求,就可能會引起一些災(zāi)難性的后果拌夏。
如果下一次 RDB 持久化成功僧著,Redis 會自動恢復(fù)接受寫請求。
當(dāng)然障簿,如果不在乎這種數(shù)據(jù)不一致或者有其他的手段發(fā)現(xiàn)和控制這種不一致的話完全可以關(guān)閉這個(gè)功能盹愚,以便在快照寫入失敗時(shí),也能確保 Redis 繼續(xù)接受新的寫請求站故。配置項(xiàng)如下:
stop-writes-on-bgsave-error yes
對于存儲到磁盤中的快照皆怕,可以設(shè)置是否進(jìn)行壓縮存儲。如果是的話西篓,Redis 會采用 LZF 算法進(jìn)行壓縮愈腾。如果不想消耗 CPU 來進(jìn)行壓縮的話,可以設(shè)置為關(guān)閉此功能岂津,但是存儲在磁盤上的快照會比較大虱黄。
rdbcompression yes
在存儲快照后,我們還可以讓 Redis 使用 CRC64 算法來進(jìn)行數(shù)據(jù)校驗(yàn)吮成,但是這樣做會增加大約10%的性能消耗橱乱,如果希望獲取到最大的性能提升辜梳,可以關(guān)閉此功能。
rdbchecksum yes
我們還可以設(shè)置快照文件的名稱泳叠,默認(rèn)是這樣配置的:
dbfilename dump.rdb
還可以設(shè)置這個(gè)快照文件存放的路徑作瞄。比如默認(rèn)設(shè)置就是:
dir ./db/
1.3主從配置
Redis 提供了主從同步功能。
通過 slaveof 配置項(xiàng)可以控制某一個(gè) Redis 作為另一個(gè) Redis 的從服務(wù)器危纫,通過指定 IP 和端口來定位到主Redis 的位置粉洼。一般情況下建議用戶為從 Redis 設(shè)置一個(gè)不同頻率的快照持久化的周期,或者為從 Redis 配置一個(gè)不同的服務(wù)端口等等叶摄。
slaveof <masterip> <masterport>
如果主 Redis 設(shè)置了驗(yàn)證密碼的話(使用 requirepass 來設(shè)置),則在從 Redis 的配置中要使用masterauth 來設(shè)置校驗(yàn)密碼安拟,否則的話蛤吓,主 Redis 會拒絕從 Redis 的訪問請求。
masterauth <master-password>
當(dāng)從 Redis 失去了與主 Redis 的連接糠赦,或者主從同步正在進(jìn)行中時(shí)会傲, Redis 該如何處理外部發(fā)來的訪問請求呢?這里拙泽,從 Redis 可以有兩種選擇:
第一種選擇:如果 slave-serve-stale-data 設(shè)置為 yes (默認(rèn))淌山,則從 Redis 仍會繼續(xù)響應(yīng)客戶端的讀寫請求。
第二種選擇:如果 slave-serve-stale-data 設(shè)置為 no顾瞻,則從 Redis 會對客戶端的請求返回 “SYNC with master inprogress” 泼疑,當(dāng)然也有例外,當(dāng)客戶端發(fā)來 INFO 請求和 SLAVEOF 請求荷荤,從 Redis 還是會進(jìn)行處理退渗。
可以控制一個(gè)從 Redis 是否可以接受寫請求。將數(shù)據(jù)直接寫入從 Redis 蕴纳,一般只適用于那些生命周期非常短的數(shù)據(jù)会油,因?yàn)樵谥鲝耐綍r(shí),這些臨時(shí)數(shù)據(jù)就會被清理掉古毛。自從 Redis2.6 版本之后翻翩,默認(rèn)從 Redis 為只讀。
slave-read-only yes
只讀的從 Redis 并不適合直接暴露給不可信的客戶端稻薇。為了盡量降低風(fēng)險(xiǎn)嫂冻,可以使用 rename-command指令來將一些可能有破壞力的命令重命名,避免外部直接調(diào)用塞椎。比如:
rename-command CONFIG b8c02d524045429941cc15f59e41cb7be6c52
從 Redis 會周期性的向主 Redis 發(fā)出 PING 包絮吵。可以通過 repl_ping_slave_period 指令來控制其周期忱屑。默認(rèn)是10秒蹬敲。
repl-ping-slave-period 10
在主從同步時(shí)暇昂,可能在這些情況下會有超時(shí)發(fā)生:
(1)以從 Redis 的角度來看,當(dāng)有大規(guī)模 IO 傳輸時(shí)伴嗡。
(2)以從 Redis 的角度來看急波,當(dāng)數(shù)據(jù)傳輸或 PING 時(shí),主 Redis 超時(shí)
(3)以主 Redis 的角度來看瘪校,在回復(fù)從 Redis 的 PING 時(shí)澄暮,從 Redis 超時(shí)
用戶可以設(shè)置上述超時(shí)的時(shí)限,不過要確保這個(gè)時(shí)限比 repl-ping-slave-period 的值要大阱扬,否則每次主Redis 都會認(rèn)為從 Redis 超時(shí)泣懊。
repl-timeout 60
我們可以控制在主從同步時(shí)是否禁用 TCP_NODELAY 。如果開啟 TCP_NODELAY 麻惶,那么主 Redis 會使用更少的 TCP 包和更少的帶寬來向從 Redis 傳輸數(shù)據(jù)馍刮。但是這可能會增加一些同步的延遲,大概會達(dá)到40毫秒左右窃蹋。如果關(guān)閉了 TCP_NODELAY 卡啰,那么數(shù)據(jù)同步的延遲時(shí)間會降低,但是會消耗更多的帶寬警没。
repl-disable-tcp-nodelay no
我們還可以設(shè)置同步隊(duì)列長度匈辱。隊(duì)列長度( backlog )是主 Redis 中的一個(gè)緩沖區(qū),在與從 Redis 斷開連接期間杀迹,主 Redis 會用這個(gè)緩沖區(qū)來緩存應(yīng)該發(fā)給從 Redis 的數(shù)據(jù)亡脸。這樣的話,當(dāng)從 Redis 重新連接上之后树酪,就不必重新全量同步數(shù)據(jù)梗掰,只需要同步這部分增量數(shù)據(jù)即可。
repl-backlog-size 1mb
如果主 Redis 等了一段時(shí)間之后嗅回,還是無法連接到從 Redis 及穗,那么緩沖隊(duì)列中的數(shù)據(jù)將被清理掉。我們可以設(shè)置主 Redis 要等待的時(shí)間長度绵载。如果設(shè)置為0埂陆,則表示永遠(yuǎn)不清理。默認(rèn)是1個(gè)小時(shí)娃豹。
repl-backlog-ttl 3600
我們可以給眾多的從 Redis 設(shè)置優(yōu)先級焚虱,在主 Redis 持續(xù)工作不正常的情況,優(yōu)先級高的從 Redis 將會升級為主 Redis 懂版。而編號越小鹃栽,優(yōu)先級越高。比如一個(gè)主 Redis 有三個(gè)從 Redis 躯畴,優(yōu)先級編號分別為10民鼓、100薇芝、25,那么編號為10的從 Redis 將會被首先選中升級為主 Redis 丰嘉。當(dāng)優(yōu)先級被設(shè)置為0時(shí)夯到,這個(gè)從Redis 將永遠(yuǎn)也不會被選中。默認(rèn)的優(yōu)先級為100饮亏。
slave-priority 100
假如主 Redis 發(fā)現(xiàn)有超過M個(gè)從 Redis 的連接延時(shí)大于N秒耍贾,那么主 Redis 就停止接受外來的寫請求。這是因?yàn)閺?Redis 一般會每秒鐘都向主Redis發(fā)出PING路幸,而主Redis會記錄每一個(gè)從 Redis 最近一次發(fā)來 PING 的時(shí)間點(diǎn)荐开,所以主 Redis 能夠了解每一個(gè)從 Redis 的運(yùn)行情況。
min-slaves-to-write 3
min-slaves-max-lag 10
上面這個(gè)例子表示简肴,假如有大于等于3個(gè)從 Redis 的連接延遲大于10秒晃听,那么主 Redis 就不再接受外部的寫請求。上述兩個(gè)配置中有一個(gè)被置為0着帽,則這個(gè)特性將被關(guān)閉。默認(rèn)情況下 min-slaves-to-write 為0移层,而 min-slaves-max-lag 為10仍翰。
1.4 安全配置
我們可以要求 Redis 客戶端在向 Redis-server 發(fā)送請求之前,先進(jìn)行密碼驗(yàn)證观话。由于 Redis 性能非常高予借,每秒鐘可以完成多達(dá)15萬次的密碼嘗試,所以最好設(shè)置一個(gè)足夠復(fù)雜的密碼频蛔,否則很容易被黑客破解灵迫。
requirepass chenlongfei
這里通過 requirepass 將密碼設(shè)置成我的名字。
Redis 允許我們對 Redis 指令進(jìn)行更名晦溪,比如將一些比較危險(xiǎn)的命令改個(gè)名字瀑粥,避免被誤執(zhí)行。比如可以把 CONFIG 命令改成一個(gè)很復(fù)雜的名字三圆,這樣可以避免外部的調(diào)用狞换,同時(shí)還可以滿足內(nèi)部調(diào)用的需要:
rename-command CONFIG b840fc02d5240454299c15f59e41cb7be6c89
我們甚至可以禁用掉 CONFIG 命令,那就是把 CONFIG 的名字改成一個(gè)空字符串:
rename-command CONFIG ""
但需要注意的是舟肉,如果使用 AOF 方式進(jìn)行數(shù)據(jù)持久化修噪,或者需要與從 Redis 進(jìn)行通信,那么更改指令的名字可能會引起一些問題路媚。
1.5 限制配置
我們可以設(shè)置 Redis 同時(shí)可以與多少個(gè)客戶端進(jìn)行連接黄琼。默認(rèn)情況下為10000個(gè)客戶端。當(dāng)無法設(shè)置進(jìn)程文件句柄限制時(shí)整慎, Redis 會設(shè)置為當(dāng)前的文件句柄限制值減去32脏款,因?yàn)?Redis 會為自身內(nèi)部處理邏輯留一些句柄出來围苫。
如果達(dá)到了此限制, Redis 則會拒絕新的連接請求弛矛,并且向這些連接請求方發(fā)出 “max number of clients reached” 以作回應(yīng)够吩。
maxclients 10000
我們甚至可以設(shè)置 Redis 可以使用的內(nèi)存量。一旦到達(dá)內(nèi)存使用上限丈氓, Redis 將會試圖移除內(nèi)部數(shù)據(jù)周循,移除規(guī)則可以通過 maxmemory-policy 來指定。
如果 Redis 無法根據(jù)移除規(guī)則來移除內(nèi)存中的數(shù)據(jù)万俗,或者我們設(shè)置了“不允許移除”湾笛,那么 Redis 則會針對那些需要申請內(nèi)存的指令返回錯(cuò)誤信息,比如 SET 闰歪、 LPUSH 等嚎研。但是對于無內(nèi)存申請的指令,仍然會正常響應(yīng)库倘,比如 GET 等临扮。
maxmemory <bytes>
需要注意的一點(diǎn)是,如果 Redis 是主 Redis (說明 Redis 有從 Redis )教翩,那么在設(shè)置內(nèi)存使用上限時(shí)杆勇,需要在系統(tǒng)中留出一些內(nèi)存空間給同步隊(duì)列緩存,只有在設(shè)置的是“不移除”的情況下饱亿,才不用考慮這個(gè)因素蚜退。
對于內(nèi)存移除規(guī)則來說, Redis 提供了多達(dá)6種的移除規(guī)則彪笼。他們是:
(1)volatile-lru:使用 LRU 算法移除過期集合中的 key
(2)allkeys-lru:使用 LRU 算法移除 key
(3)volatile-random:在過期集合中移除隨機(jī)的 key
(4)allkeys-random:移除隨機(jī)的 key
(5)volatile-ttl:移除那些 TTL 值最小的 key 钻注,即那些最近才過期的 key
(6)noeviction:不進(jìn)行移除。針對寫操作配猫,只是返回錯(cuò)誤信息
無論使用上述哪一種移除規(guī)則幅恋,如果沒有合適的 key 可以移除的話, Redis 都會針對寫請求返回錯(cuò)誤信息泵肄。
maxmemory-policy volatile-lru
LRU算法和最小TTL算法都并非是精確的算法佳遣,而是估算值。所以可以設(shè)置樣本的大小凡伊。假如 Redis 默認(rèn)會檢查三個(gè) key 并選擇其中 LRU 的那個(gè)零渐,那么可以改變這個(gè) key 樣本的數(shù)量。
maxmemory-samples 3
1.6 AOF配置
默認(rèn)情況下系忙, Redis 會異步的將數(shù)據(jù)持久化到磁盤诵盼。這種模式在大部分應(yīng)用程序中已被驗(yàn)證是很有效的,但是在一些問題發(fā)生時(shí),比如斷電风宁,則這種機(jī)制可能會導(dǎo)致數(shù)分鐘的寫請求丟失洁墙。
如上半部分中介紹的, AOF 是一種更好的保持?jǐn)?shù)據(jù)一致性的方式戒财。即使當(dāng)服務(wù)器斷電時(shí)裸影,也僅會有1秒鐘的寫請求丟失卧蜓,當(dāng) Redis 進(jìn)程出現(xiàn)問題且操作系統(tǒng)運(yùn)行正常時(shí),甚至只會丟失一條寫請求。
官方建議鞭铆, AOF 機(jī)制和 RDB 機(jī)制可以同時(shí)使用教馆,不會有任何沖突宛逗。
appendonly yes
我們還可以設(shè)置 AOF 文件的名稱:
appendfilename "appendonly.aof"
fsync()調(diào)用帖池,用來告訴操作系統(tǒng)立即將緩存的指令寫入磁盤。一些操作系統(tǒng)會“立即”進(jìn)行慌申,而另外一些操作系統(tǒng)則會“盡快”進(jìn)行陌选。
Redis支持三種不同的模式:
(1)no:不調(diào)用 fsync() 。而是讓操作系統(tǒng)自行決定 sync 的時(shí)間蹄溉。這種模式下咨油, Redis 的性能會最快。
(2)always:在每次寫請求后都調(diào)用 fsync() 柒爵。這種模式下役电, Redis 會相對較慢,但數(shù)據(jù)最安全餐弱。
(3)everysec:每秒鐘調(diào)用一次 fsync() 宴霸。這是性能和安全的折衷囱晴。
默認(rèn)情況下為 everysec 膏蚓。
appendfsync everysec
當(dāng) fsync 方式設(shè)置為 always 或 everysec 時(shí),如果后臺持久化進(jìn)程需要執(zhí)行一個(gè)很大的磁盤IO操作畸写,那么 Redis 可能會在 fsync() 調(diào)用時(shí)卡住驮瞧。目前尚未修復(fù)這個(gè)問題,這是因?yàn)榧词刮覀冊诹硪粋€(gè)新的線程中去執(zhí)行 fsync() 枯芬,也會阻塞住同步寫調(diào)用论笔。
為了緩解這個(gè)問題,我們可以使用下面的配置項(xiàng)千所,這樣的話狂魔,當(dāng) BGSAVE 或 BGWRITEAOF 運(yùn)行時(shí), fsync() 在主進(jìn)程中的調(diào)用會被阻止淫痰。這意味著當(dāng)另一路進(jìn)程正在對 AOF 文件進(jìn)行重構(gòu)時(shí)最楷, Redis 的持久化功能就失效了,就好像我們設(shè)置了 “appendsync none” 一樣。如果 Redis 有時(shí)延問題籽孙,那么可以將下面的選項(xiàng)設(shè)置為yes烈评。否則請保持no,因?yàn)檫@是保證數(shù)據(jù)完整性的最安全的選擇犯建。
no-appendfsync-on-rewrite no
我們允許 Redis 自動重寫 aof 讲冠。當(dāng) aof 增長到一定規(guī)模時(shí), Redis 會隱式調(diào)用 BGREWRITEAOF 來重寫log文件适瓦,以縮減文件體積竿开。
Redis 是這樣工作的: Redis 會記錄上次重寫時(shí)的 aof 大小。假如 Redis 自啟動至今還沒有進(jìn)行過重寫犹菇,那么啟動時(shí) aof 文件的大小會被作為基準(zhǔn)值德迹。這個(gè)基準(zhǔn)值會和當(dāng)前的 aof 大小進(jìn)行比較。如果當(dāng)前 aof 大小超出所設(shè)置的增長比例揭芍,則會觸發(fā)重寫胳搞。另外還需要設(shè)置一個(gè)最小大小,是為了防止在 aof 很小時(shí)就觸發(fā)重寫称杨。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
如果設(shè)置 auto-aof-rewrite-percentage 為0肌毅,則會關(guān)閉此重寫功能。
指Redis在恢復(fù)時(shí)姑原,會忽略最后一條可能存在問題的指令悬而,默認(rèn)值yes。即在 aof 寫入時(shí)锭汛,可能存在指令寫錯(cuò)的問題(突然斷電笨奠,寫了一半),這種情況下唤殴,yes會log并繼續(xù)般婆,而no會直接恢復(fù)失敗。
aof-load-truncated yes
1.7 LUA腳本配置
lua 腳本的最大運(yùn)行時(shí)間是需要被嚴(yán)格限制的朵逝,單位是毫秒:
lua-time-limit 5000
如果此值設(shè)置為0或負(fù)數(shù)蔚袍,則既不會有報(bào)錯(cuò)也不會有時(shí)間限制。
1.8 集群設(shè)置
平常的 Redis 實(shí)例不能作為集群的節(jié)點(diǎn)配名,只有作為集群節(jié)點(diǎn)啟動的實(shí)例才可以啤咽。下面的配置可以是 Redis 實(shí)例作為集群節(jié)點(diǎn)啟動:
cluster-enabled yes
每個(gè)集群節(jié)點(diǎn)都有一個(gè)集群配置文件,該文件是由集群節(jié)點(diǎn)來創(chuàng)建和維護(hù)的渠脉,不能人工參與宇整。每個(gè)集群節(jié)點(diǎn)需要不同的配置文件,所以需要保證同一個(gè)系統(tǒng)下的集群節(jié)點(diǎn)沒有重名的配置文件芋膘,建議以端口號標(biāo)記配置文件鳞青。
cluster-config-file nodes-6379.conf
當(dāng)節(jié)點(diǎn)超時(shí)大于 cluster-node-timeout 的時(shí)候后涩哟,就會被認(rèn)為宕機(jī)了,單位為毫秒盼玄。
cluster-node-timeout 15000
Redis 集群有一種 failover (故障轉(zhuǎn)移)機(jī)制贴彼,即當(dāng)主 Redis 宕機(jī)之后,會有一個(gè)最合適的從 Redis 充當(dāng)主 Redis 埃儿。但是器仗,當(dāng)從 Redis 的數(shù)據(jù)“太老”了,與住 Redis 的標(biāo)準(zhǔn)數(shù)據(jù)偏差很大童番,為了保證數(shù)據(jù)一致性精钮, Redis 會放棄 failover 。判別從 Redis 的的數(shù)據(jù)是不是“太老”有兩種方法:
(1)如果有多個(gè)從 Redis 可以接替主 Redis 的工作剃斧,則它們會交換信息轨香,選取“最佳復(fù)制偏移”(接受了原主 Redis 最多的數(shù)據(jù)同步)的從 Redis 作為下一任主 Redis 。
(2)每個(gè)從Redis計(jì)算與原主Redis最后一次數(shù)據(jù)同步的時(shí)間幼东,當(dāng)最短的時(shí)間間隔大于某個(gè)臨界點(diǎn)的時(shí)候臂容,集群則放棄failover。
方法(2)當(dāng)中的臨界點(diǎn)可以通過配置調(diào)節(jié)根蟹,臨界點(diǎn)的計(jì)算規(guī)則為:
(node-timeout * slave-validity-factor)+ repl-ping-slave-period
如node-timeout為30秒脓杉,slave-validity-factor為10秒,repl-ping-slave-period為10秒简逮,當(dāng)與原主Redis最后一次對話的時(shí)間間隔超過310秒的時(shí)候球散,集群就會放棄failover。
當(dāng)slave-validity-factor太大會使一臺數(shù)據(jù)“太老”的從Redis充當(dāng)主Redis散庶;而slave-validity-factor太小可能會造成找不到合適的從Redis繼任蕉堰。
默認(rèn)的slave-validity-factor為10。
cluster-slave-validity-factor 10
考慮一種極端情況悲龟,集群有一臺主Redis和四臺從Redis屋讶,從Redis全部掛掉,failover機(jī)制有可能造成集群只有主Redis而無從Redis的尷尬境況躲舌。為了保證集群的名副其實(shí)丑婿,可以規(guī)定性雄,當(dāng)從Redis少于某個(gè)數(shù)量時(shí)没卸,拒絕執(zhí)行failover。
cluster-migration-barrier 1
默認(rèn)情況下秒旋,當(dāng)集群檢測到某個(gè)哈希槽(hash slot)沒有被覆蓋(沒有任何節(jié)點(diǎn)為此服務(wù))會停止接受查詢服務(wù)约计,如果集群部分宕機(jī)最終會導(dǎo)致整個(gè)集群不可用,當(dāng)哈希槽重新被全覆蓋的時(shí)候會自動變?yōu)榭捎们ㄉ浮H绻M切┕2郾桓采w的集群節(jié)點(diǎn)繼續(xù)接受查詢服務(wù)煤蚌,需要將cluster-require-full-coverage設(shè)置為no。
cluster-require-full-coverage yes
1.9 慢日志配置
Redis慢日志是指一個(gè)系統(tǒng)進(jìn)行日志查詢超過了指定的時(shí)長。這個(gè)時(shí)長不包括IO操作尉桩,比如與客戶端的交互筒占、發(fā)送響應(yīng)內(nèi)容等,而僅包括實(shí)際執(zhí)行查詢命令的時(shí)間蜘犁。
針對慢日志可以設(shè)置兩個(gè)參數(shù)翰苫,一個(gè)是執(zhí)行時(shí)長,單位是微秒这橙,另一個(gè)是慢日志的長度奏窑。當(dāng)一個(gè)新的命令被寫入日志時(shí),最老的一條會從命令日志隊(duì)列中被移除屈扎。單位是微秒埃唯,即1000000表示一秒。負(fù)數(shù)則會禁用慢日志功能鹰晨,而0則表示強(qiáng)制記錄每一個(gè)命令墨叛。
slowlog-log-slower-than 10000
慢日志最大長度,可以隨便填寫數(shù)值模蜡,沒有上限巍实,但要注意它會消耗內(nèi)存×梗可以使用SLOWLOG RESET來重設(shè)這個(gè)值棚潦。
slowlog-max-len 128
1.10 延遲監(jiān)控配置
Redis的延遲監(jiān)控子系統(tǒng)會在運(yùn)行時(shí)對不同操作取樣,以此來收集與延遲相關(guān)的數(shù)據(jù)膝昆,這些信息可以通過LATENCY命令以報(bào)表的形式呈現(xiàn)給用戶丸边。
系統(tǒng)只會記錄那些執(zhí)行時(shí)間等于或大于atency-monitor-threshold的操作,該值默認(rèn)為0荚孵,代表關(guān)閉監(jiān)控妹窖,因?yàn)槭占舆t數(shù)據(jù)多少會影響Redis的性能。
latency-monitor-threshold 0
1.11事件通知配置
Redis可以向客戶端通知某些事件的發(fā)生收叶。
例如骄呼,鍵空間(keyspace)時(shí)間通知如果開啟,一個(gè)客戶端對Database 0中的“foo”鍵執(zhí)行了DEL操作判没,兩條信息會通過Pub/Sub發(fā)布出去:
PUBLISH__keyspace@0__:foo del
PUBLISH__keyevent@0__:del foo
可以選擇需要發(fā)送哪種類型的通知蜓萄,每種類型用一個(gè)字母代表:
K 鍵空間事件,發(fā)布到“keyspace@<db> prefix”頻道
E 鍵事件, 發(fā)布到“ keyevent@<db> prefix”頻道
g 通用事件,比如 DEL,EXPIRE, RENAME, ...等操作都屬于
$ String操作
l List操作
s Set操作
h Hash操作
z Sorted set操作
x 過期操作
e 驅(qū)逐操作(因?yàn)閮?nèi)存不足數(shù)據(jù)被刪除)
A 代表“g$lshzxe”的組合, 所以“AKE”可以代表所有事件
notify-keyspace-events配置以上述的字母組合為參數(shù)澄峰,舉例說明:
(1)notify-keyspace-events Elg
當(dāng)有List操作或通用操作嫉沽,發(fā)布通知到“ keyevent@<db> prefix”頻道
(2)notify-keyspace-events Ex
當(dāng)有鍵的過期操作時(shí),發(fā)布通知到“keyevent@0:expired”頻道
默認(rèn)情況下俏竞,notify-keyspace-events的參數(shù)為空字符串绸硕,代表關(guān)閉通知堂竟。
notify-keyspace-events ""
1.12 高級配置
Hash 在條目數(shù)量較小的時(shí)候會使用一種高效的內(nèi)存數(shù)據(jù)結(jié)構(gòu)編碼,當(dāng)超過某個(gè)臨界點(diǎn)就會采用另一種存儲方式玻佩,該臨界點(diǎn)由下面的兩個(gè)配置決定:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
與Hash類似出嘹,較小的List會以一種特殊的編碼方式來節(jié)省空間,只要List不超過下面的上限:
list-max-ziplist-entries 512
list-max-ziplist-value 64
Set只有在滿足下面的條件時(shí)才會采用特殊編碼方式:Set中存儲的恰好都是十進(jìn)制的整數(shù)咬崔,而且長度不超過64位(有符號)疚漆。數(shù)量上限為:
set-max-intset-entries 512
同樣,有序集合也會采用特殊編碼來節(jié)省空間刁赦,只要不超過上限:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
RedisHyperLogLog 是用來做基數(shù)統(tǒng)計(jì)的算法娶聘,HyperLogLog 的優(yōu)點(diǎn)是,在輸入元素的數(shù)量或者體積非常非常大時(shí)甚脉,計(jì)算基數(shù)所需的空間總是固定并且很小的丸升。當(dāng)HyperLogLog用稀疏式表示法時(shí)所用內(nèi)存超過下面的限制,就會轉(zhuǎn)換成稠密式表示牺氨,為了更高的內(nèi)存利用率狡耻,官方建議值為3000。
hll-sparse-max-bytes 3000
Redis 在每 100 毫秒時(shí)使用 1 毫秒的 CPU時(shí)間來對 Redis 的 hash 表進(jìn)行重新 hash 猴凹。當(dāng)使用場景中有非常嚴(yán)格的實(shí)時(shí)性需要夷狰,不能夠接受 Redis 時(shí)不時(shí)的對請求有 2 毫秒的延遲的話,把這項(xiàng)配置為 no 郊霎。
如果沒有這么嚴(yán)格的實(shí)時(shí)性要求沼头,可以設(shè)置為 yes ,以便能夠盡可能快的釋放內(nèi)存书劝。
activerehashing yes
客戶端的輸出緩沖區(qū)的限制进倍,因?yàn)槟撤N原因客戶端從服務(wù)器讀取數(shù)據(jù)的速度不夠快,可用于強(qiáng)制斷開連接(一個(gè)常見的原因是一個(gè)發(fā)布 / 訂閱客戶端消費(fèi)消息的速度無法趕上生產(chǎn)它們的速度)购对。
可以三種不同客戶端的方式進(jìn)行設(shè)置:
(1)normal -> 正郴ィ客戶端
(2)slave -> slave 和 MONITOR 客戶端
(3)pubsub -> 至少訂閱了一個(gè) pubsub channel 或 pattern 的客戶端
每個(gè)client-output-buffer-limit 語法 :
client-output-buffer-limit<class> <hard limit> <soft limit> <soft seconds> 一旦達(dá)到硬限制客戶端會立即斷開,或者達(dá)到軟限制并保持達(dá)成的指定秒數(shù)(連續(xù))骡苞。
例如垂蜗,如果硬限制為 32 兆字節(jié)和軟限制為 16 兆字節(jié) /10 秒,如果輸出緩沖區(qū)的大小達(dá)到 32 兆字節(jié)解幽,客戶端將會立即斷開贴见,客戶端達(dá)到 16 兆字節(jié)和連續(xù)超過了限制 10 秒,也將斷開連接亚铁。
默認(rèn) normal 客戶端不做限制蝇刀,因?yàn)樗麄冊谝粋€(gè)請求后未要求時(shí)(以推的方式)不接收數(shù)據(jù)螟加,只有異步客戶端可能會出現(xiàn)請求數(shù)據(jù)的速度比它可以讀取的速度快的場景徘溢。
把硬限制和軟限制都設(shè)置為 0 來禁用該特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
Redis 會按照一定的頻率來執(zhí)行后臺任務(wù)吞琐,比如關(guān)閉超時(shí)的客戶端,清除過期鍵等然爆。不是所有的任務(wù)都會按照相同的頻率來執(zhí)行站粟,但 Redis 依照指定的“ Hz ”值來執(zhí)行檢查任務(wù)。
hz 10
aof rewrite 過程中曾雕,是否采取增量文件同步策略奴烙,默認(rèn)為“yes”。 rewrite 過程中,每32M數(shù)據(jù)進(jìn)行一次文件同步剖张,這樣可以減少 aof 大文件寫入對磁盤的操作次數(shù)切诀。
aof-rewrite-incremental-fsync yes