## Generated by install_server.sh ##
# Redis configuration file example.
#
#如果要讓redis-server啟動時加載該配置文件,需要在啟動時
#帶上該配置文件,如下:
# ./redis-server /path/to/redis.conf
# Note on units: 如果需要存儲空間,將以 1k 5GB 4M 這樣的形式書寫,
# 如下?lián)Q算公式:
# 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 ###################################
# 可以在這里引入多個配置文件.
# 如果使用模板配置所有的服務(wù)端,并且個別服務(wù)端需要定制
# 這部分功能將非常有用.
# 支持include嵌套.
#
# 但是要注意,include 是不能被 config rewrite 命令改寫的
# 由于 redis 總是以最后的加工線作為一個配置指令值
# 所以你最好是把 include 放在這個文件的最前面,
# 以避免在運行時覆蓋配置的改變,
# 相反,你就把它放在后面
#
# include /path/to/local.conf
# include /path/to/other.conf
################################## NETWORK #####################################
# 默認(rèn)情況下,如果沒有bind,redis將監(jiān)聽所有接入的訪問
# 如果可能的話,監(jiān)聽一個或者多個指定的ip,在bind后面加上要監(jiān)聽的ip即可
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ 如果Redis Server直接跑在公網(wǎng)上
# bind所有的接口是非常危險的一件事情.
# 所以默認(rèn)情況下,我們只允許redis監(jiān)聽ipv4的本地回環(huán)(localhost)
# 這將意味著只能在同一臺機器上的客戶端才能接入redis server
#
# 如果你確定你的實例要監(jiān)聽所有的實例
# 只需打開下面的注釋
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# bind 0.0.0.0
# Protected mode是一層避免外網(wǎng)訪問和利用的保護
#
# 當(dāng)protected mode處于on狀態(tài)時并且如果:
#
# 1) 服務(wù)器不使用bind顯式地綁定到一組地址
# 2) 沒有配置密碼.
#
# 服務(wù)器將只能接收localhost的訪問
#
# 保護模式,默認(rèn)開啟。如果配置里沒有指定bind和密碼。開啟該參數(shù)后,redis只會本地進行訪問,拒絕外部訪問。要是開啟了密碼和bind,可以開啟。否則最好關(guān)閉,設(shè)置為no。
protected-mode yes
# 在指定端口接收連接,默認(rèn)為 6379 (IANA #815344).
# 如果port為0,這意味著redis將不監(jiān)聽任何端口
port 6379
# TCP listen() backlog.
#
# 在高并發(fā)的環(huán)境下,你需要把這個值調(diào)高以避免客戶端連接緩慢的問題。
# Linux 內(nèi)核會一聲不響的把這個值縮小成 /proc/sys/net/core/somaxconn 對應(yīng)的值,
# 所以你要修改這兩個值才能達到你的預(yù)期。
tcp-backlog 511
# Unix socket.
#指定Unix socket路徑以用來監(jiān)聽進來的連接。
#該值沒有默認(rèn)值,如果不指定,redis將不監(jiān)聽socket
#
# unixsocket /tmp/redis.sock
# unixsocketperm 700
# 一個客戶端空閑N秒后,將關(guān)閉與該客戶端的連接 (N為0時將關(guān)閉該功能)
timeout 0
# TCP keepalive.(TCP心跳包)
#
# 如果設(shè)置為非零,則在與客戶端缺乏通訊的時候使用 SO_KEEPALIVE 發(fā)送 tcp acks 給客戶端。
# 這個之所有有用,主要由兩個原因:
#
# 1) 檢測掛掉的對端
# 2) 降低中間設(shè)備出問題而導(dǎo)致網(wǎng)絡(luò)看似連接卻已經(jīng)與對端端口的問題
# 1) 檢測掛掉的對端。
# 2) 從網(wǎng)絡(luò)設(shè)備的角度使通信在中間過程中alive.
#
# 如果設(shè)置不為0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有兩個好處:檢測掛掉的對端。降低中間設(shè)備出問題而導(dǎo)致網(wǎng)絡(luò)看似連接卻已經(jīng)與對端端口的問題。在Linux內(nèi)核中,設(shè)置了keepalive,redis會定時給對端發(fā)送ack。檢測到對端關(guān)閉需要兩倍的設(shè)置值。
#
# 自Redis3.2.1開始,推薦一個合理的值為300秒
#
tcp-keepalive 300
################################# GENERAL #####################################
# 默認(rèn)情況下 redis 不是作為守護進程運行的,如果你想讓它在后臺運行,你就把它改成 yes。
# 當(dāng)redis作為守護進程運行的時候,它會寫一個 pid 到 /var/run/redis.pid 文件里面。
daemonize yes
# 可以通過upstart和systemd管理Redis守護進程,這個參數(shù)是和具體的操作系統(tǒng)相關(guān)的。
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#? supervised no? ? ? - no supervision interaction
#? supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#? supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#? supervised auto? ? - detect upstart or systemd method based on
#? ? ? ? ? ? ? ? ? ? ? ? UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#? ? ? They do not enable continuous liveness pings back to your supervisor.
supervised no
# 如果制定了進程文件,redis將在開始的時候?qū)懭氩⒃谕顺龅臅r候刪除該文件
#
# 如果沒設(shè)置后臺守護進程,且沒指定pidfile,則沒有pid文件被創(chuàng)建
# 如果設(shè)置了后臺守護進程,則會創(chuàng)建/var/run/redis.pid
# 如果沒設(shè)置后臺守護進程,且指定了pidfile,則以pidfile為準(zhǔn)
# 創(chuàng)建pid文件是盡力服務(wù)行為,如果創(chuàng)建失敗,也并不會產(chǎn)生什么壞的影響,redis仍然會正常啟動
# 意思就是如果沒創(chuàng)建成功也無所謂不耽誤Redis正常啟動和運行
#
pidfile /var/run/redis_6379.pid
# 定義日志級別。
# 可以是下面的這些值:
# debug (適用于開發(fā)或測試階段)
# verbose (比debug少點,但是也不少)
# notice (適用于生產(chǎn)環(huán)境)
# warning (僅僅一些重要的消息被記錄)
loglevel notice
# 指定了記錄日志的文件。
# 空字符串的話,日志會打印到標(biāo)準(zhǔn)輸出設(shè)備。
# 后臺運行的redis標(biāo)準(zhǔn)輸出是/dev/null。
logfile /var/log/redis_6379.log
# 要想把日志記錄到系統(tǒng)日志,就把它改成 yes,
# 也可以可選擇性的更新其他的syslog 參數(shù)以達到你的要求
# syslog-enabled no
# 指定 syslog 的 identity.
# syslog-ident redis
# 設(shè)置syslog的facility,必須是USER或者是LOCAL0-LOCAL7之間的值。
# syslog-facility local0
# 設(shè)置數(shù)據(jù)庫的數(shù)目。
# 默認(rèn)數(shù)據(jù)庫是DB0,你可以在每個連接上使用 select 命令選擇一個不同的數(shù)據(jù)庫
# 但是 dbid 必須是一個介于0到databasees -1之間的值
databases 16
################################ SNAPSHOTTING? ################################
#
# Save the DB on disk:
#
#? 格式? save <間隔時間 (秒)> <寫入次數(shù)>
#
# 根據(jù)給定的時間間隔和寫入次數(shù)將數(shù)據(jù)保存到磁盤
#
# 下面的例子的意思是:
# 900 秒內(nèi)如果至少有 1 個 key 的值變化,則保存
# 300 秒內(nèi)如果至少有 10 個 key 的值變化,則保存
# 60 秒內(nèi)如果至少有 10000 個 key 的值變化,則保存
#
# 注意:你可以注釋掉所有的 save 行來停用保存功能。
# 也可以直接一個空字符串來實現(xiàn)停用:
#
# save ""
save 900 1
save 300 10
save 60 10000
# 默認(rèn)情況下,如果 redis 最后一次的后臺保存失敗,redis 將停止接受寫操作,
# 這樣以一種強硬的方式讓用戶知道數(shù)據(jù)不能正確的持久化到磁盤,
# 否則就會沒人注意到災(zāi)難的發(fā)生。
#
# 如果后臺保存進程重新啟動工作了,redis 也將自動的允許寫操作。
#
# 然而你要是安裝了靠譜的監(jiān)控,你可能不希望 redis 這樣做,那你就改成 no 好了。
stop-writes-on-bgsave-error yes
# 是否在 dump .rdb 數(shù)據(jù)庫的時候使用 LZF 壓縮字符串
# 默認(rèn)都設(shè)為 yes
# 如果你希望保存子進程節(jié)省點cpu,你就設(shè)置它為 no ,
# 不過這個數(shù)據(jù)集可能就會比較大
rdbcompression yes
# 是否校驗rdb文件
# 從rdb格式的第五個版本開始,在rdb文件的末尾會帶上CRC64的校驗和。
# 這跟有利于文件的容錯性,但是在保存rdb文件的時候
# 會有大概10%的性能損耗,所以如果你追求高性能,可以關(guān)閉該配置。
rdbchecksum yes
# 設(shè)置dump文件的名字
dbfilename dump.rdb
# 工作目錄.
#
# 例如上面的 dbfilename 只指定了文件名,
# 但是它會寫入到這個目錄下。
#
# The Append Only File 也將被創(chuàng)建在這個目錄下.
#
# 這個配置項一定是個目錄,而不能是文件名。
dir /var/lib/redis/6379
################################# REPLICATION #################################
# 主從復(fù)制
# Master-Slave replication. Use slaveof to make a Redis instance a copy of
# another Redis server. A few things to understand ASAP about Redis replication.
#
# 1) Redis replication is asynchronous, but you can configure a master to
#? ? stop accepting writes if it appears to be not connected with at least
#? ? a given number of slaves.
# 2) Redis slaves are able to perform a partial resynchronization with the
#? ? master if the replication link is lost for a relatively small amount of
#? ? time. You may want to configure the replication backlog size (see the next
#? ? sections of this file) with a sensible value depending on your needs.
# 3) Replication is automatic and does not need user intervention. After a
#? ? network partition slaves automatically try to reconnect to masters
#? ? and resynchronize with them.
#
# 復(fù)制選項,slave復(fù)制對應(yīng)的master。
# slaveof
# 如果master設(shè)置了requirepass,那么slave要連上master,需要有master的密碼才行。masterauth就是用來配置master的密碼,這樣可以在連上master后進行認(rèn)證。
#
# masterauth
# 當(dāng)從庫同主機失去連接或者復(fù)制正在進行,從機庫有兩種運行方式:
# 1) 如果slave-serve-stale-data設(shè)置為yes(默認(rèn)設(shè)置),從庫會繼續(xù)響應(yīng)客戶端的請求。
# 2) 如果slave-serve-stale-data設(shè)置為no,除去INFO和SLAVOF命令之外的任何請求都會返回一個錯誤”SYNC with master in progress”。
#
slave-serve-stale-data yes
#你可以配置一個 slave 實體是否接受寫入操作。
# 通過寫入操作來存儲一些短暫的數(shù)據(jù)對于一個 slave 實例來說可能是有用的,
# 因為相對從 master 重新同步數(shù)而言,據(jù)數(shù)據(jù)寫入到 slave 會更容易被刪除。
# 但是如果客戶端因為一個錯誤的配置寫入,也可能會導(dǎo)致一些問題。
#
# 從 redis 2.6 版起,默認(rèn) slaves 都是只讀的。
#
#? 注意:只讀的 slaves 沒有被設(shè)計成在 internet 上暴露給不受信任的客戶端。
# 它僅僅是一個針對誤用實例的一個保護層。
# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve
# security of read only slaves using 'rename-command' to shadow all the
# administrative / dangerous commands.
slave-read-only yes
# Replication SYNC strategy: disk or socket.
#
# -------------------------------------------------------
# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY
# -------------------------------------------------------
#
# 是否使用diskless方式復(fù)制數(shù)據(jù)。
# 目前redis復(fù)制提供兩種方式,disk-back和diskless。
# 如果新的slave連上來或者重連的slave無法部分同步,就會執(zhí)行全量同步,master會生成rdb文件。有2種方式:
# disk-back方式是master創(chuàng)建一個新的進程把rdb文件保存到磁盤,再把磁盤上的rdb文件傳遞給slave。
# diskless方式是master創(chuàng)建一個新的進程,直接把rdb文件以socket的方式發(fā)給slave。disk方式的時候,當(dāng)一個rdb保存的過程中,多個slave都能共享這個rdb文件。diskless的方式就的一個個slave順序復(fù)制。
# 在磁盤速度緩慢,網(wǎng)速快的情況下推薦用diskless方式。
repl-diskless-sync no
#diskless復(fù)制的延遲時間,防止設(shè)置為0。一旦復(fù)制開始,節(jié)點不會再接收新slave的復(fù)制請求直到下一個rdb傳輸。所以最好等待一段時間,等更多的slave連上來。
repl-diskless-sync-delay 5
# slave根據(jù)指定的時間間隔向服務(wù)器發(fā)送ping請求。時間間隔可以通過 repl_ping_slave_period 來設(shè)置,默認(rèn)10秒。
#
# repl-ping-slave-period 10
# 復(fù)制連接超時時間。
# master和slave都有超時時間的設(shè)置。
# master檢測到slave上次發(fā)送的時間超過repl-timeout,即認(rèn)為slave離線,清除該slave信息。
# slave檢測到上次和master交互的時間超過repl-timeout,則認(rèn)為master離線。
# 需要注意的是repl-timeout需要設(shè)置一個比repl-ping-slave-period更大的值,不然會經(jīng)常檢測到超時。
#
# repl-timeout 60
# 是否禁止復(fù)制tcp鏈接的tcp nodelay參數(shù),可傳遞yes或者no。默認(rèn)是no,即使用tcp nodelay。如果master設(shè)置了yes來禁止tcp nodelay設(shè)置,在把數(shù)據(jù)復(fù)制給slave的時候,會減少包的數(shù)量和更小的網(wǎng)絡(luò)帶寬。但是這也可能帶來數(shù)據(jù)的延遲。
# 如果選擇no,數(shù)據(jù)復(fù)制到slave上的延遲將降低,但是這需要更高的帶寬
# 默認(rèn)我們推薦更小的延遲,但是在數(shù)據(jù)量傳輸很大的場景下,建議選擇yes。
repl-disable-tcp-nodelay no
# 設(shè)置主從復(fù)制容量大小。
# 這個 backlog 是一個用來在 slaves 被斷開連接時用來保存最新復(fù)制的命令。
# 這樣在slave離線的時候,不需要完全復(fù)制master的數(shù)據(jù),
# 如果可以執(zhí)行部分同步,只需要把緩沖區(qū)的部分?jǐn)?shù)據(jù)復(fù)制給slave,就能恢復(fù)正常復(fù)制狀態(tài)。
# 緩沖區(qū)的大小越大,slave離線的時間可以更長,
# 復(fù)制緩沖區(qū)只有在有slave連接的時候才分配內(nèi)存。沒有slave的
# 一段時間,內(nèi)存會被釋放出來,默認(rèn)1m。
# repl-backlog-size 1mb
# master沒有slave一段時間會釋放復(fù)制緩沖區(qū)的內(nèi)存,
# repl-backlog-ttl用來設(shè)置該時間長度。單位為秒。
# repl-backlog-ttl 3600
# 當(dāng)master不可用,Sentinel會根據(jù)slave的優(yōu)先級選舉一個master。
# 優(yōu)先級值越小的slave,當(dāng)選master。而配置成0,永遠(yuǎn)不會被選舉。
# 默認(rèn)優(yōu)先級為 100.
slave-priority 100
# redis提供了可以讓master停止寫入的方式,
# 如果配置了min-slaves-to-write,健康的slave的個數(shù)小于N,mater就禁止寫入。
# master最少得有多少個健康的slave存活才能執(zhí)行寫命令。
# 這個配置雖然不能保證N個slave都一定能接收到master的寫操作,
# 但是能避免沒有足夠健康的slave的時候,master不能寫入來避免數(shù)據(jù)丟失。
# 設(shè)置為0是關(guān)閉該功能。
#
# 例如至少需要三個slave 延遲小于等于10s才認(rèn)為是一個健康的集群? 如下設(shè)置:
#
# min-slaves-to-write 3
# min-slaves-max-lag 10
#
# 默認(rèn)將min-slaves-to-write設(shè)置為 0 (關(guān)閉該功能) 并且將
# min-slaves-max-lag設(shè)置為10.
#Redis master能夠以不同的方式列出所連接slave的地址和端口。
#?例如,“INFO replication”部分提供此信息,除了其他工具之外,
# Redis Sentinel還使用該信息來發(fā)現(xiàn)slave實例。
#?此信息可用的另一個地方在masterser的“ROLE”命令的輸出中。
#?通常由slave報告的列出的IP和地址,通過以下方式獲得:
#?IP:通過檢查slave與master連接使用的套接字的對等體地址自動檢測地址。
#?端口:端口在復(fù)制握手期間由slavet通信,并且通常是slave正在使用列出連接的端口。
#?然而,當(dāng)使用端口轉(zhuǎn)發(fā)或網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)時,slave實際上可以通過(不同的IP和端口對)來到達。
# slave可以使用以下兩個選項,以便向master報告一組特定的IP和端口,
#?以便INFO和ROLE將報告這些值。
#?如果你需要僅覆蓋端口或IP地址,則沒必要使用這兩個選項。
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
################################## SECURITY ###################################
# requirepass配置可以讓用戶使用AUTH命令來認(rèn)證密碼,才能使用其他命令。
# 這讓redis可以使用在不受信任的網(wǎng)絡(luò)中。
# 為了保持向后的兼容性,可以注釋該命令,因為大部分用戶也不需要認(rèn)證。
# 使用requirepass的時候需要注意,
# 因為redis太快了,每秒可以認(rèn)證15w次密碼,簡單的密碼很容易被攻破,
# 所以最好使用一個更復(fù)雜的密碼。
# requirepass foobared
#
# 把危險的命令給修改成其他名稱。
# 比如CONFIG命令可以重命名為一個很難被猜到的命令,
# 這樣用戶不能使用,而內(nèi)部工具還能接著使用。
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# 設(shè)置成一個空的值,可以禁止一個命令
#
# rename-command CONFIG ""
#
#注意,修改命令的名字會被記錄到AOF文件或者發(fā)送給slave,這可能會引發(fā)問題
#
################################### LIMITS ####################################
# 設(shè)置能連上redis的最大客戶端連接數(shù)量。默認(rèn)是10000個客戶端連接。由于redis不區(qū)分連接是客戶端連接還是內(nèi)部打開文件或者和slave連接等,所以maxclients最小建議設(shè)置到32。如果超過了maxclients,redis會給新的連接發(fā)送’max number of clients reached’,并關(guān)閉連接。
# maxclients 10000
# redis配置的最大內(nèi)存容量。如果你設(shè)置了這個值,當(dāng)緩存的數(shù)據(jù)容量達到這個值, redis 將根據(jù)你選擇的
# eviction 策略來移除一些 keys。
#
# 如果 redis 不能根據(jù)策略移除 keys ,或者是策略被設(shè)置為 ‘noeviction’,
# redis 將開始響應(yīng)錯誤給命令,如 set,lpush 等等,
# 并繼續(xù)響應(yīng)只讀的命令,如 get
#當(dāng)內(nèi)存滿了,需要配合maxmemory-policy策略進行處理。注意slave的輸出緩沖區(qū)是不計算在maxmemory內(nèi)的。所以為了防止主機內(nèi)存使用完,建議設(shè)置的maxmemory需要更小一些。
# maxmemory
# MAXMEMORY POLICY: 內(nèi)存容量超過maxmemory后緩存移除策略(五個)
# how Redis will select what to remove when maxmemory
# is reached. You can select among five behaviors:
#
#volatile-lru:利用LRU算法移除設(shè)置過過期時間的key。
#volatile-random:隨機移除設(shè)置過過期時間的key。
#volatile-ttl:移除即將過期的key,根據(jù)最近過期時間來刪除(輔以TTL)
#allkeys-lru:利用LRU算法移除任何key。
#allkeys-random:隨機移除任何key。
#noeviction:不移除任何key,只是返回一個寫錯誤。
#上面的這些驅(qū)逐策略,如果redis沒有合適的key驅(qū)逐,對于寫命令,還是會返回錯誤。redis將不再接收寫請求,只接收get請求。寫命令包括: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 noeviction
#lru檢測的樣本數(shù)。使用lru或者ttl淘汰算法,從需要淘汰的列表中隨機選擇sample個key,選出閑置時間最長的key移除。
#
# 關(guān)于LRU算法:
# 5產(chǎn)生的結(jié)果足夠好。10的結(jié)果最真實但是需要付出更多的CPU作為成本。
# 3非常快,但是結(jié)果非常不準(zhǔn)去
#
# maxmemory-samples 5
############################## APPEND ONLY MODE ###############################
#默認(rèn)redis使用的是rdb方式持久化,這種方式在許多應(yīng)用中已經(jīng)足夠用了。但是redis如果中途宕機,會導(dǎo)致可能有幾分鐘的數(shù)據(jù)丟失,根據(jù)save來策略進行持久化,Append Only File是另一種持久化方式,可以提供更好的持久化特性。Redis會把每次寫入的數(shù)據(jù)在接收后都寫入 appendonly.aof 文件,每次啟動時Redis都會先把這個文件的數(shù)據(jù)讀入內(nèi)存里,先忽略RDB文件。
appendonly no
# aof文件名
appendfilename "appendonly.aof"
#aof持久化策略的配置
#no表示不執(zhí)行fsync,由操作系統(tǒng)保證數(shù)據(jù)同步到磁盤,速度最快。
#always表示每次寫入都執(zhí)行fsync,以保證數(shù)據(jù)同步到磁盤。
#everysec表示每秒執(zhí)行一次fsync,可能會導(dǎo)致丟失這1s數(shù)據(jù)。dis-persistence-demystified.html
#
# 如果不確定,選擇"everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# 在aof重寫或者寫入aof文件的時候,會執(zhí)行大量IO,此時對于everysec和always的aof模式來說,執(zhí)行fsync會造成阻塞過長時間,no-appendfsync-on-rewrite字段設(shè)置為默認(rèn)設(shè)置為no。如果對延遲要求很高的應(yīng)用,這個字段可以設(shè)置為yes,否則還是設(shè)置為no,這樣對持久化特性來說這是更安全的選擇。設(shè)置為yes表示rewrite期間對新寫操作不fsync,暫時存在內(nèi)存中,等rewrite完成后再寫入,默認(rèn)為no,建議yes。Linux的默認(rèn)fsync策略是30秒。可能丟失30秒數(shù)據(jù)。
no-appendfsync-on-rewrite no
# aof自動重寫配置。當(dāng)目前aof文件大小超過上一次重寫的aof文件大小的百分之多少進行重寫,即當(dāng)aof文件增長到一定大小的時候Redis能夠調(diào)用bgrewriteaof對日志文件進行重寫。當(dāng)前AOF文件大小是上次日志重寫得到AOF文件大小的二倍(設(shè)置為100)時,自動啟動新的日志重寫過程。
# 如果將百分比指定為0,則表示關(guān)閉該功能
auto-aof-rewrite-percentage 100
#設(shè)置允許重寫的最小aof文件大小,避免了達到約定百分比但尺寸仍然很小的情況還要重寫
auto-aof-rewrite-min-size 64mb
# aof文件可能在尾部是不完整的,當(dāng)redis啟動的時候,aof文件的數(shù)據(jù)被載入內(nèi)存。重啟可能發(fā)生在redis所在的主機操作系統(tǒng)宕機后,尤其在ext4文件系統(tǒng)沒有加上data=ordered選項(redis宕機或者異常終止不會造成尾部不完整現(xiàn)象。)出現(xiàn)這種現(xiàn)象,可以選擇讓redis退出,或者導(dǎo)入盡可能多的數(shù)據(jù)。如果選擇的是yes,當(dāng)截斷的aof文件被導(dǎo)入的時候,會自動發(fā)布一個log給客戶端然后load。如果是no,用戶必須手動redis-check-aof修復(fù)AOF文件才可以。
aof-load-truncated yes
################################ LUA SCRIPTING? ###############################
# 如果達到最大時間限制(毫秒),redis會記個log,然后返回error。當(dāng)一個腳本超過了最大時限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一個可以殺沒有調(diào)write命令的東西。要是已經(jīng)調(diào)用了write,只能用第二個命令殺。
lua-time-limit 5000
################################ REDIS CLUSTER? ###############################
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however
# in order to mark it as "mature" we need to wait for a non trivial percentage
# of users to deploy it in production.
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# 集群開關(guān),默認(rèn)是不開啟集群模式。
#
# cluster-enabled yes
#集群配置文件的名稱,每個節(jié)點都有一個集群相關(guān)的配置文件,持久化保存集群的信息。這個文件并不需要手動配置,這個配置文件有Redis生成并更新,每個Redis集群節(jié)點需要一個單獨的配置文件,請確保與實例運行的系統(tǒng)中配置文件名稱不沖突
#
# cluster-config-file nodes-6379.conf
# 節(jié)點互連超時的閥值。集群節(jié)點超時毫秒數(shù)
#
# cluster-node-timeout 15000
#在進行故障轉(zhuǎn)移的時候,全部slave都會請求申請為master,但是有些slave可能與master斷開連接一段時間了,導(dǎo)致數(shù)據(jù)過于陳舊,這樣的slave不應(yīng)該被提升為master。該參數(shù)就是用來判斷slave節(jié)點與master斷線的時間是否過長。判斷方法是:
#比較slave斷開連接的時間和(node-timeout * slave-validity-factor) + repl-ping-slave-period
#如果節(jié)點超時時間為三十秒, 并且slave-validity-factor為10,假設(shè)默認(rèn)的repl-ping-slave-period是10秒,即如果超過310秒slave將不會嘗試進行故障轉(zhuǎn)移
# cluster-slave-validity-factor 10
#master的slave數(shù)量大于該值,slave才能遷移到其他孤立master上,如這個參數(shù)若被設(shè)為2,那么只有當(dāng)一個主節(jié)點擁有2 個可工作的從節(jié)點時,它的一個從節(jié)點會嘗試遷移。
#
# cluster-migration-barrier 1
# 默認(rèn)情況下,集群全部的slot有節(jié)點負(fù)責(zé),集群狀態(tài)才為ok,才能提供服務(wù)。設(shè)置為no,可以在slot沒有全部分配的時候提供服務(wù)。不建議打開該配置,這樣會造成分區(qū)的時候,小分區(qū)的master一直在接受寫請求,而造成很長時間數(shù)據(jù)不一致。
# cluster-require-full-coverage yes
################################## SLOW LOG ###################################
# slog log是用來記錄redis運行中執(zhí)行比較慢的命令耗時。當(dāng)命令的執(zhí)行超過了指定時間,就記錄在slow log中,slog log保存在內(nèi)存中,所以沒有IO操作。
# 執(zhí)行時間比slowlog-log-slower-than大的請求記錄到slowlog里面,單位是微秒,所以1000000就是1秒。注意,負(fù)數(shù)時間會禁用慢查詢?nèi)罩荆?則會強制記錄所有命令。
slowlog-log-slower-than 10000
# 慢查詢?nèi)罩鹃L度。當(dāng)一個新的命令被寫進日志的時候,最老的那個記錄會被刪掉。這個長度沒有限制。只要有足夠的內(nèi)存就行。你可以通過 SLOWLOG RESET 來釋放內(nèi)存。
slowlog-max-len 128
################################ LATENCY MONITOR ##############################
# 延遲監(jiān)控功能是用來監(jiān)控redis中執(zhí)行比較緩慢的一些操作,用LATENCY打印redis實例在跑命令時的耗時圖表。只記錄大于等于下邊設(shè)置的值的操作。0的話,就是關(guān)閉監(jiān)視。默認(rèn)延遲監(jiān)控功能是關(guān)閉的,如果你需要打開,也可以通過CONFIG SET命令動態(tài)設(shè)置。單位毫秒。
latency-monitor-threshold 0
############################# EVENT NOTIFICATION ##############################
# 鍵空間通知使得客戶端可以通過訂閱頻道或模式,來接收那些以某種方式改動了 Redis 數(shù)據(jù)集的事件。因為開啟鍵空間通知功能需要消耗一些 CPU ,所以在默認(rèn)配置下,該功能處于關(guān)閉狀態(tài)。
#notify-keyspace-events 的參數(shù)可以是以下字符的任意組合,它指定了服務(wù)器該發(fā)送哪些類型的通知:
#K 鍵空間通知,所有通知以 __keyspace@__ 為前綴
#E 鍵事件通知,所有通知以 __keyevent@__ 為前綴
#g DEL 、 EXPIRE 、 RENAME 等類型無關(guān)的通用命令的通知
#$ 字符串命令的通知
#l 列表命令的通知
#s 集合命令的通知
#h 哈希命令的通知
#z 有序集合命令的通知
#x 過期事件:每當(dāng)有過期鍵被刪除時發(fā)送
#e 驅(qū)逐(evict)事件:每當(dāng)有鍵因為 maxmemory 政策而被刪除時發(fā)送
#A 參數(shù) g$lshzxe 的別名
#輸入的參數(shù)中至少要有一個 K 或者 E,否則的話,不管其余的參數(shù)是什么,都不會有任何 通知被分發(fā)。詳細(xì)使用可以參考http://redis.io/topics/notifications
#
# 比如想訂閱key的過期通知,就設(shè)成Ex,E表示key的事件,x表示key過期事件
# 默認(rèn)情況下鍵空間通知都是關(guān)閉因為用戶通常不需要這項功能
#? 并且這項功能將產(chǎn)生額外開銷
# 注意在使用的時候至少帶上K或者E,否則事件將不會被報告
notify-keyspace-events ""
############################### ADVANCED CONFIG ###############################
# 數(shù)據(jù)量小于等于hash-max-ziplist-entries的用ziplist
# 大于hash-max-ziplist-entries用hash
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 為了節(jié)省存儲空間,Lists也用一種特別的方式進行編碼
# 每個內(nèi)部列表節(jié)點允許的條目數(shù)可以指定為一個固定的最大大小或最大數(shù)量的元素。
# 對于一個固定的最大大小,使用- 5 - -1 ,表示:
# -5: max size: 64 Kb? <-- 不推薦用于正常工作負(fù)載
# -4: max size: 32 Kb? <-- 不推薦
# -3: max size: 16 Kb? <-- 不推薦
# -2: max size: 8 Kb? <-- good
# -1: max size: 4 Kb? <-- good
# 正數(shù)意味著每列節(jié)點元素能夠最多存儲_exactly_個
# 最高表現(xiàn)的選項通常是- 2(8 KB大小)或- 1(4 KB大小)
# 但如果您的用例是唯一的,調(diào)整設(shè)置必要。
list-max-ziplist-size -2
# 這個參數(shù)表示一個quicklist兩端不被壓縮的節(jié)點個數(shù)。
# 列表也可以被壓縮
#在quicklist的源碼中提到了一個LZF的壓縮算法,該算法用于對quicklist的節(jié)點進行壓縮操作。
# list的設(shè)計目的是能夠存放很長的數(shù)據(jù)列表,當(dāng)列表很長時,必然會占用很高的內(nèi)存空間,
# 且list中最容易訪問的是兩端的數(shù)據(jù),中間的數(shù)據(jù)訪問率較低,
# 于是就可以從這個出發(fā)點來進一步節(jié)省內(nèi)存用于其他操作:
# 0 特殊值,表示不壓縮
# 1 表示quicklist兩端各有一個節(jié)點不壓縮,中間的節(jié)點壓縮
# 2 表示quicklist兩端各有兩個節(jié)點不壓縮,中間的節(jié)點壓縮
# 3 表示quicklist兩端各有三個節(jié)點不壓縮,中間的節(jié)點壓縮
# 以此類推。
# 由于0是個特殊值,很容易看出quicklist的頭節(jié)點和尾節(jié)點總是不被壓縮的,以便于在表的兩端進行快速存取。
list-compress-depth 0
# 數(shù)據(jù)量小于等于set-max-intset-entries用iniset,大于set-max-intset-entries用set。
set-max-intset-entries 512
# 數(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)。一個比16000大的value是幾乎沒用的,建議的value大概為3000。如果對CPU要求不高,對空間要求較高的,建議設(shè)置到10000左右。
hll-sparse-max-bytes 3000
#Redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行重新hash,可以降低內(nèi)存的使用。當(dāng)你的使用場景中,有非常嚴(yán)格的實時性需要,不能夠接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置為no。如果沒有這么嚴(yán)格的實時性要求,可以設(shè)置為yes,以便能夠盡可能快的釋放內(nèi)存。
activerehashing yes
#對客戶端輸出緩沖進行限制可以強迫那些不從服務(wù)器讀取數(shù)據(jù)的客戶端斷開連接,用來強制關(guān)閉傳輸緩慢的客戶端。
#對于normal client,第一個0表示取消hard limit,第二個0和第三個0表示取消soft limit,normal client默認(rèn)取消限制,因為如果沒有尋問,他們是不會接收數(shù)據(jù)的。
client-output-buffer-limit normal 0 0 0
#對于slave client和MONITER client,如果client-output-buffer一旦超過256mb,又或者超過64mb持續(xù)60秒,那么服務(wù)器就會立即斷開客戶端連接。
client-output-buffer-limit slave 256mb 64mb 60
# 對于pubsub client,如果client-output-buffer一旦超過32mb,又或者超過8mb持續(xù)60秒,那么服務(wù)器就會立即斷開客戶端連接。
client-output-buffer-limit pubsub 32mb 8mb 60
# redis會調(diào)用一些內(nèi)部功能來做一些后臺任務(wù),比如關(guān)閉超時的客戶端連接,清理過期的key等等
# 并不是所有的任務(wù)都以相同的頻率被執(zhí)行,redis通過hz的值為頻率檢查任務(wù)的執(zhí)行
# redis執(zhí)行任務(wù)的周期為1s除以hz。
# 頻率范圍為1~500,但是一般來講100以上就不推薦。大多數(shù)用戶用戶應(yīng)該使用默認(rèn)值10
# 100以上一般是在非常低延遲的環(huán)境中使用
hz 10
# 在aof重寫的時候,如果打開了aof-rewrite-incremental-fsync開關(guān),
# 系統(tǒng)會每32MB執(zhí)行一次fsync。這對于把文件寫入磁盤是有幫助的,可以避免過大的延遲峰值。
aof-rewrite-incremental-fsync yes