Redis啟動(dòng)的時(shí)候,可以指定配置文件,如下:
1
|
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis .conf |
Redis.conf文件內(nèi)容詳細(xì)說(shuō)明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
# 默認(rèn)redis不是以后臺(tái)進(jìn)程的方式啟動(dòng),如果需要在后臺(tái)運(yùn)行,需要將這個(gè)值設(shè)置成yes # 以后臺(tái)方式啟動(dòng)的時(shí)候,redis會(huì)寫(xiě)入默認(rèn)的進(jìn)程文件/var/run/redis.pid daemonize yes # redis啟動(dòng)的進(jìn)程路徑 pidfile /var/run/redis .pid # 啟動(dòng)進(jìn)程端口號(hào),這里最好不要使用默認(rèn)的6379,容易被攻擊 port 7179 tcp-backlog 511 # 配置redis監(jiān)聽(tīng)到的ip地址,可以是一個(gè)也可以多個(gè) bind 127.0.0.110.254.3.42 # redis的sock路徑 unixsocket /tmp/redis .sock unixsocketperm 755 # 超時(shí)時(shí)間 timeout 0 #指定TCP連接是否為長(zhǎng)連接,"偵探"信號(hào)有server端維護(hù)。默認(rèn)為0.表示禁用 tcp-keepalive 0 # 日志級(jí)別,log 等級(jí)分為4 級(jí),debug,verbose,notice, 和warning。生產(chǎn)環(huán)境下一般開(kāi)啟notice loglevel notice # 日志文件地址 logfile "/usr/local/redis/logs/redis.log" # 設(shè)置數(shù)據(jù)庫(kù)的個(gè)數(shù),可以使用SELECT 命令來(lái)切換數(shù)據(jù)庫(kù)。默認(rèn)使用的數(shù)據(jù)庫(kù)是0號(hào)庫(kù)。默認(rèn)16個(gè)庫(kù) databases 16 #RDB方式的持久化是通過(guò)快照(snapshotting)完成的,當(dāng)符合一定條件時(shí)Redis會(huì)自動(dòng)將內(nèi)存中的所有數(shù)據(jù)進(jìn)行快照并存儲(chǔ)在硬盤(pán)上。進(jìn)行快照的條件可以由用戶(hù)在配置文件中自定義,由兩個(gè)參數(shù)構(gòu)成:時(shí)間和改動(dòng)的鍵的個(gè)數(shù)。當(dāng)在指定的時(shí)間內(nèi)被更改的鍵的個(gè)數(shù)大于指定的數(shù)值時(shí)就會(huì)進(jìn)行快照。RDB是Redis默認(rèn)采用的持久化方式,在配置文件中已經(jīng)預(yù)置了3個(gè)條件: save 900 1 # 900秒內(nèi)有至少1個(gè)鍵被更改則進(jìn)行快照 save 300 10 # 300秒內(nèi)有至少10個(gè)鍵被更改則進(jìn)行快照 save 60 10000 # 60秒內(nèi)有至少10000個(gè)鍵被更改則進(jìn)行快照 # 持久化數(shù)據(jù)存儲(chǔ)目錄 dir /usr/local/redis/data #當(dāng)持久化出現(xiàn)錯(cuò)誤時(shí),是否依然繼續(xù)進(jìn)行工作,是否終止所有的客戶(hù)端write請(qǐng)求。默認(rèn)設(shè)置"yes"表示終止,一旦snapshot數(shù)據(jù)保存故障,那么此server為只讀服務(wù)。如果為"no",那么此次snapshot將失敗,但下一次snapshot不會(huì)受到影響,不過(guò)如果出現(xiàn)故障,數(shù)據(jù)只能恢復(fù)到"最近一個(gè)成功點(diǎn)" stop-writes-on-bgsave-errorno #在進(jìn)行數(shù)據(jù)鏡像備份時(shí),是否啟用rdb文件壓縮手段,默認(rèn)為yes。壓縮可能需要額外的cpu開(kāi)支,不過(guò)這能夠有效的減小rdb文件的大,有利于存儲(chǔ)/備份/傳輸/數(shù)據(jù)恢復(fù) rdbcompression yes #checksum文件檢測(cè),讀取寫(xiě)入的時(shí)候rdb文件checksum,會(huì)損失一些性能 rdbchecksum yes #鏡像備份文件的文件名,默認(rèn)為dump.rdb dbfilename dump.rdb #當(dāng)主master服務(wù)器掛機(jī)或主從復(fù)制在進(jìn)行時(shí),是否依然可以允許客戶(hù)訪問(wèn)可能過(guò)期的數(shù)據(jù)。在"yes"情況下,slave繼續(xù)向客戶(hù)端提供只讀服務(wù),有可能此時(shí)的數(shù)據(jù)已經(jīng)過(guò)期;在"no"情況下,任何向此server發(fā)送的數(shù)據(jù)請(qǐng)求服務(wù)(包括客戶(hù)端和此server的slave)都將被告知"error" slave-serve-stale-datayes # 如果是slave庫(kù),只允許只讀,不允許修改 slave- read -only yes #slave與master的連接,是否禁用TCPnodelay選項(xiàng)。"yes"表示禁用,那么socket通訊中數(shù)據(jù)將會(huì)以packet方式發(fā)送(packet大小受到socket buffer限制)。可以提高socket通訊的效率(tcp交互次數(shù)),但是小數(shù)據(jù)將會(huì)被buffer,不會(huì)被立即發(fā)送,對(duì)于接受者可能存在延遲。"no"表示開(kāi)啟tcp nodelay選項(xiàng),任何數(shù)據(jù)都會(huì)被立即發(fā)送,及時(shí)性較好,但是效率較低,建議設(shè)為no,在高并發(fā)或者主從有大量操作的情況下,設(shè)置為yes repl-disable-tcp-nodelayno #適用Sentinel模塊(unstable,M-S集群管理和監(jiān)控),需要額外的配置文件支持。slave的權(quán)重值,默認(rèn)100.當(dāng)master失效后,Sentinel將會(huì)從slave列表中找到權(quán)重值最低(>0)的slave,并提升為master。如果權(quán)重值為0,表示此slave為"觀察者",不參與master選舉 slave-priority 100 #限制同時(shí)連接的客戶(hù)數(shù)量。當(dāng)連接數(shù)超過(guò)這個(gè)值時(shí),redis 將不再接收其他連接請(qǐng)求,客戶(hù)端嘗試連接時(shí)將收到error 信息。默認(rèn)為10000,要考慮系統(tǒng)文件描述符限制,不宜過(guò)大,浪費(fèi)文件描述符,具體多少根據(jù)具體情況而定 maxclients 10000 #redis-cache所能使用的最大內(nèi)存(bytes),默認(rèn)為0,表示"無(wú)限制",最終由OS物理內(nèi)存大小決定(如果物理內(nèi)存不足,有可能會(huì)使用swap)。此值盡量不要超過(guò)機(jī)器的物理內(nèi)存尺寸,從性能和實(shí)施的角度考慮,可以為物理內(nèi)存3/4。此配置需要和"maxmemory-policy"配合使用,當(dāng)redis中內(nèi)存數(shù)據(jù)達(dá)到maxmemory時(shí),觸發(fā)"清除策略"。在"內(nèi)存不足"時(shí),任何write操作(比如set,lpush等)都會(huì)觸發(fā)"清除策略"的執(zhí)行。在實(shí)際環(huán)境中,建議redis的所有物理機(jī)器的硬件配置保持一致(內(nèi)存一致),同時(shí)確保master/slave中"maxmemory""policy"配置一致。 maxmemory 0 #內(nèi)存過(guò)期策略,內(nèi)存不足"時(shí),數(shù)據(jù)清除策略,默認(rèn)為"volatile-lru"。 #volatile-lru ->對(duì)"過(guò)期集合"中的數(shù)據(jù)采取LRU(近期最少使用)算法.如果對(duì)key使用"expire"指令指定了過(guò)期時(shí)間,那么此key將會(huì)被添加到"過(guò)期集合"中。將已經(jīng)過(guò)期/LRU的數(shù)據(jù)優(yōu)先移除.如果"過(guò)期集合"中全部移除仍不能滿足內(nèi)存需求,將OOM. #allkeys-lru ->對(duì)所有的數(shù)據(jù),采用LRU算法 #volatile-random ->對(duì)"過(guò)期集合"中的數(shù)據(jù)采取"隨即選取"算法,并移除選中的K-V,直到"內(nèi)存足夠"為止. 如果如果"過(guò)期集合"中全部移除全部移除仍不能滿足,將OOM #allkeys-random ->對(duì)所有的數(shù)據(jù),采取"隨機(jī)選取"算法,并移除選中的K-V,直到"內(nèi)存足夠"為止 #volatile-ttl ->對(duì)"過(guò)期集合"中的數(shù)據(jù)采取TTL算法(最小存活時(shí)間),移除即將過(guò)期的數(shù)據(jù). #noeviction ->不做任何干擾操作,直接返回OOM異常 #另外,如果數(shù)據(jù)的過(guò)期不會(huì)對(duì)"應(yīng)用系統(tǒng)"帶來(lái)異常,且系統(tǒng)中write操作比較密集,建議采取"allkeys-lru" maxmemory-policyvolatile-lru # 默認(rèn)值5,上面LRU和最小TTL策略并非嚴(yán)謹(jǐn)?shù)牟呗裕谴蠹s估算的方式,因此可以選擇取樣值以便檢查 maxmemory-samples 5 #默認(rèn)情況下,redis 會(huì)在后臺(tái)異步的把數(shù)據(jù)庫(kù)鏡像備份到磁盤(pán),但是該備份是非常耗時(shí)的,而且備份也不能很頻繁。所以redis 提供了另外一種更加高效的數(shù)據(jù)庫(kù)備份及災(zāi)難恢復(fù)方式。開(kāi)啟append only 模式之后,redis 會(huì)把所接收到的每一次寫(xiě)操作請(qǐng)求都追加到appendonly.aof 文件中,當(dāng)redis 重新啟動(dòng)時(shí),會(huì)從該文件恢復(fù)出之前的狀態(tài)。但是這樣會(huì)造成appendonly.aof 文件過(guò)大,所以redis 還支持了BGREWRITEAOF 指令,對(duì)appendonly.aof 進(jìn)行重新整理。如果不經(jīng)常進(jìn)行數(shù)據(jù)遷移操作,推薦生產(chǎn)環(huán)境下的做法為關(guān)閉鏡像,開(kāi)啟appendonly.aof,同時(shí)可以選擇在訪問(wèn)較少的時(shí)間每天對(duì)appendonly.aof 進(jìn)行重寫(xiě)一次。 #另外,對(duì)master機(jī)器,主要負(fù)責(zé)寫(xiě),建議使用AOF,對(duì)于slave,主要負(fù)責(zé)讀,挑選出1-2臺(tái)開(kāi)啟AOF,其余的建議關(guān)閉 appendonly yes #aof文件名字,默認(rèn)為appendonly.aof appendfilename "appendonly.aof" # 設(shè)置對(duì)appendonly.aof 文件進(jìn)行同步的頻率。always表示每次有寫(xiě)操作都進(jìn)行同步,everysec 表示對(duì)寫(xiě)操作進(jìn)行累積,每秒同步一次。no不主動(dòng)fsync,由OS自己來(lái)完成。這個(gè)需要根據(jù)實(shí)際業(yè)務(wù)場(chǎng)景進(jìn)行配置 appendfsync everysec # 在aof rewrite期間,是否對(duì)aof新記錄的append暫緩使用文件同步策略,主要考慮磁盤(pán)IO開(kāi)支和請(qǐng)求阻塞時(shí)間。默認(rèn)為no,表示"不暫緩",新的aof記錄仍然會(huì)被立即同步 no-appendfsync-on-rewriteno #當(dāng)Aof log增長(zhǎng)超過(guò)指定比例時(shí),重寫(xiě)logfile,設(shè)置為0表示不自動(dòng)重寫(xiě)Aof 日志,重寫(xiě)是為了使aof體積保持最小,而確保保存最完整的數(shù)據(jù)。 auto-aof-rewrite-percentage100 #觸發(fā)aof rewrite的最小文件尺寸 auto-aof-rewrite-min-size64mb #lua腳本執(zhí)行的最大時(shí)間,單位毫秒 lua- time -limit 5000 #慢日志記錄,單位微妙,10000就是10毫秒值,如果操作時(shí)間超過(guò)此值,將會(huì)把command信息"記錄"起來(lái).(內(nèi)存,非文件)。其中"操作時(shí)間"不包括網(wǎng)絡(luò)IO開(kāi)支,只包括請(qǐng)求達(dá)到server后進(jìn)行"內(nèi)存實(shí)施"的時(shí)間."0"表示記錄全部操作 slowlog-log-slower-than10000 #"慢操作日志"保留的最大條數(shù),"記錄"將會(huì)被隊(duì)列化,如果超過(guò)了此長(zhǎng)度,舊記錄將會(huì)被移除。可以通過(guò)"SLOWLOG<subcommand> args"查看慢記錄的信息(SLOWLOG get 10,SLOWLOG reset) slowlog-max-len 128 notify-keyspace-events "" #hash類(lèi)型的數(shù)據(jù)結(jié)構(gòu)在編碼上可以使用ziplist和hashtable。ziplist的特點(diǎn)就是文件存儲(chǔ)(以及內(nèi)存存儲(chǔ))所需的空間較小,在內(nèi)容較小時(shí),性能和hashtable幾乎一樣.因此redis對(duì)hash類(lèi)型默認(rèn)采取ziplist。如果hash中條目的條目個(gè)數(shù)或者value長(zhǎng)度達(dá)到閥值,將會(huì)被重構(gòu)為hashtable。 #這個(gè)參數(shù)指的是ziplist中允許存儲(chǔ)的最大條目個(gè)數(shù),,默認(rèn)為512,建議為128 hash -max-ziplist-entries512 #ziplist中允許條目value值最大字節(jié)數(shù),默認(rèn)為64,建議為1024 hash -max-ziplist-value64 #同上 list-max-ziplist-entries512 list-max-ziplist-value64 #intset中允許保存的最大條目個(gè)數(shù),如果達(dá)到閥值,intset將會(huì)被重構(gòu)為hashtable set -max-intset-entries512 #zset為有序集合,有2中編碼類(lèi)型:ziplist,skiplist。因?yàn)?quot;排序"將會(huì)消耗額外的性能,當(dāng)zset中數(shù)據(jù)較多時(shí),將會(huì)被重構(gòu)為skiplist。 zset-max-ziplist-entries128 #zset中允許條目value值最大字節(jié)數(shù),默認(rèn)為64,建議為1024 zset-max-ziplist-value64 #是否開(kāi)啟頂層數(shù)據(jù)結(jié)構(gòu)的rehash功能,如果內(nèi)存允許,請(qǐng)開(kāi)啟。rehash能夠很大程度上提高K-V存取的效率 activerehashing yes #客戶(hù)端buffer控制。在客戶(hù)端與server進(jìn)行的交互中,每個(gè)連接都會(huì)與一個(gè)buffer關(guān)聯(lián),此buffer用來(lái)隊(duì)列化等待被client接受的響應(yīng)信息。如果client不能及時(shí)的消費(fèi)響應(yīng)信息,那么buffer將會(huì)被不斷積壓而給server帶來(lái)內(nèi)存壓力.如果buffer中積壓的數(shù)據(jù)達(dá)到閥值,將會(huì)導(dǎo)致連接被關(guān)閉,buffer被移除。 #buffer控制類(lèi)型包括:normal -> 普通連接;slave->與slave之間的連接;pubsub ->pub/sub類(lèi)型連接,此類(lèi)型的連接,往往會(huì)產(chǎn)生此種問(wèn)題;因?yàn)閜ub端會(huì)密集的發(fā)布消息,但是sub端可能消費(fèi)不足.指令格式:client-output-buffer-limit <class> <hard><soft><seconds>",其中hard表示buffer最大值,一旦達(dá)到閥值將立即關(guān)閉連接;soft表示"容忍值",它和seconds配合,如果buffer值超過(guò)soft且持續(xù)時(shí)間達(dá)到了seconds,也將立即關(guān)閉連接,如果超過(guò)了soft但是在seconds之后,buffer數(shù)據(jù)小于了soft,連接將會(huì)被保留.其中hard和soft都設(shè)置為0,則表示禁用buffer控制.通常hard值大于soft. client-output-buffer-limitnormal 0 0 0 client-output-buffer-limitslave 256mb 64mb 60 client-output-buffer-limitpubsub 32mb 8mb 60 #Redis server執(zhí)行后臺(tái)任務(wù)的頻率,默認(rèn)為10,此值越大表示redis對(duì)"間歇性task"的執(zhí)行次數(shù)越頻繁(次數(shù)/秒)。"間歇性task"包括"過(guò)期集合"檢測(cè)、關(guān)閉"空閑超時(shí)"的連接等,此值必須大于0且小于500。此值過(guò)小就意味著更多的cpu周期消耗,后臺(tái)task被輪詢(xún)的次數(shù)更頻繁。此值過(guò)大意味著"內(nèi)存敏感"性較差。建議采用默認(rèn)值。 hz 10 #當(dāng)一個(gè)child在重寫(xiě)AOF文件的時(shí)候,如果aof-rewrite-incremental-fsync值為yes生效,那么這個(gè)文件會(huì)以每次32M數(shù)據(jù)的來(lái)被同步,這大量新增提交到磁盤(pán)是有用的,并且能避免高峰延遲。 aof-rewrite-incremental-fsyncyes #額外載入配置文件 # include /path/to/local.conf # include /path/to/other.conf |