做物流的在什么網(wǎng)站找客戶(hù)呢推廣互聯(lián)網(wǎng)推廣
詳細(xì)解讀redis配置文件
https://raw.githubusercontent.com/redis/redis/6.2/redis.conf
Units
- 配置數(shù)據(jù)單位換算關(guān)系
- 配置大小單位:當(dāng)需要內(nèi)存大小時(shí),可以指定。開(kāi)頭定義了一些基本的度量單位,只支持bytes,不支持bit,大小寫(xiě)不敏感,因此 1GB 1Gb 1gB 都是一樣的:
################## 該部分用于指定存儲(chǔ)單位的大小換算關(guān)系,不區(qū)分大小寫(xiě),只支持bytes,不支持bits
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
#
# units are case insensitive so 1GB 1Gb 1gB are all the same.
包含其它配置文件的信息 include path
對(duì)于公共部分配置,可以按以下方式配置引入。類(lèi)似jsp中的include,多實(shí)例的情況可以把公用的配置文件提取出來(lái):
# include /path/to/local.conf
# include /path/to/other.conf
Network 網(wǎng)絡(luò)相關(guān)
- bind IP1 [IP2 …]
這項(xiàng)配置綁定的IP并不是遠(yuǎn)程訪問(wèn)的客戶(hù)端的IP地址,而是本機(jī)的IP地址。
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
bind 127.0.0.1
本機(jī)的IP地址是和網(wǎng)卡(network interfaces)綁定在一起的,配置這項(xiàng)后,Redis只會(huì)接收來(lái)自指定網(wǎng)卡的數(shù)據(jù)包。比如我的主機(jī)有以下網(wǎng)卡:
root@VM-4-5-ubuntu:~# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 10.0.4.5 netmask 255.255.252.0 broadcast 10.0.7.255inet6 fe80::5054:ff:fe0b:843 prefixlen 64 scopeid 0x20<link>ether 52:54:00:0b:08:43 txqueuelen 1000 (Ethernet)RX packets 283943 bytes 28027507 (28.0 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 280878 bytes 43033240 (43.0 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 35168 bytes 2582220 (2.5 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 35168 bytes 2582220 (2.5 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果我想要讓Redis可以遠(yuǎn)程連接的話,就需要讓Redis監(jiān)聽(tīng)eht0這塊網(wǎng)卡,也就是要加上配置bind 127.0.0.1 10.0.4.5,這樣既可以本地訪問(wèn),也能夠遠(yuǎn)程訪問(wèn)。(主要bind只能有一行配置,如果有多個(gè)網(wǎng)卡要監(jiān)聽(tīng),就配置多個(gè)ip,用空格隔開(kāi),否者只有配置的最后一個(gè)bind生效)。
- 保護(hù)模式 protected-mode
從注釋信息就可以看到,如果protected-mode
是yes
的話,如果沒(méi)有指定bind
或者沒(méi)有指定密碼,那么只能本地訪問(wèn)。
protected-mode yes
- 端口號(hào) port
配置Redis監(jiān)聽(tīng)的端口號(hào),默認(rèn)6379。
# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379
- TCP半連接隊(duì)列長(zhǎng)度配置 tcp-backlog
在進(jìn)行TCP/IP連接時(shí),內(nèi)核會(huì)維護(hù)兩個(gè)隊(duì)列
syns queue
用于保存已收到sync
但沒(méi)有接收到ack
的TCP半連接請(qǐng)求。由/proc/sys/net/ipv4/tcp_max_syn_backlog
指定,我的系統(tǒng)(Ubuntu20.04)上是1024。accept queue
,用于保存已經(jīng)建立的連接,也就是全連接。由/proc/sys/net/core/somaxconn
指定。
根據(jù)配置里的注釋,需要同時(shí)提高somaxconn
和tcp_max_syn_backlog
的值來(lái)確保生效。
tcp-backlog 511
- 是否超時(shí)無(wú)操作關(guān)閉連接 timeout
客戶(hù)端經(jīng)過(guò)多少時(shí)間(單位秒)沒(méi)有操作就關(guān)閉連接,0代表永不關(guān)閉。
timeout 0
- TCP連接?;畈呗?tcp-keepalive
TCP連接保活策略,可以通過(guò)tcp-keepalive配置項(xiàng)來(lái)進(jìn)行設(shè)置,單位為秒,假如設(shè)置為60秒,則server端會(huì)每60秒向連接空閑的客戶(hù)端發(fā)起一次ACK請(qǐng)求,以檢查客戶(hù)端是否已經(jīng)掛掉,對(duì)于無(wú)響應(yīng)的客戶(hù)端則會(huì)關(guān)閉其連接。如果設(shè)置為0,則不會(huì)進(jìn)行?;顧z測(cè)。
tcp-keepalive 300
GENERAL 通用配置
- 啟動(dòng)方式 daemonize 是否以守護(hù)(后臺(tái))進(jìn)程的方式啟動(dòng),默認(rèn)no。
daemonize yes
- 進(jìn)程pid文件 pidfile
redis啟動(dòng)后會(huì)把pid寫(xiě)入到pidfile指定的文件中。
pidfile /var/run/redis_6379.pid
- 進(jìn)程pid文件 pidfile
redis啟動(dòng)后會(huì)把pid寫(xiě)入到pidfile指定的文件中。
pidfile /var/run/redis_6379.pid
- 日志相關(guān) loglevel logfile
loglevel
用于配置日志打印機(jī)別,默認(rèn)notice
:
debug
:能設(shè)置的最高的日志級(jí)別,打印所有信息,包括debug信息。verbose
:打印除了debug
日志之外的所有日志。notice
:打印除了debug
和verbose
級(jí)別的所有日志。warning
:僅打印非常重要的信息。
loglevel noticelogfile ""
- 指定數(shù)據(jù)庫(kù)的數(shù)量 databse
redis默認(rèn)有16個(gè)數(shù)據(jù)庫(kù),編號(hào)從0開(kāi)始。
databases 16
- 啟動(dòng)是否顯示logo
always-show-logo yes
SNAPSHOTTING 快照相關(guān)
SECURITY 安全相關(guān)
################################## SECURITY #################################### Warning: since Redis is pretty fast, an outside user can try up to
# 1 million passwords per second against a modern box. This means that you
# should use very strong passwords, otherwise they will be very easy to break.
# Note that because the password is really a shared secret between the client
# and the server, and should not be memorized by any human, the password
# can be easily a long string from /dev/urandom or whatever, so by using a
# long and unguessable password no brute force attack will be possible.
大致意思就是redis很快,所以被破解密碼時(shí),性能也很好,如果你的密碼太渣渣了,那么可能很快就被破解了,因此盡量使用長(zhǎng)且不容易被猜到的密碼作為redis的訪問(wèn)密碼。
配置ACL
ACL
:訪問(wèn)控制列表。
有兩種方法配置ACL:
- 在命令行通過(guò)ACL命令進(jìn)行配置
- 在Redis配置文件中開(kāi)始,可以直接在
redis.conf
中配置,也可以通過(guò)外部aclfile
配置。aclfile path
。
配置語(yǔ)法:user <username> ... acl rules ...
,例如?user worker +@list +@connection ~jobs:* on >ffa9203c493aa99
redis默認(rèn)有一個(gè)default
用戶(hù)。如果default
具有nopass
規(guī)則(就是說(shuō)沒(méi)有配置密碼),那么新連接將立即作為default
用戶(hù)登錄,無(wú)需通過(guò)AUTH
命令提供任何密碼。否則,連接會(huì)在未驗(yàn)證狀態(tài)下啟動(dòng),并需要AUTH
驗(yàn)證才能開(kāi)始工作。
描述用戶(hù)可以做的操作的ACL規(guī)則如下:
- 啟用或禁用用戶(hù)(已經(jīng)建立的連接不會(huì)生效)
on
?啟用用戶(hù),該用戶(hù)可以驗(yàn)證身份登陸。off
?禁用用戶(hù),該用戶(hù)不允許驗(yàn)證身份登陸。
- 允許/禁止用戶(hù)執(zhí)行某些命令
+<command>
?允許用戶(hù)執(zhí)行command
指示的命令?-<command>
?禁止用戶(hù)執(zhí)行command
指示的命令🈲+@<category>
?允許用戶(hù)執(zhí)行category
分類(lèi)中的所有命令?-@<category>
?禁止用戶(hù)執(zhí)行category
分類(lèi)中的所有命令🈲+<command>|subcommand
?允許執(zhí)行某個(gè)被禁止的command
的子命令subcommand
。沒(méi)有對(duì)應(yīng)的-
規(guī)則。?allcommands
+@all
的別名,允許執(zhí)行所有命令。?nocommands
-@all
的別名,禁止執(zhí)行所有命令。🈲
- 允許/禁止用戶(hù)訪問(wèn)某些Key
~<pattern>?
添加用戶(hù)可以訪問(wèn)的Key,比如~*
代表用戶(hù)可以訪問(wèn)所有key,~K*
代表用戶(hù)可訪問(wèn)以K
開(kāi)頭的key。?allkeys
?等價(jià)于~*
?resetkeys ~<pattern>?
刷新允許模式的列表,會(huì)覆蓋之前設(shè)置的模式。例如?user test ~* resetkeys ~K*
,則只允許訪問(wèn)匹配K*
的鍵,~*
失效。?
- 為用戶(hù)配置有效密碼
><password>
?將密碼添加到用戶(hù)的有效密碼列表中。例如user test >mypass on
,則用戶(hù)test可以使用mypass
驗(yàn)證。<<password>
?將密碼從用戶(hù)的有效密碼列表中刪除,即不可以使用該密碼驗(yàn)證。nopass
?使用任意密碼都可以成功驗(yàn)證。resetpass
?清除用戶(hù)可用密碼列表的數(shù)據(jù),并清除 nopass 狀態(tài)。之后該用戶(hù)不能登陸。直到重新設(shè)置密碼/設(shè)置nopass
。reset
?重置用戶(hù)到初始狀態(tài)。該命令會(huì)執(zhí)行以下操作:resetpass
,?resetkeys
,?off
,-@all
。
- ACL日志配置
設(shè)置ACL日志最大長(zhǎng)度,默認(rèn)128個(gè)記錄。這個(gè)日志是存在內(nèi)存里的。
acllog-max-len 128
- 外部ACL文件配置
默認(rèn)位置etc/redis/users.acl
,我們可以在這個(gè)文件中定義所有用戶(hù)的ACL
控制信息。
aclfile /etc/redis/users.acl
- 配置默認(rèn)用戶(hù)default的密碼
該配置只對(duì)默認(rèn)用戶(hù)default
生效。
requirepass yourpass
CLIENTS 客戶(hù)端配置
- 設(shè)置最大同時(shí)客戶(hù)端連接數(shù)
設(shè)置可以同時(shí)連接客戶(hù)端的最大數(shù)量。默認(rèn)該項(xiàng)設(shè)置為 10000 個(gè)客戶(hù)端。達(dá)到限制值后的連接會(huì)被拒絕并會(huì)返回錯(cuò)誤信息。
maxclients 10000
MEMORY MANAGEMENT 內(nèi)存管理
- maxmemory最大內(nèi)存限制 指定Redis最大內(nèi)存限制。達(dá)到內(nèi)存限制時(shí),Redis將嘗試刪除已到期或即將到期的Key。
- 建議設(shè)置,否則,將內(nèi)存占滿,造成服務(wù)器宕機(jī)
- 設(shè)置redis可以使用的內(nèi)存量。一旦到達(dá)內(nèi)存使用上限,redis將會(huì)試圖移除內(nèi)部數(shù)據(jù),移除規(guī)則可以通過(guò)maxmemory-policy來(lái)指定。
- 如果redis無(wú)法根據(jù)移除規(guī)則來(lái)移除內(nèi)存中的數(shù)據(jù),或者設(shè)置了“不允許移除”,那么redis則會(huì)針對(duì)那些需要申請(qǐng)內(nèi)存的指令返回錯(cuò)誤信息,比如SET、LPUSH等。
- 但是對(duì)于無(wú)內(nèi)存申請(qǐng)的指令,仍然會(huì)正常響應(yīng),比如GET等。如果你的redis是主redis(說(shuō)明你的redis有從redis),那么在設(shè)置內(nèi)存使用上限時(shí),需要在系統(tǒng)中留出一些內(nèi)存空間給同步隊(duì)列緩存,只有在你設(shè)置的是“不移除”的情況下,才不用考慮這個(gè)因素。
maxmemory <bytes>
- 達(dá)到最大內(nèi)存限制時(shí)的策略maxmemory-policy
配置達(dá)到最大內(nèi)存限制后,Redis進(jìn)行何種操作。默認(rèn)noeviction
maxmemory-policy noeviction
總共有8種策略可供選擇。
volatile-lru
?只對(duì)設(shè)置了過(guò)期時(shí)間的Key進(jìn)行淘汰,淘汰算法近似的LRU。allkeys-lru
?對(duì)所有Key進(jìn)行淘汰,LRU。volatile-lfu
?只對(duì)設(shè)置了過(guò)期時(shí)間的Key進(jìn)行淘汰,淘汰算法近似的LFU。allkeys-lfu
?對(duì)所有Key進(jìn)行淘汰,LFU。volatile-random
?只對(duì)設(shè)置了過(guò)期時(shí)間的Key進(jìn)行淘汰,淘汰算法為隨機(jī)淘汰。allkeys-random
?對(duì)所有Key進(jìn)行淘汰,隨機(jī)淘汰。volatile-ttl
?只對(duì)設(shè)置了過(guò)期時(shí)間的Key進(jìn)行淘汰,刪除即將過(guò)期的即ttl最小的。noeviction
?永不刪除key,達(dá)到最大內(nèi)存再進(jìn)行數(shù)據(jù)裝入時(shí)會(huì)返回錯(cuò)誤。
對(duì)于可以通過(guò)刪除key來(lái)釋放內(nèi)存的策略,如果沒(méi)有key可以刪除了,那么也會(huì)報(bào)錯(cuò)。
- 使用LRU/LFU/TTL算法時(shí)采樣率
Redis使用的是近似的LRU/LFU/minimal TTL算法。主要是為了節(jié)約內(nèi)存以及提升性能。Redis配置文件有maxmemory-samples
選項(xiàng),可以配置每次取樣的數(shù)量。Redis每次會(huì)選擇配置數(shù)量的key,然后根據(jù)算法從中淘汰最差的key。
maxmemory-samples 5
可以通過(guò)修改這個(gè)配置來(lái)獲取更高的淘汰精度或者更好的性能。默認(rèn)值5就可以獲得很好的結(jié)果。選擇10可以非常接近真是的LRU算法,但是會(huì)耗費(fèi)更多的CPU資源。3的話更快但是淘汰結(jié)果不是特別準(zhǔn)確。
- 從庫(kù)不淘汰數(shù)據(jù)
配置Redis主從復(fù)制時(shí),從庫(kù)超過(guò)maxmemory
也不淘汰數(shù)據(jù)。這個(gè)配置主要是為了保證主從庫(kù)的一致性,因?yàn)镽edis的淘汰策略是隨機(jī)的,如果允許從庫(kù)自己淘汰key,那么會(huì)導(dǎo)致主從不一致的現(xiàn)象出現(xiàn)(master節(jié)點(diǎn)刪除key的命令會(huì)同步給slave節(jié)點(diǎn))。
replica-ignore-maxmemory yes
- 過(guò)期keys駐留在內(nèi)存中的比例
設(shè)置過(guò)期keys仍然駐留在內(nèi)存中的比重,默認(rèn)是為1,表示最多只能有10%的過(guò)期key駐留在內(nèi)存中,該值設(shè)置的越小,那么在一個(gè)淘汰周期內(nèi),消耗的CPU資源也更多,因?yàn)樾枰獙?shí)時(shí)刪除更多的過(guò)期key。
active-expire-effort 1
LAZY FREEING 懶惰刪除
# Redis has two primitives to delete keys. One is called DEL and is a blocking
# deletion of the object. It means that the server stops processing new commands
# in order to reclaim all the memory associated with an object in a synchronous
# way. If the key deleted is associated with a small object, the time needed
# in order to execute the DEL command is very small and comparable to most other
# O(1) or O(log_N) commands in Redis. However if the key is associated with an
# aggregated value containing millions of elements, the server can block for
# a long time (even seconds) in order to complete the operation.
#
# For the above reasons Redis also offers non blocking deletion primitives
# such as UNLINK (non blocking DEL) and the ASYNC option of FLUSHALL and
# FLUSHDB commands, in order to reclaim memory in background. Those commands
# are executed in constant time. Another thread will incrementally free the
# object in the background as fast as possible.
# DEL, UNLINK and ASYNC option of FLUSHALL and FLUSHDB are user-controlled.
# It's up to the design of the application to understand when it is a good
# idea to use one or the other. However the Redis server sometimes has to
# delete keys or flush the whole database as a side effect of other operations.
# Specifically Redis deletes objects independently of a user call in the
# following scenarios:
#
# 1) On eviction, because of the maxmemory and maxmemory policy configurations,
# in order to make room for new data, without going over the specified
# memory limit.
# 2) Because of expire: when a key with an associated time to live (see the
# EXPIRE command) must be deleted from memory.
# 3) Because of a side effect of a command that stores data on a key that may
# already exist. For example the RENAME command may delete the old key
# content when it is replaced with another one. Similarly SUNIONSTORE
# or SORT with STORE option may delete existing keys. The SET command
# itself removes any old content of the specified key in order to replace
# it with the specified string.
# 4) During replication, when a replica performs a full resynchronization with
# its master, the content of the whole database is removed in order to
# load the RDB file just transferred.
#
# In all the above cases the default is to delete objects in a blocking way,
# like if DEL was called. However you can configure each case specifically
# in order to instead release memory in a non-blocking way like if UNLINK
# was called, using the following configuration directives.
翻譯上面的話就是:
Redis有兩個(gè)刪除keys的原語(yǔ)。一個(gè)是DEL
并且它是一個(gè)阻塞的刪除對(duì)象的操作。意味著server會(huì)停止處理新的command
以便以同步的方式回收與對(duì)象關(guān)聯(lián)的所有內(nèi)存。如果被刪除的key關(guān)聯(lián)的是一個(gè)小對(duì)象,那么執(zhí)行DEL
命令所需要的時(shí)間非常短,與Redis中其它O(1)
或O(log_N)
的命令時(shí)間開(kāi)銷(xiāo)幾乎一樣。然鵝,如果key與包含了數(shù)百萬(wàn)個(gè)元素的大對(duì)象相關(guān)聯(lián),那么服務(wù)器為了完成刪除命令會(huì)阻塞很長(zhǎng)時(shí)間(甚至幾秒鐘)。
出于以上原因,Redis提供了非阻塞的刪除原語(yǔ),例如UNLINK
(非阻塞式的DEL
)和FLUSHALL
、FLUSHDB
命令的ASYNC
選項(xiàng),以便在后臺(tái)回收內(nèi)存。這些命令會(huì)在常量(固定的)時(shí)間內(nèi)執(zhí)行。另外一個(gè)線程會(huì)在后臺(tái)盡可能快的以漸進(jìn)式的方式釋放對(duì)象。
使用DEL
,UNLINK
以及FLUSHALL
和FLUSHDB
的ASYNC
選項(xiàng)是由用戶(hù)來(lái)控制的。這應(yīng)該由應(yīng)用程序的設(shè)計(jì)來(lái)決定使用其中的哪一個(gè)。 然鵝,作為其它操作的副作用,Redis server有時(shí)不得不去刪除keys或者刷新整個(gè)數(shù)據(jù)庫(kù)。具體來(lái)說(shuō),Redis在以下情況下會(huì)獨(dú)立于用戶(hù)調(diào)用而刪除對(duì)象:
1) 由于maxmemory
?和maxmemory policy
的設(shè)置,為了在不超出指定的內(nèi)存限制而為新對(duì)象騰出空間而逐出舊對(duì)象;
2) 因?yàn)檫^(guò)期:當(dāng)一個(gè)key設(shè)置了過(guò)期時(shí)間且必須從內(nèi)存中刪除時(shí);
3) 由于在已經(jīng)存在的key上存儲(chǔ)對(duì)象的命令的副作用。例如,RENAME
命令可能會(huì)刪除舊的key的內(nèi)容,當(dāng)該key的內(nèi)容被其它內(nèi)容代替時(shí)。類(lèi)似的,SUNIONSTORE
或者帶STORE
選項(xiàng)的SORT
命令可能會(huì)刪除已經(jīng)存在的keys。SET
命令會(huì)刪除指定鍵的任何舊內(nèi)容,以便使用指定字符串替換。
4)在復(fù)制過(guò)程中,當(dāng)副庫(kù)與主庫(kù)執(zhí)行完全重新同步時(shí),整個(gè)數(shù)據(jù)庫(kù)的內(nèi)容將被刪除,以便加載剛剛傳輸?shù)腞DB文件。
在上述所有情況下,默認(rèn)情況是以阻塞方式刪除對(duì)象,就像調(diào)用DEL一樣。但是,你可以使用以下配置指令專(zhuān)門(mén)配置每種情況,以非阻塞的方式釋放內(nèi)存,就像調(diào)用UNLINK
一樣。
相關(guān)的配置:
# 內(nèi)存達(dá)到設(shè)置的maxmemory時(shí),是否使用惰性刪除,對(duì)應(yīng)上面 1)
lazyfree-lazy-eviction no
# 過(guò)期keys是否惰性刪除,對(duì)應(yīng)上面 2)
lazyfree-lazy-expire no
# 內(nèi)部刪除選項(xiàng),對(duì)應(yīng)上面選項(xiàng) 3)的情況是否惰性刪除
lazyfree-lazy-server-del no
# slave接收完RDB文件后清空數(shù)據(jù)是否是惰性的,對(duì)應(yīng)上面情況 4)
replica-lazy-flush no# It is also possible, for the case when to replace the user code DEL calls
# with UNLINK calls is not easy, to modify the default behavior of the DEL
# command to act exactly like UNLINK, using the following configuration
# directive:# 是否將DEL調(diào)用替換為UNLINK,注釋里寫(xiě)的從user code里替換DEL調(diào)用為UNLINK調(diào)用可能并不是一件
# 容易的事,因此可以使用以下選項(xiàng),將DEL的行為替換為UNLINK
lazyfree-lazy-user-del no
THREADED I/O
Redis大體上是單線程的,但是也有一些場(chǎng)景使用額外的線程去做的,比如UNLINK
、slow I/O accesses
。
現(xiàn)在還可以在不同的I/O線程中處理Redis客戶(hù)端socket讀寫(xiě)。(只是網(wǎng)絡(luò)IO這塊兒成了多線程,執(zhí)行命令的那個(gè)家伙,還是單線程!)特別是因?yàn)閷?xiě)操作很慢,通常Redis的用戶(hù)使用pipeline來(lái)提升每個(gè)核心下的Redis性能,并且運(yùn)行多個(gè)Redis實(shí)例來(lái)實(shí)現(xiàn)擴(kuò)展。使用多線程I/O,不需要使用pipeline和實(shí)例切分,就可以輕松的提升兩倍的性能。
默認(rèn)情況下,多線程是禁用的,我們建議只在至少有4個(gè)或更多內(nèi)核的機(jī)器中啟用多線程,至少保留一個(gè)備用內(nèi)核。使用超過(guò)8個(gè)線程不太可能有多大幫助。我們還建議僅當(dāng)您確實(shí)存在性能問(wèn)題時(shí)才使用線程化I/O,因?yàn)槌荝edis實(shí)例能夠占用相當(dāng)大的CPU時(shí)間,否則使用此功能沒(méi)有意義。
redis.conf相關(guān)配置翻譯
- 配置IO線程數(shù)
如果你的機(jī)器是4核的,可以配置2個(gè)或者3個(gè)線程。如果你有8核,可以配置6個(gè)線程。通過(guò)下面這個(gè)參數(shù)來(lái)配置線程數(shù):
io-threads 4
將io-threads
設(shè)置為1將只使用主線程。當(dāng)啟用I/O線程時(shí),我們只使用多線程進(jìn)行寫(xiě)操作,也就是說(shuō),執(zhí)行write(2)
系統(tǒng)調(diào)用并將Client緩沖區(qū)傳輸?shù)教捉幼?。但?#xff0c;也可以通過(guò)將以下配置指令設(shè)置為yes
來(lái)啟用讀取線程和協(xié)議解析:
io-threads-do-reads no
通常情況下多線程的read并沒(méi)有什么卵用。
需要注意的兩點(diǎn)是:
- 這兩個(gè)配置不能運(yùn)行時(shí)通過(guò)
CONFIG SET
來(lái)改變,而且開(kāi)啟SSL功能時(shí),多線程I/O同樣不會(huì)生效。 - 如果你想用benchmark腳本測(cè)試多線程下的性能提升,確保benchmark也是多線程模式,在后面加上
--threads
參數(shù),來(lái)匹配Redis的線程數(shù)。不然看不到什么性能提升。
KERNEL?OOMCONTROL 設(shè)置OOM時(shí)終止哪些進(jìn)程
在Linux上,可以提示內(nèi)核OOM killer在OOM發(fā)生時(shí)應(yīng)該首先終止哪些進(jìn)程。
啟用此功能可使Redis根據(jù)其角色主動(dòng)控制其所有進(jìn)程的oom_score_adj值。默認(rèn)分?jǐn)?shù)將嘗試在所有其他進(jìn)程之前殺死背景子進(jìn)程,并在主進(jìn)程之前殺死從節(jié)點(diǎn)進(jìn)程。
Redis支持三個(gè)選項(xiàng):
no
:對(duì)oom-score-adj
不做任何修改(默認(rèn)值)yes
:relative
的別名absolute
:oom-score-adj-values
配置的值將寫(xiě)入內(nèi)核relative
:當(dāng)服務(wù)器啟動(dòng)時(shí),使用相對(duì)于oom_score_adj
初始值的值,然后將其限制在-1000到1000的范圍內(nèi)。因?yàn)槌跏贾低ǔ?,所以它們通常與絕對(duì)值匹配。
oom-score-adj no
當(dāng)使用oom-score-adj
選項(xiàng)(不為no
)時(shí),該指令控制用于主、從和后臺(tái)子進(jìn)程的特定值。數(shù)值范圍為-2000到2000(越高意味著死亡的可能性越大)。
非特權(quán)進(jìn)程(不是根進(jìn)程,也沒(méi)有CAP_SYS_RESOURCE功能)可以自由地增加它們的價(jià)值,但不能將其降低到初始設(shè)置以下。這意味著將oom score adj設(shè)置為“相對(duì)”,并將oom score adj值設(shè)置為正值將始終成功
# 分別控制主進(jìn)程、從進(jìn)程和后臺(tái)子進(jìn)程的值
oom-score-adj-values 0 200 800
APPEND ONLY MODE AOF持久化配置
- 開(kāi)始/關(guān)閉aof
appendonly no
- aof文件名稱(chēng)
appendfilename "appendonly.aof"
- 執(zhí)行fsync()系統(tǒng)調(diào)用刷盤(pán)的頻率
appendfsync everysec
everysec
:每秒執(zhí)行,可能會(huì)丟失最后一秒的數(shù)據(jù)。always
:每次寫(xiě)操作執(zhí)行,數(shù)據(jù)最安全,但是對(duì)性能有影響。no
:不強(qiáng)制刷盤(pán),由內(nèi)核決定什么時(shí)候刷盤(pán),數(shù)據(jù)最不安全,性能最好。- 當(dāng)有后臺(tái)保存任務(wù)時(shí),關(guān)閉appendfsync
當(dāng)后臺(tái)在執(zhí)行save任務(wù)或者aof文件的rewrite時(shí),會(huì)對(duì)磁盤(pán)造成大量I/O操作,在某些Linux配置中,Redis可能會(huì)在fsync()
系統(tǒng)調(diào)用上阻塞很長(zhǎng)時(shí)間。需要注意的是,目前還沒(méi)有很好的解決方法,因?yàn)榧词故窃诓煌木€程中執(zhí)行fsync()
調(diào)用也會(huì)阻塞write(2)
調(diào)用。
為了緩解上述問(wèn)題,可以使用以下選項(xiàng),防止在進(jìn)行BGSAVE
或者BGREWRITEAOF
時(shí)在主進(jìn)程中調(diào)用fsync()
。
這意味這如果有其它子進(jìn)程在執(zhí)行saving任務(wù)時(shí),Redis的行為相當(dāng)于配置了appendfsync none
。實(shí)際上,這意味著在最壞的情況下(使用Linux默認(rèn)設(shè)置),可能丟失最多30s的日志。
如果您有延遲的問(wèn)題(性能問(wèn)題),將此設(shè)置為“yes”,否則,設(shè)置為“no”。從持久化的角度看,這是最安全的選擇。
no-appendfsync-on-rewrite no
- 自動(dòng)重寫(xiě)aof文件
在AOF文件大小增長(zhǎng)到了指定的百分比(相對(duì)于上次AOF文件大小的增長(zhǎng)量)或者最小體積時(shí),自動(dòng)調(diào)用BGREWRITEAOF
命令重寫(xiě)AOF文件。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
- AOF文件末尾被截?cái)?/strong>
在Redis啟動(dòng)過(guò)程的最后,當(dāng)AOF數(shù)據(jù)加載回內(nèi)存時(shí),可能會(huì)發(fā)現(xiàn)AOF文件被截?cái)?。?dāng)運(yùn)行Redis的系統(tǒng)崩潰時(shí),可能會(huì)發(fā)生這種情況,尤其是在安裝ext4文件系統(tǒng)時(shí),沒(méi)有data=ordered
選項(xiàng)(然而,當(dāng)Redis本身崩潰或中止,但操作系統(tǒng)仍然正常工作時(shí),這種情況不會(huì)發(fā)生)。
Redis可以在出現(xiàn)這種情況時(shí)帶著錯(cuò)誤退出,也可以加載盡可能多的數(shù)據(jù)(現(xiàn)在是默認(rèn)值),并在發(fā)現(xiàn)AOF文件在最后被截?cái)鄷r(shí)啟動(dòng)。以下選項(xiàng)控制此行為。
如果aof load truncated設(shè)置為yes,則會(huì)加載一個(gè)被截?cái)嗟腶of文件,Redis服務(wù)器開(kāi)始發(fā)送日志,通知用戶(hù)該事件。否則,如果該選項(xiàng)設(shè)置為“no”,服務(wù)器將因錯(cuò)誤而中止并拒絕啟動(dòng)。當(dāng)選項(xiàng)設(shè)置為“no”時(shí),用戶(hù)需要使用“redis-check-aof”實(shí)用程序修復(fù)AOF文件,然后才能重新啟動(dòng)服務(wù)器。
請(qǐng)注意,如果在中間發(fā)現(xiàn)AOF文件已損壞,服務(wù)器仍將退出并出現(xiàn)錯(cuò)誤。此選項(xiàng)僅適用于Redis嘗試從AOF文件讀取更多數(shù)據(jù),但找不到足夠字節(jié)的情況。
aof-load-truncated yes
- 開(kāi)啟混合持久化
當(dāng)重寫(xiě)AOF文件時(shí),Redis能夠在AOF文件中使用RDB前導(dǎo),以更快地重寫(xiě)和恢復(fù)。啟用此選項(xiàng)后,重寫(xiě)的AOF文件由兩個(gè)不同的節(jié)組成:
[RDB file][AOF tail]
加載時(shí),Redis識(shí)別出AOF文件以“Redis”字符串開(kāi)頭,并加載帶前綴的RDB文件,然后繼續(xù)加載AOF尾部。
aof-use-rdb-preamble yes
LUA SCRIPTING-LUA腳本相關(guān)
- 配置LUA腳本最大執(zhí)行時(shí)長(zhǎng)
單位毫秒,默認(rèn)5s。當(dāng)腳本運(yùn)行時(shí)間超過(guò)限制后,Redis將開(kāi)始接受其他命令當(dāng)不會(huì)執(zhí)行,而是會(huì)返回BUSY
錯(cuò)誤。
lua-time-limit 5000
REDIS CLUSTER 集群配置
- 允許集群模式 只有以集群模式啟動(dòng)的Redis實(shí)例才能作為集群的節(jié)點(diǎn)
cluster-enabled yes
- 集群配置文件
由Redis創(chuàng)建維護(hù),不需要我們關(guān)心內(nèi)容,只需要配好位置即可
cluster-config-file nodes-6379.conf
- 節(jié)點(diǎn)超時(shí)時(shí)間
集群模式下,master節(jié)點(diǎn)之間會(huì)互相發(fā)送PING
心跳來(lái)檢測(cè)集群master節(jié)點(diǎn)的存活狀態(tài),超過(guò)配置的時(shí)間沒(méi)有得到響應(yīng),則認(rèn)為該master節(jié)點(diǎn)主觀宕機(jī)。
cluster-node-timeout 15000
- 設(shè)置副本有效因子
副本數(shù)據(jù)太老舊就不會(huì)被選為故障轉(zhuǎn)移的啟動(dòng)者。
副本沒(méi)有簡(jiǎn)單的方法可以準(zhǔn)確測(cè)量其“數(shù)據(jù)年齡”,因此需要執(zhí)行以下兩項(xiàng)檢查:
- 如果有多個(gè)復(fù)制副本能夠進(jìn)行故障切換,則它們會(huì)交換消息,以便嘗試為具有最佳復(fù)制偏移量的副本提供優(yōu)勢(shì)(已經(jīng)從master接收了盡可能多的數(shù)據(jù)的節(jié)點(diǎn)更可能成為新master)。復(fù)制副本將嘗試按偏移量獲取其排名,并在故障切換開(kāi)始時(shí)應(yīng)用與其排名成比例的延遲(排名越靠前的越早開(kāi)始故障遷移)。
- 每個(gè)副本都會(huì)計(jì)算最后一次與其主副本交互的時(shí)間。這可以是最后一次收到的
PING
或命令(如果主機(jī)仍處于“已連接”狀態(tài)),也可以是與主機(jī)斷開(kāi)連接后經(jīng)過(guò)的時(shí)間(如果復(fù)制鏈路當(dāng)前已關(guān)閉)。如果最后一次交互太舊,復(fù)制副本根本不會(huì)嘗試故障切換。
第二點(diǎn)的值可以由用戶(hù)調(diào)整。特別的,如果自上次與master交互以來(lái),經(jīng)過(guò)的時(shí)間大于(node-timeout * cluster-replica-validity-factor) + repl-ping-replica-period
,則不會(huì)成為新的master。
較大的cluster-replica-validity-factor
可能允許數(shù)據(jù)太舊的副本故障切換到主副本,而太小的值可能會(huì)阻止群集選擇副本。
為了獲得最大可用性,可以將cluster-replica-validity-factor
設(shè)置為0,這意味著,無(wú)論副本上次與主機(jī)交互的時(shí)間是什么,副本都將始終嘗試故障切換主機(jī)。(不過(guò),他們總是會(huì)嘗試應(yīng)用與其偏移等級(jí)成比例的延遲)。
0是唯一能夠保證當(dāng)所有分區(qū)恢復(fù)時(shí),集群始終能夠繼續(xù)的值(保證集群的可用性)。
cluster-replica-validity-factor 10
- 設(shè)置master故障轉(zhuǎn)移時(shí)保留的最少副本數(shù)
群集某個(gè)master的slave可以遷移到孤立的master,即沒(méi)有工作slave的master。這提高了集群抵御故障的能力,因?yàn)槿绻铝aster沒(méi)有工作slave,則在發(fā)生故障時(shí)無(wú)法對(duì)其進(jìn)行故障轉(zhuǎn)移。
只有在slave的舊master的其他工作slave的數(shù)量至少為給定數(shù)量時(shí),slave才會(huì)遷移到孤立的master。這個(gè)數(shù)字就是cluster-migration-barrier
。值為1意味著slave只有在其master至少有一個(gè)其他工作的slave時(shí)才會(huì)遷移,以此類(lèi)推。它通常反映集群中每個(gè)主機(jī)所需的副本數(shù)量。
默認(rèn)值為1(僅當(dāng)副本的主副本至少保留一個(gè)副本時(shí),副本才會(huì)遷移)。要禁用遷移,只需將其設(shè)置為非常大的值??梢栽O(shè)置值0,但僅對(duì)調(diào)試有用,并且在生產(chǎn)中很危險(xiǎn)。
cluster-migration-barrier 1
- 哈希槽全覆蓋檢查
默認(rèn)情況下,如果Redis群集節(jié)點(diǎn)檢測(cè)到至少有一個(gè)未覆蓋的哈希槽(沒(méi)有可用的節(jié)點(diǎn)為其提供服務(wù)),它們將停止接受查詢(xún)。這樣,如果集群部分關(guān)閉(例如,一系列哈希槽不再被覆蓋),那么所有集群最終都將不可用。一旦所有插槽再次被覆蓋,它就會(huì)自動(dòng)返回可用狀態(tài)。
然而,有時(shí)您希望正在工作的集群的子集繼續(xù)接受對(duì)仍然覆蓋的密鑰空間部分的查詢(xún)。為此,只需將cluster-require-full-coverage
選項(xiàng)設(shè)置為no。
cluster-require-full-coverage yes
- 是否自動(dòng)故障轉(zhuǎn)移
當(dāng)設(shè)置為“yes”時(shí),此選項(xiàng)可防止副本在主機(jī)故障期間嘗試故障切換master。但是,如果被迫這樣做,主機(jī)仍然可以執(zhí)行手動(dòng)故障切換。
這在不同的場(chǎng)景中很有用,尤其是在多個(gè)數(shù)據(jù)中心運(yùn)營(yíng)的情況下,如果不在DC(DataCenter?)完全故障的情況下,我們希望其中一方永遠(yuǎn)不會(huì)升級(jí)為master。
cluster-replica-no-failover no
- 集群失敗時(shí)允許節(jié)點(diǎn)處理讀請(qǐng)求
此選項(xiàng)設(shè)置為“yes”時(shí),允許節(jié)點(diǎn)在集群處于關(guān)閉狀態(tài)時(shí)提供讀取流量,只要它認(rèn)為自己擁有這些插槽。
這對(duì)兩種情況很有用。第一種情況適用于在節(jié)點(diǎn)故障或網(wǎng)絡(luò)分區(qū)期間應(yīng)用程序不需要數(shù)據(jù)一致性的情況。其中一個(gè)例子是緩存,只要節(jié)點(diǎn)擁有它應(yīng)該能夠?yàn)槠涮峁┓?wù)的數(shù)據(jù)。
第二個(gè)用例適用于不滿足三個(gè)分片集群,但又希望啟用群集模式并在以后擴(kuò)展的配置。不設(shè)置該選項(xiàng)而使用1或2分片配置中的master中斷服務(wù)會(huì)導(dǎo)致整個(gè)集群的讀/寫(xiě)服務(wù)中斷。如果設(shè)置此選項(xiàng),則只會(huì)發(fā)生寫(xiě)中斷。如果達(dá)不到master的quorum(客觀宕機(jī))數(shù)值,插槽所有權(quán)將不會(huì)自動(dòng)更改。
cluster-allow-reads-when-down no
CLUSTER DOCKER/NAT support
- 聲明訪問(wèn)IP、port
以下三項(xiàng)設(shè)置對(duì)NAT網(wǎng)絡(luò)或者Docker的支持。
因?yàn)镹AT端口映射的IP地址在局域網(wǎng)之外是沒(méi)辦法訪問(wèn)到的,因此在這種情況下,要聲明集群的公網(wǎng)網(wǎng)關(guān)(NAT映射)/宿主機(jī)的IP地址,以便局域網(wǎng)之外也可以訪問(wèn)到NAT映射后的/Docker容器內(nèi)的Redis集群中的每個(gè)實(shí)例。
cluster-announce-bus-port
集群節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)交換的額外端口。
cluster-announce-ip
cluster-announce-port
cluster-announce-bus-port
SLOW LOG 慢日志
Redis的慢查詢(xún)?nèi)罩竟δ苡糜?strong>記錄執(zhí)行時(shí)間超過(guò)給定時(shí)長(zhǎng)的命令請(qǐng)求,用戶(hù)可以通過(guò)這個(gè)功能產(chǎn)生的日志來(lái)監(jiān)視和優(yōu)化查詢(xún)速度
- 設(shè)置慢日志記錄閾值
超過(guò)這個(gè)值的命令會(huì)被記錄到慢日志中,默認(rèn)10000微秒。
slowlog-log-slower-than <microseconds>
- 慢日志文件大小
可以通過(guò)這個(gè)配置改變慢日志文件的最大長(zhǎng)度,超過(guò)這個(gè)長(zhǎng)度后最舊的記錄會(huì)被刪除。默認(rèn)128。
slowlog-max-len 128
LATENCY MONITOR 延遲監(jiān)控
Redis延遲監(jiān)控子系統(tǒng)在運(yùn)行時(shí)對(duì)不同的操作進(jìn)行采樣,以收集與Redis實(shí)例可能的延遲源相關(guān)的數(shù)據(jù)。
通過(guò)延遲命令,用戶(hù)可以打印圖表和獲取報(bào)告。
系統(tǒng)僅記錄在等于或大于通過(guò)延遲監(jiān)視器閾值配置指令指定的毫秒數(shù)的時(shí)間內(nèi)執(zhí)行的操作。當(dāng)其值設(shè)置為零時(shí),延遲監(jiān)視器將關(guān)閉。
默認(rèn)情況下,延遲監(jiān)控是禁用的,因?yàn)槿绻麤](méi)有延遲問(wèn)題,通常不需要延遲監(jiān)控,而且收集數(shù)據(jù)會(huì)對(duì)性能產(chǎn)生影響,雖然影響很小,但可以在大負(fù)載下進(jìn)行測(cè)量。如果需要,可以在運(yùn)行時(shí)使用命令CONFIG SET latency-monitor-threshold <millists>
輕松啟用延遲監(jiān)控。
- 設(shè)置延遲閾值
latency-monitor-threshold 0
EVENT NOTIFICATION 事件通知
實(shí)時(shí)的監(jiān)控keys和values的更改。
Redis可以將key space中發(fā)生的事件通過(guò)發(fā)布/訂閱通知客戶(hù)端。
例如,如果notify-keyspace-events
已經(jīng)啟用,并且客戶(hù)端對(duì)數(shù)據(jù)庫(kù)0中存儲(chǔ)的鍵foo
執(zhí)行DEL操作,則將通過(guò)Pub/Sub發(fā)布兩條消息:
- PUBLISH keyspace@0:foo del
- PUBLISH keyevent@0:del foo
可以在一組類(lèi)中選擇Redis將通知的事件。每個(gè)類(lèi)由一個(gè)字符標(biāo)識(shí):
K
?Keyspace事件,通過(guò)__keyspace@<db>__
前綴發(fā)布。E
?Keyevent事件,通過(guò)__keyevent@<db>__?
前綴發(fā)布。g
?通用命令(非特定類(lèi)型),例如DEL
,EXPIRE
,RENAME
…$
?String相關(guān)命令l
?List相關(guān)命令s
?Set相關(guān)命令h
?Hash相關(guān)命令z
?Sorted Set(ZSet)相關(guān)命令x
?過(guò)期事件(每次key過(guò)期時(shí)生成的事件)e
?回收事件(達(dá)到maxmemory
時(shí)回收key的事件)t
?Stream相關(guān)命令m
?Key-miss events,訪問(wèn)的key不存在時(shí)觸發(fā)A
g$lshzxet
的別名,因此AKE
代表了除了m
之外的所有事件。
默認(rèn)情況下所有事件通知都是關(guān)閉的,因?yàn)榇蠖鄶?shù)用戶(hù)不需要這些特性。且需要至少有K
或者E
時(shí)事件通知才會(huì)生效。
notify-keyspace-events ""
GOPHER SERVER Gopher協(xié)議
開(kāi)啟Gopher
協(xié)議,大體意思就是說(shuō)這是一個(gè)90年代很流行的Web協(xié)議,客戶(hù)端和服務(wù)端實(shí)現(xiàn)都非常簡(jiǎn)單,Redis服務(wù)器只需要100行代碼就能支持它。一些人想要一個(gè)更簡(jiǎn)單的互聯(lián)網(wǎng),另一些人認(rèn)為主流互聯(lián)網(wǎng)變得過(guò)于受控,為想要一點(diǎn)新鮮空氣的人創(chuàng)造一個(gè)替代空間是很酷的??傊?#xff0c;為了慶祝🎉Redis誕生10周年,Redis的作者將這個(gè)協(xié)議支持作為禮物🎁送給了Redis。
# Redis contains an implementation of the Gopher protocol, as specified in
# the RFC 1436 (https://www.ietf.org/rfc/rfc1436.txt).
#
# The Gopher protocol was very popular in the late '90s. It is an alternative
# to the web, and the implementation both server and client side is so simple
# that the Redis server has just 100 lines of code in order to implement this
# support.
#
# What do you do with Gopher nowadays? Well Gopher never *really* died, and
# lately there is a movement in order for the Gopher more hierarchical content
# composed of just plain text documents to be resurrected. Some want a simpler
# internet, others believe that the mainstream internet became too much
# controlled, and it's cool to create an alternative space for people that
# want a bit of fresh air.
#
# Anyway for the 10nth birthday of the Redis, we gave it the Gopher protocol
# as a gift.
#
# --- HOW IT WORKS? ---
#
# The Redis Gopher support uses the inline protocol of Redis, and specifically
# two kind of inline requests that were anyway illegal: an empty request
# or any request that starts with "/" (there are no Redis commands starting
# with such a slash). Normal RESP2/RESP3 requests are completely out of the
# path of the Gopher protocol implementation and are served as usual as well.
#
# If you open a connection to Redis when Gopher is enabled and send it
# a string like "/foo", if there is a key named "/foo" it is served via the
# Gopher protocol.
#
# In order to create a real Gopher "hole" (the name of a Gopher site in Gopher
# talking), you likely need a script like the following:
#
# https://github.com/antirez/gopher2redis
#
# --- SECURITY WARNING ---
#
# If you plan to put Redis on the internet in a publicly accessible address
# to server Gopher pages MAKE SURE TO SET A PASSWORD to the instance.
# Once a password is set:
#
# 1. The Gopher server (when enabled, not by default) will still serve
# content via Gopher.
# 2. However other commands cannot be called before the client will
# authenticate.
#
# So use the 'requirepass' option to protect your instance.
#
# Note that Gopher is not currently supported when 'io-threads-do-reads'
# is enabled.
#
# To enable Gopher support, uncomment the following line and set the option
# from no (the default) to yes.
#
# gopher-enabled no
ADVANCED CONFIG 高級(jí)設(shè)置
- 設(shè)置Hash底層數(shù)據(jù)結(jié)構(gòu)由ziplist轉(zhuǎn)為hashtable的閾值
當(dāng)Hash類(lèi)型的keys只包含了少量的實(shí)體并且實(shí)體的大小沒(méi)有超過(guò)給定的閾值時(shí),Hash底層會(huì)使用ziplist來(lái)存儲(chǔ)數(shù)據(jù)而不是使用hashtable以節(jié)省空間。
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
當(dāng)一個(gè)Hash類(lèi)型的key包含的實(shí)體數(shù)量超過(guò)了hash-max-ziplist-entries
的值或者某個(gè)實(shí)體的大小超過(guò)了hash-max-ziplist-value
的值(單位字節(jié)),那么底層編碼就會(huì)升級(jí)成hashtable。
- 設(shè)置List底層數(shù)據(jù)結(jié)構(gòu)quicklist中單個(gè)ziplist的大小
Redis中List數(shù)據(jù)結(jié)構(gòu)的底層使用的是quicklist的數(shù)據(jù)結(jié)構(gòu),本質(zhì)上是ziplist作為節(jié)點(diǎn)串起來(lái)的linkedlist。可以通過(guò)該項(xiàng)設(shè)置來(lái)改變每個(gè)ziplist的最大大小(ziplist中的fill屬性,超過(guò)這個(gè)值就會(huì)開(kāi)啟一個(gè)新的ziplist)。總共提供了-5到-1五個(gè)選項(xiàng):
-5
:最大大小為64Kb,不推薦作為正常情況下的負(fù)載-4
:最大大小為32Kb,不推薦-3
:最大大小為16Kb,大概可能估計(jì)好像不是很推薦(原話:probably not recommended)- `-2:最大大小為8Kb,good(原話)
-1
:最大大小為4Kb,good(原話)
默認(rèn)值是-2
list-max-ziplist-size -2
- 設(shè)置壓縮List中ziplist為quicklistLZF結(jié)構(gòu)
大神們覺(jué)著ziplist不夠zip啊,所以再壓縮一下吧。實(shí)際上是考慮了這樣的場(chǎng)景,即List數(shù)據(jù)結(jié)構(gòu)兩端訪問(wèn)頻率比較高,但是中間部分訪問(wèn)頻率不是很高的情況,那么使用ziplist存放這部分結(jié)構(gòu)就有點(diǎn)浪費(fèi),是不是可以把這部分結(jié)構(gòu)進(jìn)行壓縮(LZF算法壓縮)呢?這個(gè)選項(xiàng)就是進(jìn)行這個(gè)操作的。有下面幾個(gè)值:
0
:代表不壓縮,默認(rèn)值1
:兩端各一個(gè)節(jié)點(diǎn)不壓縮2
:兩端各兩個(gè)節(jié)點(diǎn)不壓縮...
:依次類(lèi)推。。。
list-compress-depth 0
- 設(shè)置Set底層intset最大entities個(gè)數(shù)/intset升級(jí)為hashtable的閾值
Set數(shù)據(jù)結(jié)構(gòu)只有在一種情況下會(huì)使用intset來(lái)存儲(chǔ):set由能轉(zhuǎn)成10進(jìn)制且數(shù)值在64bit有符號(hào)整形數(shù)值組成時(shí)。下面的配置設(shè)置了intset能存儲(chǔ)的最大entities數(shù)量,超過(guò)這個(gè)數(shù)量會(huì)轉(zhuǎn)成hashtable存儲(chǔ)。默認(rèn)512個(gè)。
set-max-intset-entries 512
設(shè)置ZSet底層數(shù)據(jù)結(jié)構(gòu)由ziplist轉(zhuǎn)為skiplist的閾值
當(dāng)超過(guò)下面設(shè)置的閾值時(shí),ZSet底層存儲(chǔ)結(jié)構(gòu)會(huì)由ziplist轉(zhuǎn)為skiplist。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
- 設(shè)置HyperLogLog底層稀疏矩陣轉(zhuǎn)為稠密矩陣的閾值
HyperLogLog當(dāng)在計(jì)數(shù)比較小時(shí)會(huì)使用稀疏矩陣來(lái)存儲(chǔ),只有當(dāng)計(jì)數(shù)達(dá)到閾值時(shí),才會(huì)轉(zhuǎn)為稠密矩陣。
超過(guò)16000的值是完全無(wú)用的,因?yàn)檫@種情況下使用稠密矩陣更加節(jié)省內(nèi)存。
建議的值是3000左右,以便在不降低太多PFADD速度的情況下獲取空間有效編碼的好處,稀疏編碼的PFADD的時(shí)間復(fù)雜度為O(N)。當(dāng)不考慮CPU占用時(shí)而考慮內(nèi)存占用時(shí),這個(gè)值可以升到10000左右。
hll-sparse-max-bytes 3000
- 自定義Stream宏節(jié)點(diǎn)大小
可以通過(guò)stream-node-max-bytes
選項(xiàng)修改Stream中每個(gè)宏節(jié)點(diǎn)能夠占用的最大內(nèi)存,或者通過(guò)stream-node-max-entries
參數(shù)指定每個(gè)宏節(jié)點(diǎn)中可存儲(chǔ)條目的最大數(shù)量。
stream-node-max-bytes 4096
stream-node-max-entries 100
- 開(kāi)啟Rehash
Redis將在每100毫秒時(shí)使用1毫秒的CPU時(shí)間來(lái)對(duì)redis的hash表進(jìn)行重新hash,可以降低內(nèi)存的使用。當(dāng)你的使用場(chǎng)景中,有非常嚴(yán)格的實(shí)時(shí)性需要,不能夠接受Redis時(shí)不時(shí)的對(duì)請(qǐng)求有2毫秒的延遲的話,把這項(xiàng)配置為no。如果沒(méi)有這么嚴(yán)格的實(shí)時(shí)性要求,可以設(shè)置為yes,以便能夠盡可能快的釋放內(nèi)存。
activerehashing yes
- 客戶(hù)端輸出緩存控制
客戶(hù)端輸出緩沖區(qū)限制可用于強(qiáng)制斷開(kāi)由于某種原因從服務(wù)器讀取數(shù)據(jù)速度不夠快的客戶(hù)端(一個(gè)常見(jiàn)原因是發(fā)布/訂閱客戶(hù)端不能像發(fā)布服務(wù)器生成消息那樣快地使用消息)。
對(duì)于三種不同類(lèi)型的客戶(hù)端,克制設(shè)置不同的限制:
normal
:一般客戶(hù)端包含監(jiān)控客戶(hù)端replica
:副本客戶(hù)端(slave)pubsub
:客戶(hù)端至少訂閱了一個(gè)pubsub通道或模式。
每個(gè)客戶(hù)端輸出緩沖區(qū)限制指令語(yǔ)法:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
一旦達(dá)到<hard limit>
限制或者達(dá)到<soft limit>
之后又過(guò)了<soft seconds>
秒,那么客戶(hù)端會(huì)立即被斷開(kāi)連接。
例如,如果<hard limit>
為32兆字節(jié),<soft limit>
和<soft seconds>
分別為16兆字節(jié),10秒,則如果輸出緩沖區(qū)的大小達(dá)到32兆字節(jié),客戶(hù)端將立即斷開(kāi)連接,但如果客戶(hù)端達(dá)到16兆字節(jié)并連續(xù)超過(guò)限制10秒,客戶(hù)端也將斷開(kāi)連接。
默認(rèn)情況下,普通客戶(hù)端不受限制,因?yàn)樗鼈儾粫?huì)在沒(méi)有請(qǐng)求(以推送方式)的情況下接收數(shù)據(jù),而是在請(qǐng)求之后接收數(shù)據(jù),因此只有異步客戶(hù)端可能會(huì)創(chuàng)建一個(gè)場(chǎng)景,其中請(qǐng)求數(shù)據(jù)的速度比讀取數(shù)據(jù)的速度快。
相反,pubsub和副本客戶(hù)端有一個(gè)默認(rèn)限制,因?yàn)橛嗛喺吆透北疽酝扑头绞浇邮諗?shù)據(jù)。
硬限制或軟限制都可以通過(guò)將其設(shè)置為零來(lái)禁用。
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
- 配置客戶(hù)端query buffer大小
客戶(hù)端query buffer大小不能超過(guò)該項(xiàng)配置的值。
每個(gè)Client都有一個(gè)query buffer(查詢(xún)緩存區(qū)或輸入緩存區(qū)), 它用于保存客戶(hù)端的發(fā)送命令,redis server從query buffer獲取命令并執(zhí)行。如果程序的Key設(shè)計(jì)不合理,客戶(hù)端使用大量的query buffer,這會(huì)導(dǎo)致redis server比較危險(xiǎn),很容易達(dá)到maxmeory限制,導(dǎo)致緩存數(shù)據(jù)被清空、數(shù)據(jù)無(wú)法寫(xiě)入和oom.
client-query-buffer-limit 1gb
- Redis協(xié)議批量請(qǐng)求單個(gè)字符串限制
默認(rèn)512mb,可以通過(guò)下面選項(xiàng)修改
proto-max-bulk-len 512mb
- Redis執(zhí)行任務(wù)頻率
Redis調(diào)用一個(gè)內(nèi)部函數(shù)來(lái)執(zhí)行許多后臺(tái)任務(wù),比如在超時(shí)時(shí)關(guān)閉客戶(hù)端連接,清楚從未被請(qǐng)求過(guò)的過(guò)期key…
并非所有任務(wù)都已相同的頻率執(zhí)行,但Redis根據(jù)指定的hz
值檢查要執(zhí)行的任務(wù)。
默認(rèn)情況下,hz
的值為10.提高這個(gè)值會(huì)讓Redis在空閑的時(shí)候占用更多的CPU,但同時(shí)也會(huì)讓Redis在有很多keys同時(shí)過(guò)期時(shí)響應(yīng)更快并且可以更精確的處理超時(shí)。
范圍在1到500之間,但是超過(guò)100通常不是一個(gè)好主意。大多數(shù)用戶(hù)應(yīng)該使用缺省值10,只有在需要非常低延遲的環(huán)境中才應(yīng)該將值提高到100。
hz 10
- 動(dòng)態(tài)hz配置
根據(jù)客戶(hù)端連接的數(shù)量動(dòng)態(tài)的調(diào)整hz的值,當(dāng)有更多的客戶(hù)端連接時(shí),會(huì)臨時(shí)以hz
設(shè)置基準(zhǔn)提高該hz
的值。默認(rèn)開(kāi)啟。
dynamic-hz yes
- AOF重寫(xiě)時(shí)執(zhí)行fsync刷盤(pán)策略
當(dāng)一個(gè)子系統(tǒng)重寫(xiě)AOF文件時(shí),如果啟用了以下選項(xiàng),則該文件將每生成32MB的數(shù)據(jù)進(jìn)行fsync同步。這對(duì)于以更增量的方式將文件提交到磁盤(pán)并避免較大的延遲峰值非常有用。
aof-rewrite-incremental-fsync yes
- 保存RDB文件時(shí)執(zhí)行fsync刷盤(pán)策略
當(dāng)redis保存RDB文件時(shí),如果啟用以下選項(xiàng),則每生成32 MB的數(shù)據(jù),文件就會(huì)同步一次。這對(duì)于以更增量的方式將文件提交到磁盤(pán)并避免較大的延遲峰值非常有用。
rdb-save-incremental-fsync yes
- LFU設(shè)置
設(shè)置Redis LFU相關(guān)。Redis LFU淘汰策略實(shí)現(xiàn)有兩個(gè)可調(diào)整參數(shù):lfu-log-factor
和lfu-decay-time
。
代碼語(yǔ)言:javascript
復(fù)制
lfu-log-factor 10
lfu-decay-time 1
ACTIVE DEFRAGMENTATION 碎片整理
主動(dòng)(在線)碎片整理允許Redis服務(wù)器壓縮內(nèi)存中數(shù)據(jù)的少量分配和釋放之間的空間(內(nèi)存碎片),從而回收內(nèi)存。
碎片化是每個(gè)分配器(幸運(yùn)的是,Jemalloc比較少發(fā)生這種情況)和某些工作負(fù)載都會(huì)發(fā)生的自然過(guò)程。通常需要重啟服務(wù)器以降低碎片,或者至少清除所有數(shù)據(jù)并重新創(chuàng)建。然而,多虧了Oran Agra為Redis 4.0實(shí)現(xiàn)的這一功能,這個(gè)過(guò)程可以在服務(wù)器運(yùn)行時(shí)以“hot”的方式在運(yùn)行時(shí)發(fā)生(類(lèi)似熱部署的意思,不需要停止服務(wù))。
基本上,當(dāng)碎片超過(guò)某個(gè)級(jí)別(參見(jiàn)下面的配置選項(xiàng))時(shí),Redis將通過(guò)利用特定的Jemalloc功能(以了解分配是否導(dǎo)致碎片并將其分配到更好的位置)開(kāi)始在連續(xù)內(nèi)存區(qū)域中創(chuàng)建值的新副本,同時(shí)釋放數(shù)據(jù)的舊副本。對(duì)所有鍵遞增地重復(fù)該過(guò)程將導(dǎo)致碎片降至正常值。
需要了解的重要事項(xiàng):
1.默認(rèn)情況下,此功能被禁用,并且僅當(dāng)您編譯Redis以使用我們隨Redis源代碼提供的Jemalloc副本時(shí),此功能才有效。這是Linux版本的默認(rèn)設(shè)置。
2.如果沒(méi)有碎片問(wèn)題,則無(wú)需啟用此功能。
3.一旦遇到內(nèi)存碎片,可以在需要時(shí)使用命令CONFIG SET activedefrag yes
啟用此功能。
配置參數(shù)能夠微調(diào)碎片整理過(guò)程的行為。如果你不確定它們是什么意思,最好不要改變默認(rèn)值。
開(kāi)啟活動(dòng)碎片整理
activedefrag no
啟動(dòng)活動(dòng)碎片整理的最小內(nèi)存碎片閾值
active-defrag-ignore-bytes 100mb
啟動(dòng)活動(dòng)碎片整理的最小內(nèi)存碎片百分比
active-defrag-threshold-lower 10
- 嘗試釋放的最大百分比
active-defrag-threshold-upper 100
- 最少CPU使用率
active-defrag-cycle-min 1
- 最大CPU使用率
active-defrag-cycle-max 25
- 最大掃描量
# Maximum number of set/hash/zset/list fields that will be processed from
# the main dictionary scan
active-defrag-max-scan-fields 1000
- 使用后臺(tái)線程
jemalloc-bg-thread yes
貼一份完整的配置文件
#redis.conf
# Redis configuration file example.
# ./redis-server /path/to/redis.conf
################################## INCLUDES
###################################
#這在你有標(biāo)準(zhǔn)配置模板但是每個(gè) redis 服務(wù)器又需要個(gè)性設(shè)置的時(shí)候很有用。
# include /path/to/local.conf
# include /path/to/other.conf
################################ GENERAL #####################################
#是否在后臺(tái)執(zhí)行,yes:后臺(tái)運(yùn)行;no:不是后臺(tái)運(yùn)行(老版本默認(rèn))
daemonize yes
#3.2 里的參數(shù),是否開(kāi)啟保護(hù)模式,默認(rèn)開(kāi)啟。要是配置里沒(méi)有指定 bind 和密碼。開(kāi)啟該參數(shù)后,redis
只會(huì)本地進(jìn)行訪問(wèn),拒絕外部訪問(wèn)。要是開(kāi)啟了密碼 和 bind,可以開(kāi)啟。否 則最好關(guān)閉,設(shè)置為
no。
protected-mode yes
#redis 的進(jìn)程文件
pidfile /var/run/redis/redis-server.pid
#redis 監(jiān)聽(tīng)的端口號(hào)。
port 6379
#此參數(shù)確定了 TCP 連接中已完成隊(duì)列(完成三次握手之后)的長(zhǎng)度, 當(dāng)然此值必須不大于 Linux 系統(tǒng)定
義的/proc/sys/net/core/somaxconn 值,默認(rèn)是 511,而 Linux 的默認(rèn)參數(shù)值是 128。當(dāng)系統(tǒng)并
發(fā)量大并且客戶(hù)端速度緩慢的時(shí)候,可以將這二個(gè)參數(shù)一起參考設(shè)定。該內(nèi)核參數(shù)默認(rèn)值一般是 128,對(duì)
于負(fù)載很大的服務(wù)程序來(lái)說(shuō)大大的不夠。一般會(huì)將它修改為 2048 或者更大。在/etc/sysctl.conf 添加:net.core.somaxconn = 2048,然后在終端中執(zhí)行 sysctl -p。
tcp-backlog 511
#指定 redis 只接收來(lái)自于該 IP 地址的請(qǐng)求,如果不進(jìn)行設(shè)置,那么將處理所有請(qǐng)求
#bind 127.0.0.1
#配置 unix socket 來(lái)讓 redis 支持監(jiān)聽(tīng)本地連接。
# unixsocket /var/run/redis/redis.sock
#配置 unix socket 使用文件的權(quán)限
# unixsocketperm 700
# 此參數(shù)為設(shè)置客戶(hù)端空閑超過(guò) timeout,服務(wù)端會(huì)斷開(kāi)連接,為 0 則服務(wù)端不會(huì)主動(dòng)斷開(kāi)連接,不能
小于 0。
timeout 0
#tcp keepalive 參數(shù)。如果設(shè)置不為 0,就使用配置 tcp 的 SO_KEEPALIVE 值,使用 keepalive 有
兩個(gè)好處:檢測(cè)掛掉的對(duì)端。降低中間設(shè)備出問(wèn)題而導(dǎo)致網(wǎng)絡(luò)看似連接卻已經(jīng)與對(duì)端端口的問(wèn)題。在 Linux內(nèi)核中,設(shè)置了 keepalive,redis 會(huì)定時(shí)給對(duì)端發(fā)送 ack。檢測(cè)到對(duì)端關(guān)閉需要兩倍的設(shè)置值。
tcp-keepalive 0
#指定了服務(wù)端日志的級(jí)別。級(jí)別包括:debug(很多信息,方便開(kāi)發(fā)、測(cè)試),verbose(許多有用的
信息,但是沒(méi)有 debug 級(jí)別信息多),notice(適當(dāng)?shù)娜罩炯?jí)別,適合生產(chǎn)環(huán)境),warn(只有非常重
要的信息)
loglevel notice
#指定了記錄日志的文件??兆址脑?#xff0c;日志會(huì)打印到標(biāo)準(zhǔn)輸出設(shè)備。后臺(tái)運(yùn)行的 redis 標(biāo)準(zhǔn)輸出是
/dev/null。
logfile /var/log/redis/redis-server.log
#是否打開(kāi)記錄 syslog 功能
# syslog-enabled no
#syslog 的標(biāo)識(shí)符。
# syslog-ident redis
#日志的來(lái)源、設(shè)備
# syslog-facility local0
#數(shù)據(jù)庫(kù)的數(shù)量,默認(rèn)使用的數(shù)據(jù)庫(kù)是 DB 0??梢酝ㄟ^(guò)”SELECT “命令選擇一個(gè) db
databases 16
################################ SNAPSHOTTING ################################
# 快照配置
# 注釋掉“save”這一行配置項(xiàng)就可以讓保存數(shù)據(jù)庫(kù)功能失效
# 設(shè)置 sedis 進(jìn)行數(shù)據(jù)庫(kù)鏡像的頻率。
# 900 秒(15 分鐘)內(nèi)至少 1 個(gè) key 值改變(則進(jìn)行數(shù)據(jù)庫(kù)保存--持久化)
# 300 秒(5 分鐘)內(nèi)至少 10 個(gè) key 值改變(則進(jìn)行數(shù)據(jù)庫(kù)保存--持久化)
# 60 秒(1 分鐘)內(nèi)至少 10000 個(gè) key 值改變(則進(jìn)行數(shù)據(jù)庫(kù)保存--持久化)
save 900 1
save 300 10
save 60 10000
#當(dāng) RDB 持久化出現(xiàn)錯(cuò)誤后,是否依然進(jìn)行繼續(xù)進(jìn)行工作,yes:不能進(jìn)行工作,no:可以繼續(xù)進(jìn)行工作,
可以通過(guò) info 中的 rdb_last_bgsave_status 了解 RDB 持久化是否有錯(cuò)誤
stop-writes-on-bgsave-error yes
#使用壓縮 rdb 文件,rdb 文件壓縮使用 LZF 壓縮算法,yes:壓縮,但是需要一些 cpu 的消耗。no:不
壓縮,需要更多的磁盤(pán)空間
rdbcompression yes
#是否校驗(yàn) rdb 文件。從 rdb 格式的第五個(gè)版本開(kāi)始,在 rdb 文件的末尾會(huì)帶上 CRC64 的校驗(yàn)和。這跟
有利于文件的容錯(cuò)性,但是在保存 rdb 文件的時(shí)候,會(huì)有大概 10%的性能損耗,所以如果你追求高性能,
可以關(guān)閉該配置。
rdbchecksum yes
#rdb 文件的名稱(chēng)
dbfilename dump.rdb
#數(shù)據(jù)目錄,數(shù)據(jù)庫(kù)的寫(xiě)入會(huì)在這個(gè)目錄。rdb、aof 文件也會(huì)寫(xiě)在這個(gè)目錄
dir /root/temp
################################# REPLICATION
#################################
#復(fù)制選項(xiàng),slave 復(fù)制對(duì)應(yīng)的 master# slaveof <masterip> <masterport>
#如果 master 設(shè)置了 requirepass,那么 slave 要連上 master,需要有 master 的密碼才行。
masterauth 就是用來(lái)配置 master 的密碼,這樣可以在連上 master 后進(jìn)行認(rèn)證。
# masterauth <master-password#當(dāng)從庫(kù)同主機(jī)失去連接或者復(fù)制正在進(jìn)行,從機(jī)庫(kù)有兩種運(yùn)行方式:1) 如果
slave-serve-stale-data 設(shè)置為 yes(默認(rèn)設(shè)置),從庫(kù)會(huì)繼續(xù)響應(yīng)客戶(hù)端的請(qǐng)求。2) 如果
slave-serve-stale-data 設(shè)置為 no,除去 INFO 和 SLAVOF 命令之外的任何請(qǐng)求都會(huì)返回一個(gè)錯(cuò)
誤”SYNC with master in progress”。
slave-serve-stale-data ye#作為從服務(wù)器,默認(rèn)情況下是只讀的(yes),可以修改成 NO,用于寫(xiě)(不建議)。
slave-read-only yes
#是否使用 socket 方式復(fù)制數(shù)據(jù)。目前 redis 復(fù)制提供兩種方式,disk 和 socket。如果新的 slave
連上來(lái)或者重連的 slave 無(wú)法部分同步,就會(huì)執(zhí)行全量同步,master 會(huì)生成 rdb 文件。有 2 種方式:
disk 方式是 master 創(chuàng)建一個(gè)新的進(jìn)程把 rdb 文件保存到磁盤(pán),再把磁盤(pán)上的 rdb 文件傳遞給 slave。
socket 是 master 創(chuàng)建一個(gè)新的進(jìn)程,直接把 rdb 文件以 socket 的方式發(fā)給 slave。disk 方式的時(shí)
候,當(dāng)一個(gè) rdb 保存的過(guò)程中,多個(gè) slave 都能共享這個(gè) rdb 文件。socket 的方式就的一個(gè)個(gè) slave
順序復(fù)制。在磁盤(pán)速度緩慢,網(wǎng)速快的情況下推薦用 socket 方式。
repl-diskless-sync no
#diskless 復(fù)制的延遲時(shí)間,防止設(shè)置為 0。一旦復(fù)制開(kāi)始,節(jié)點(diǎn)不會(huì)再接收新 slave 的復(fù)制請(qǐng)求直到
下一個(gè) rdb 傳輸。所以最好等待一段時(shí)間,等更多的 slave 連上來(lái)。
repl-diskless-sync-delay 5
#slave 根據(jù)指定的時(shí)間間隔向服務(wù)器發(fā)送 ping 請(qǐng)求。時(shí)間間隔可以通過(guò) repl_ping_slave_period
來(lái)設(shè)置,默認(rèn) 10 秒。
# repl-ping-slave-period 10
#復(fù)制連接超時(shí)時(shí)間。master 和 slave 都有超時(shí)時(shí)間的設(shè)置。master 檢測(cè)到 slave 上次發(fā)送的時(shí)間超
過(guò) repl-timeout,即認(rèn)為 slave 離線,清除該 slave 信息。slave 檢測(cè)到上次和 master 交互的時(shí)
間超過(guò) repl-timeout,則認(rèn)為 master 離線。需要注意的是 repl-timeout 需要設(shè)置一個(gè)比
repl-ping-slave-period 更大的值,不然會(huì)經(jīng)常檢測(cè)到超時(shí)。
# repl-timeout 60
#是否禁止復(fù)制 tcp 鏈接的 tcp nodelay 參數(shù),可傳遞 yes 或者 no。默認(rèn)是 no,即使用 tcp nodelay。
如果 master 設(shè)置了 yes 來(lái)禁止 tcp nodelay 設(shè)置,在把數(shù)據(jù)復(fù)制給 slave 的時(shí)候,會(huì)減少包的數(shù)量
和更小的網(wǎng)絡(luò)帶寬。但是這也可能帶來(lái)數(shù)據(jù)的延遲。默認(rèn)我們推薦更小的延遲,但是在數(shù)據(jù)量傳輸很大的
場(chǎng)景下,建議選擇 yes。
repl-disable-tcp-nodelay no
#復(fù)制緩沖區(qū)大小,這是一個(gè)環(huán)形復(fù)制緩沖區(qū),用來(lái)保存最新復(fù)制的命令。這樣在 slave 離線的時(shí)候,不
需要完全復(fù)制 master 的數(shù)據(jù),如果可以執(zhí)行部分同步,只需要把緩沖區(qū)的部分?jǐn)?shù)據(jù)復(fù)制給 slave,就能
恢復(fù)正常復(fù)制狀態(tài)。緩沖區(qū)的大小越大,slave 離線的時(shí)間可以更長(zhǎng),復(fù)制緩沖區(qū)只有在有 slave 連接
的時(shí)候才分配內(nèi)存。沒(méi)有 slave 的一段時(shí)間,內(nèi)存會(huì)被釋放出來(lái),默認(rèn) 1m。
# repl-backlog-size 5mb
#master 沒(méi)有 slave 一段時(shí)間會(huì)釋放復(fù)制緩沖區(qū)的內(nèi)存,repl-backlog-ttl 用來(lái)設(shè)置該時(shí)間長(zhǎng)度。
單位為秒。
# repl-backlog-ttl 3600
#當(dāng) master 不可用,Sentinel 會(huì)根據(jù) slave 的優(yōu)先級(jí)選舉一個(gè) master。最低的優(yōu)先級(jí)的 slave,當(dāng)
選 master。而配置成 0,永遠(yuǎn)不會(huì)被選舉。slave-priority 100
#redis 提供了可以讓 master 停止寫(xiě)入的方式,如果配置了 min-slaves-to-write,健康的 slave
的個(gè)數(shù)小于 N,mater 就禁止寫(xiě)入。master 最少得有多少個(gè)健康的 slave 存活才能執(zhí)行寫(xiě)命令。這個(gè)置雖然不能保證 N 個(gè) slave 都一定能接收到 master 的寫(xiě)操作,但是能避免沒(méi)有足夠健康的 slave 的候,master 不能寫(xiě)入來(lái)避免數(shù)據(jù)丟失。設(shè)置為 0 是關(guān)閉該功能。
# min-slaves-to-write 3
#延遲小于 min-slaves-max-lag 秒的 slave 才認(rèn)為是健康的 slave。
# min-slaves-max-lag 10
# 設(shè)置 1 或另一個(gè)設(shè)置為 0 禁用這個(gè)特性。
# Setting one or the other to 0 disables the feature.
# By default min-slaves-to-write is set to 0 (feature disabled) and
# min-slaves-max-lag is set to 10.
################################## SECURITY
###################################
#requirepass 配置可以讓用戶(hù)使用 AUTH 命令來(lái)認(rèn)證密碼,才能使用其他命令。這讓 redis 可以使用
在不受信任的網(wǎng)絡(luò)中。為了保持向后的兼容性,可以注釋該命令,因?yàn)榇蟛糠钟脩?hù)也不需要認(rèn)證。使用
requirepass 的時(shí)候需要注意,因?yàn)?redis 太快了,每秒可以認(rèn)證 15w 次密碼,簡(jiǎn)單的密碼很容易被
攻破,所以最好使用一個(gè)更復(fù)雜的密碼。
# requirepass foobared
#把危險(xiǎn)的命令給修改成其他名稱(chēng)。比如 CONFIG 命令可以重命名為一個(gè)很難被猜到的命令,這樣用戶(hù)不
能使用,而內(nèi)部工具還能接著使用。
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#設(shè)置成一個(gè)空的值,可以禁止一個(gè)命# rename-command CONFIG ""
################################### LIMITS
####################################
# 設(shè)置能連上 redis 的最大客戶(hù)端連接數(shù)量。默認(rèn)是 10000 個(gè)客戶(hù)端連接。由于 redis 不區(qū)分連接是客
戶(hù)端連接還是內(nèi)部打開(kāi)文件或者和 slave 連接等,所以 maxclients 最小建議設(shè)置到 32。如果超過(guò)了
maxclients,redis 會(huì)給新的連接發(fā)送’max number of clients reached’,并關(guān)閉連接。
# maxclients 10000
#redis 配置的最大內(nèi)存容量。當(dāng)內(nèi)存滿了,需要配合 maxmemory-policy 策略進(jìn)行處理。注意 slave
的輸出緩沖區(qū)是不計(jì)算在 maxmemory 內(nèi)的。所以為了防止主機(jī)內(nèi)存使用完,建議設(shè)置的 maxmemory 要更小一些。
# maxmemory <bytes>
#內(nèi)存容量超過(guò) maxmemory 后的處理策略。
#volatile-lru:利用 LRU 算法移除設(shè)置過(guò)過(guò)期時(shí)間的 key。
#volatile-random:隨機(jī)移除設(shè)置過(guò)過(guò)期時(shí)間的 key。
#volatile-ttl:移除即將過(guò)期的 key,根據(jù)最近過(guò)期時(shí)間來(lái)刪除(輔以 TTL)
#allkeys-lru:利用 LRU 算法移除任何 key。
#allkeys-random:隨機(jī)移除任何 key。
#noeviction:不移除任何 key,只是返回一個(gè)寫(xiě)錯(cuò)誤。
#上面的這些驅(qū)逐策略,如果 redis 沒(méi)有合適的 key 驅(qū)逐,對(duì)于寫(xiě)命令,還是會(huì)返回錯(cuò)誤。redis 將不
再接收寫(xiě)請(qǐng)求,只接收 get 請(qǐng)求。寫(xiě)命令包括: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 noeviction
#lru 檢測(cè)的樣本數(shù)。使用 lru 或者 ttl 淘汰算法,從需要淘汰的列表中隨機(jī)選擇 sample 個(gè) key,選出
閑置時(shí)間最長(zhǎng)的 key 移除。
# maxmemory-samples 5
############################## APPEND ONLY MODE ###############################
#默認(rèn) redis 使用的是 rdb 方式持久化,這種方式在許多應(yīng)用中已經(jīng)足夠用了。但是 redis 如果中途宕
機(jī),會(huì)導(dǎo)致可能有幾分鐘的數(shù)據(jù)丟失,根據(jù) save 來(lái)策略進(jìn)行持久化,Append Only File 是另一種持
久化方式,可以提供更好的持久化特性。Redis 會(huì)把每次寫(xiě)入的數(shù)據(jù)在接收后都寫(xiě)入 appendonly.aof
文件,每次啟動(dòng)時(shí) Redis 都會(huì)先把這個(gè)文件的數(shù)據(jù)讀入內(nèi)存里,先忽略 RDB 文件。
appendonly no
#aof 文件名
appendfilename "appendonly.aof"
#aof 持久化策略的配置
#no 表示不執(zhí)行 fsync,由操作系統(tǒng)保證數(shù)據(jù)同步到磁盤(pán),速度最快。
#always 表示每次寫(xiě)入都執(zhí)行 fsync,以保證數(shù)據(jù)同步到磁盤(pán)。
#everysec 表示每秒執(zhí)行一次 fsync,可能會(huì)導(dǎo)致丟失這 1s 數(shù)據(jù)。
appendfsync everysec
# 在 aof 重寫(xiě)或者寫(xiě)入 rdb 文件的時(shí)候,會(huì)執(zhí)行大量 IO,此時(shí)對(duì)于 everysec 和 always 的 aof 模式
來(lái)說(shuō),執(zhí)行 fsync 會(huì)造成阻塞過(guò)長(zhǎng)時(shí)間,no-appendfsync-on-rewrite 字段設(shè)置為默認(rèn)設(shè)置為 no。
如果對(duì)延遲要求很高的應(yīng)用,這個(gè)字段可以設(shè)置為 yes,否則還是設(shè)置為 no,這樣對(duì)持久化特性來(lái)說(shuō)這更安全的選擇。設(shè)置為 yes 表示 rewrite 期間對(duì)新寫(xiě)操作不 fsync,暫時(shí)存在內(nèi)存中,等 rewrite 完成
后再寫(xiě)入,默認(rèn)為 no,建議 yes。Linux 的默認(rèn) fsync 策略是 30 秒??赡軄G失 30 秒數(shù)據(jù)。
no-appendfsync-on-rewrite no
#aof 自動(dòng)重寫(xiě)配置。當(dāng)目前 aof 文件大小超過(guò)上一次重寫(xiě)的 aof 文件大小的百分之多少進(jìn)行重寫(xiě),即當(dāng)
aof 文件增長(zhǎng)到一定大小的時(shí)候 Redis 能夠調(diào)用 bgrewriteaof 對(duì)日志文件進(jìn)行重寫(xiě)。當(dāng)前 AOF 文件大
小是上次日志重寫(xiě)得到 AOF 文件大小的二倍(設(shè)置為 100)時(shí),自動(dòng)啟動(dòng)新的日志重寫(xiě)過(guò)程。
auto-aof-rewrite-percentage 100
#設(shè)置允許重寫(xiě)的最小 aof 文件大小,避免了達(dá)到約定百分比但尺寸仍然很小的情況還要重寫(xiě)
auto-aof-rewrite-min-size 64mb
#aof 文件可能在尾部是不完整的,當(dāng) redis 啟動(dòng)的時(shí)候,aof 文件的數(shù)據(jù)被載入內(nèi)存。重啟可能發(fā)生在
redis 所在的主機(jī)操作系統(tǒng)宕機(jī)后,尤其在 ext4 文件系統(tǒng)沒(méi)有加上 data=ordered 選項(xiàng)(redis 宕機(jī)
或者異常終止不會(huì)造成尾部不完整現(xiàn)象。)出現(xiàn)這種現(xiàn)象,可以選擇讓 redis 退出,或者導(dǎo)入盡可能多的
數(shù)據(jù)。如果選擇的是 yes,當(dāng)截?cái)嗟?aof 文件被導(dǎo)入的時(shí)候,會(huì)自動(dòng)發(fā)布一個(gè) log 給客戶(hù)端然后 load。
如果是 no,用戶(hù)必須手動(dòng) redis-check-aof 修復(fù) AOF 文件才可以aof-load-truncated yes
################################ LUA SCRIPTING ###############################
# 如果達(dá)到最大時(shí)間限制(毫秒),redis 會(huì)記個(gè) log,然后返回 error。當(dāng)一個(gè)腳本超過(guò)了最大時(shí)限。
只有 SCRIPT KILL 和 SHUTDOWN NOSAVE 可以用。第一個(gè)可以殺沒(méi)有調(diào) write 命令的東西。要是已經(jīng)
調(diào)用了 write,只能用第二個(gè)命令殺。
lua-time-limit 5000
################################ REDIS CLUSTER ###############################
#集群開(kāi)關(guān),默認(rèn)是不開(kāi)啟集群模式# cluster-enabled yes
#集群配置文件的名稱(chēng),每個(gè)節(jié)點(diǎn)都有一個(gè)集群相關(guān)的配置文件,持久化保存集群的信息。這個(gè)文件并不需
要手動(dòng)配置,這個(gè)配置文件有 Redis 生成并更新,每個(gè) Redis 集群節(jié)點(diǎn)需要一個(gè)單獨(dú)的配置文件,請(qǐng)確
保與實(shí)例運(yùn)行的系統(tǒng)中配置文件名稱(chēng)不沖突
# cluster-config-file nodes-6379.conf
#節(jié)點(diǎn)互連超時(shí)的閥值。集群節(jié)點(diǎn)超時(shí)毫秒數(shù)
# cluster-node-timeout 15000
#在進(jìn)行故障轉(zhuǎn)移的時(shí)候,全部 slave 都會(huì)請(qǐng)求申請(qǐng)為 master,但是有些 slave 可能與 master 斷開(kāi)連
接一段時(shí)間了,導(dǎo)致數(shù)據(jù)過(guò)于陳舊,這樣的 slave 不應(yīng)該被提升為 master。該參數(shù)就是用來(lái)判斷 slave
節(jié)點(diǎn)與 master 斷線的時(shí)間是否過(guò)長(zhǎng)。判斷方法是:
#比較 slave 斷開(kāi)連接的時(shí)間和(node-timeout * slave-validity-factor) +
repl-ping-slave-period
#如果節(jié)點(diǎn)超時(shí)時(shí)間為三十秒, 并且 slave-validity-factor 為 10,假設(shè)默認(rèn)的
repl-ping-slave-period 是 10 秒,即如果超過(guò) 310 秒 slave 將不會(huì)嘗試進(jìn)行故障轉(zhuǎn)移
# cluster-slave-validity-factor 10
#master 的 slave 數(shù)量大于該值,slave 才能遷移到其他孤立 master 上,如這個(gè)參數(shù)若被設(shè)為 2,那
么只有當(dāng)一個(gè)主節(jié)點(diǎn)擁有 2 個(gè)可工作的從節(jié)點(diǎn)時(shí),它的一個(gè)從節(jié)點(diǎn)會(huì)嘗試遷移。
# cluster-migration-barrier 1
#默認(rèn)情況下,集群全部的 slot 有節(jié)點(diǎn)負(fù)責(zé),集群狀態(tài)才為 ok,才能提供服務(wù)。設(shè)置為 no,可以在 slot
沒(méi)有全部分配的時(shí)候提供服務(wù)。不建議打開(kāi)該配置,這樣會(huì)造成分區(qū)的時(shí)候,小分區(qū)的 master 一直在接
受寫(xiě)請(qǐng)求,而造成很長(zhǎng)時(shí)間數(shù)據(jù)不一致。
# cluster-require-full-coverage yes
################################## SLOW LOG
###################################
###slog log 是用來(lái)記錄 redis 運(yùn)行中執(zhí)行比較慢的命令耗時(shí)。當(dāng)命令的執(zhí)行超過(guò)了指定時(shí)間,就記錄
在 slow log 中,slog log 保存在內(nèi)存中,所以沒(méi)有 IO 操作。
#執(zhí)行時(shí)間比 slowlog-log-slower-than 大的請(qǐng)求記錄到 slowlog 里面,單位是微秒,所以 1000000
就是 1 秒。注意,負(fù)數(shù)時(shí)間會(huì)禁用慢查詢(xún)?nèi)罩?#xff0c;而 0 則會(huì)強(qiáng)制記錄所有命令。
slowlog-log-slower-than 1000#慢查詢(xún)?nèi)罩鹃L(zhǎng)度。當(dāng)一個(gè)新的命令被寫(xiě)進(jìn)日志的時(shí)候,最老的那個(gè)記錄會(huì)被刪掉。這個(gè)長(zhǎng)度沒(méi)有限制。只
要有足夠的內(nèi)存就行。你可以通過(guò) SLOWLOG RESET 來(lái)釋放內(nèi)存。
slowlog-max-len 128
################################ LATENCY MONITOR
##############################
#延遲監(jiān)控功能是用來(lái)監(jiān)控 redis 中執(zhí)行比較緩慢的一些操作,用 LATENCY 打印 redis 實(shí)例在跑命令時(shí)
的耗時(shí)圖表。只記錄大于等于下邊設(shè)置的值的操作。0 的話,就是關(guān)閉監(jiān)視。默認(rèn)延遲監(jiān)控功能是關(guān)閉的,
如果你需要打開(kāi),也可以通過(guò) CONFIG SET 命令動(dòng)態(tài)設(shè)置。
latency-monitor-threshold 0
############################# EVENT NOTIFICATION
##############################
#鍵空間通知使得客戶(hù)端可以通過(guò)訂閱頻道或模式,來(lái)接收那些以某種方式改動(dòng)了 Redis 數(shù)據(jù)集的事件。
因?yàn)殚_(kāi)啟鍵空間通知功能需要消耗一些 CPU ,所以在默認(rèn)配置下,該功能處于關(guān)閉狀態(tài)。
#notify-keyspace-events 的參數(shù)可以是以下字符的任意組合,它指定了服務(wù)器該發(fā)送哪些類(lèi)型的通
知:##K 鍵空間通知,所有通知以 __keyspace@__ 為前綴
##E 鍵事件通知,所有通知以 __keyevent@__ 為前綴
##g DEL 、 EXPIRE 、 RENAME 等類(lèi)型無(wú)關(guān)的通用命令的通知
##$ 字符串命令的通知
##l 列表命令的通知
##s 集合命令的通知
##h 哈希命令的通知
##z 有序集合命令的通知
##x 過(guò)期事件:每當(dāng)有過(guò)期鍵被刪除時(shí)發(fā)送
##e 驅(qū)逐(evict)事件:每當(dāng)有鍵因?yàn)?maxmemory 政策而被刪除時(shí)發(fā)送
##A 參數(shù) g$lshzxe 的別名
#輸入的參數(shù)中至少要有一個(gè) K 或者 E,否則的話,不管其余的參數(shù)是什么,都不會(huì)有任何 通知被分發(fā)。
詳細(xì)使用可以參考 http://redis.io/topics/notifications
notify-keyspace-events ""
############################### ADVANCED CONFIG
###############################
#數(shù)據(jù)量小于等于 hash-max-ziplist-entries 的用 ziplist,大于 hash-max-ziplist-entries
用 hash
hash-max-ziplist-entries 512#value 大小小于等于 hash-max-ziplist-value 的ziplist,大于 hash-max-ziplist-value 用 hash。
hash-max-ziplist-value 64
#數(shù)據(jù)量小于等于 list-max-ziplist-entries 用 ziplist,大于 list-max-ziplist-entries
用 list。
list-max-ziplist-entries 512#value 大小小于等于 list-max-ziplist-value 的用
ziplist,大于 list-max-ziplist-value 用 list。
list-max-ziplist-value 64
#數(shù)據(jù)量小于等于 set-max-intset-entries 用 iniset,大于 set-max-intset-entries 用 set。
set-max-intset-entries 51#數(shù)據(jù)量小于等于 zset-max-ziplist-entries 用 ziplist,大于 zset-max-ziplist-entries
用 zset。
zset-max-ziplist-entries 128#value 大小小于等于 zset-max-ziplist-value 用 ziplist,
大于 zset-max-ziplist-value 用 zset。
zset-max-ziplist-value 64
#value 大小小于等于 hll-sparse-max-bytes 使用稀疏數(shù)據(jù)結(jié)構(gòu)(sparse),大于
hll-sparse-max-bytes 使用稠密的數(shù)據(jù)結(jié)構(gòu)(dense)。一個(gè)比 16000 大的 value 是幾乎沒(méi)用的,
建議的 value 大概為 3000。如果對(duì) CPU 要求不高,對(duì)空間要求較高的,建議設(shè)置到 10000 左右。
hll-sparse-max-bytes 3000
#Redis 將在每 100 毫秒時(shí)使用 1 毫秒的 CPU 時(shí)間來(lái)對(duì) redis 的 hash 表進(jìn)行重新 hash,可以降低內(nèi)存
的使用。當(dāng)你的使用場(chǎng)景中,有非常嚴(yán)格的實(shí)時(shí)性需要,不能夠接受 Redis 時(shí)不時(shí)的對(duì)請(qǐng)求有 2 毫秒的遲的話,把這項(xiàng)配置為 no。如果沒(méi)有這么嚴(yán)格的實(shí)時(shí)性要求,可以設(shè)置為 yes,以便能夠盡可能快的釋放
內(nèi)存。activerehashing yes
##對(duì)客戶(hù)端輸出緩沖進(jìn)行限制可以強(qiáng)迫那些不從服務(wù)器讀取數(shù)據(jù)的客戶(hù)端斷開(kāi)連接,用來(lái)強(qiáng)制關(guān)閉傳輸緩
慢的客戶(hù)端。
#對(duì)于 normal client,第一個(gè) 0 表示取消 hard limit,第二個(gè) 0 和第三個(gè) 0 表示取消 soft limit,normal client 默認(rèn)取消限制,因?yàn)槿绻麤](méi)有尋問(wèn),他們是不會(huì)接收數(shù)據(jù)的。
client-output-buffer-limit normal 0 0 0#對(duì)于 slave client 和 MONITER client,如果
client-output-buffer 一旦超過(guò) 256mb,又或者超過(guò) 64mb 持續(xù) 60 秒,那么服務(wù)器就會(huì)立即斷開(kāi)客
戶(hù)端連接。
client-output-buffer-limit slave 256mb 64mb 60#對(duì)于 pubsub client,如果
client-output-buffer 一旦超過(guò) 32mb,又或者超過(guò) 8mb 持續(xù) 60 秒,那么服務(wù)器就會(huì)立即斷開(kāi)客戶(hù)
端連接。
client-output-buffer-limit pubsub 32mb 8mb 60
#redis 執(zhí)行任務(wù)的頻率為 1s 除以 hzhz 10
#在 aof 重寫(xiě)的時(shí)候,如果打開(kāi)了 aof-rewrite-incremental-fsync 開(kāi)關(guān),系統(tǒng)會(huì)每 32MB 執(zhí)行一
次 fsync。這對(duì)于把文件寫(xiě)入磁盤(pán)是有幫助的,可以避免過(guò)大的延遲峰值。
aof-rewrite-incremental-fsync yes