redis :3.2.6版本
Redis 配置文件 示例
注意 爲了 讀取 此配置 文件, 開啓Redis 服務 時 此文件路徑 必須 作爲第一個參數:
# ./redis-server /path/to/redis.conf
單位 注意事項; 在表示內存大小時, 可以 使用 常規的格式 如 1k, 5GB, 4M 等這樣的 來表示:
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
所有的單位 都是 大小寫不敏感的 。所以 如 1GB 1Gb 1gB 都是 相同含義。
################################## 文件包含 ###################################
在這個位置 包含 一個或多個 另外的配置 文件 : 這樣做 很有用! 特別是你 有 一個 對大多數redis服務都適用的標準的模版,
並且 只是有一小部分 配置選項需要自定義設置。 包含的文件 又可以再包含其他文件。所以 這樣來使用的情況很多。
注意 “include” 包含的選項 不會被 (由 admin 或 Redis Sentinel 產生的 ) “CONFIG REWRITE” 這樣的命令 覆蓋。
由於 redis 總是 使用 最後一次處理的那一行 作爲 配置指令 的值, 所以你最好 將 這些“include” 放在這個文件的開頭,這樣就能避免 在 運行的時候 覆蓋 此文件中的配置 。
相反的,你想 使用 “include”s 去 覆蓋 此文件中 配置選項,你最好在此文件的 末尾 使用 “include”s
# include /path/to/local.conf
# include /path/to/other.conf
################################## 網絡 #####################################
默認的, 如果 沒有指定 “bind” 配置指令, Redis 就會 監聽 來自此服務器上 所有網卡接口 的連接。
可以使用 “bind” 配置指令(後邊 跟着 1個或多個ip 地址) 去 監聽 一個 或多個 網卡接口
例如:
# bind 192.168.1.100 10.0.0.1
#bind 127.0.0.1 ::1
~~~ 警告! ~~~ 如果 運行着 Redis 的這臺計算機 直接 暴露在 internet 網絡中, 那麼 對所有網卡接口都 bind監聽 就是
很危險的! 將 暴露給internet網絡中的 每個人。 所以 默認的,不要註釋 下面的 bind指令,這樣就會 強制 Redis 去
監聽IPv4 loolback 接口地址(這位意味着 Reids 將 只能 接受 來自 客戶端發到 此(正在運行的redis的)計算機上 綁定了接口的 連接)
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bind 127.0.0.1 192.168.8.129
保護模式 是一層安全保護,是爲了避免 在internet上保持打開的 Redis實例 被訪問 和被利用。
何時 保護模式應該開啓 ,條件是什麼:
- 服務 沒有顯式地 用 “bind” 指令 綁定 一些 ip地址。
- 沒有配置密碼
服務器 僅僅支持 來自 IPv4 和IPv6 loopback 地址 127.0.0.1 和 ::1 和 unix域 套接字 的 客戶端的 連接
默認的 保護模式 是 被禁用的。 如果你想讓來自其他主機 的客戶端 去連接 Redis, 即便是沒有配置密碼驗證,也
沒有 顯式地 使用 bind 指令 列出一些網卡接口 。
protected-mode yes
在指定的端口 接受連接, 默認是 6379。如果 port指定的 是0, Redis 將不會監聽 TCP 套接字
port 6379
# TCP listen() 積壓日誌(backlog)
#在每秒請求數很高的環境,你需要 高的 backlog, 是爲了避免 慢的 客戶端連接 問題。
#注意 Linux 內核(kernel) 將 默默的 截斷它的值 和 /proc/sys/net/core/somaxconn 的值一樣。
所以,確保同時提高 somaxconn 和 和 tcp_max_syn_backlog 的值 以達到 預期的效果。
tcp-backlog 511
# Unix 域套接字(Unix socket)
# 指定 Unix socket 的路徑 ,這通常用於去監聽新來的連接。 Unix socket 沒有默認值, 所以如果沒有指定
unix socket ,那麼Redis 也不會監聽。
# unixsocket /tmp/redis.sock
# unixsocketperm 700
如果 一個客戶端是閒置 N秒,就關閉這個連接。
# TCP 心跳包(keepalive).
# 如果 非零, 使用 SO_KEEPALIVE 發送 TCP ACKs 給缺乏交流的客戶端。 這樣做很有用!,基於如下兩個原因:
# 1. 檢測 死亡對
# 2. 接受 活着的(從中間的網絡設備角度來看)連接 ;
# 在Linux , 用秒爲單位指定的值, 通常作爲 發送ACKs 的間隔時間。 注意, 爲了關閉連接需要雙倍的時間。
# 在其他的內核系統上, 間隔時間取決於 內核的配置。
# 這個選項 合理的,推薦的值是 300秒, 從Redis 3.2.1 開始就開始使用這個新的值了。
tcp-keepalive 300
################################# 常規(GENERAL) #####################################
# 默認 Redis 不會以守護進程方式來運行。 如果你需要守護進程方式來啓動 ,使用 yes 。
# 注意 當守護進程方式的方式運行時, Redis 將會在 /var/run/redis.pid 下創建一個 pid 文件。
daemonize yes
# 如果你從 upstart 或者 systemd 來運行Redis, Redis 可以和 supervison tree 交互。 選項:
# supervised no - 無監督交互
# supervised upstart - 放 Redis 到 SIGSTOP mode 就會 signal upstart
# supervised systemd - 寫 READY=1 到 $NOTIFY_SOCKET
# supervised auto - 基於 UPSTART_JOB 或 NOTIFY_SOCKET 環境變量 偵測 upstart 或者method方法。
# 注意: 這些監督方法 僅是 進程只讀的信號
# 他們不啓用 持續不斷的活力 pings 回到 你的 supervisor.
# supervised no
# 如果 指定了 pid 文件, Redis 在startup 時寫入, 在退出時 刪除 pid 文件
# 當server 非守護進程方式 運行, 且 配置文件也沒有指定,則 不會有pid 文件被創建,
# 當server 是守護方式運行, 則即便是 沒指定 pid 文件也會被創建,默認是 /var/run/redis.pid
# 創建 一個 pid 文件 是最好的嘗試: 如果redis 不能夠創建 它,也不會有壞的結果產生,服務還是會 正常的開始運行
pidfile /var/run/redis_6379.pid
# 指定服務的 冗餘級別
# 可取的值如下:
# debug (對 開發/測試 有用 的 大量的 信息)
# verbose ( 許多 罕見 的有用信息, 不像 debug 級別 那樣雜亂)
# notice ( 適用於 生產環境的, 適量的冗餘信息)
# warning ( 只記錄 重要的 或 關鍵的 )
loglevel notice
# 指定日誌文件名, 也可以是空字符,這被通常強制 redis 輸出日誌到標準輸出上, 注意如果你在守護方式運行方式下,使用了
# 標準輸出,那麼日誌 將會被 發送到 /dev/null
logfile ""
# 如果要 記錄 系統日誌,只需要 設置 ‘syslog-enabled’ 爲 yes, 你可以根據你的需要 選擇性的 改變其他的syslog參數
# syslog-enabled no
# 指定 syslog 身份
# syslog-ident redis
# 指定 syslog 設置 , 必須是 USER 或者 在 LOCAL0-LOCAL7.
# 設置數據庫 的數量, 默認的database 是 DB 0, 你可以 使用 select <dbid> where dbid 來爲具體的連接選擇不同的databse
# dbid 是一個數字 取值 在 0 and ‘databases’-1 之間。
################################ 快照(SNAPSHOTTING) ################################
保存 DB 到 硬盤上:
save <seconds> <changes>
如果 指定了 秒數,和指定了寫操作的次數, 那麼就會保存到DB;
下面的例子中,相應的行爲將被保存。
過了 900s ,且 至少有一個 key發生了改變。
過了 300s, 且 至少有10個key 發生了改變。
過了 60s, 且至少有 10000個 key 發生了改變。
注意: 你可以通過 註釋掉所以的”save”行 來 完全禁用 saving
可以通過 save 指令 攜帶一個 空字符串參數 來移除所有 先前配置的save 點。就想下面這樣:
# save “”
save 900 1
save 300 10
save 60 10000
#默認的 如果 RDB 快照 被啓用(至少有一個save 點)並且 最近一次 後臺save 失敗,那麼Redis 將停止接受 寫操作。
這個使用戶意識到數據沒有被很好的持久化到硬盤上, 因此出現的情況是: 沒有人注意到 一些災難將要發生。
# 如果後臺saving進程 再次開始工作,Redis 會自動再次地允許寫。
# 然而 你已經 創建 Redis server 和 持久化 的監控, 你可能想禁用此功能,以讓Redis 繼續正常的工作,即便是發生了一些問題:比如:
硬盤的,權限的等等。
stop-writes-on-bgsave-error yes
# 當導出 .rdb 數據庫時,使用LZF 來對 string 對象進行壓縮?
# 默認地, 他將被設置爲 “yes”, 因爲 這幾乎總是最好的選擇。
# If you want to save some CPU in the saving child set it to 'no' but
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes
# 由於RDB 5版本 的一個CRC64 校驗和 被放置在文件末尾。
# 這樣做使這種格式 對 錯誤更加有抵抗能力,但是 當保存或加載RDB文件時,有性能損耗(大約10%) ,所以爲了最高的性能考慮
# 你可以 禁止它。
# 沒有 校驗和的 RDB 文件 有 zero 校驗,這個是爲了告訴 加載的代碼 跳過 檢測。
# rdbchecksum yes
# 將DB 導出 後的文件名
dbfilename dump.rdb
工作目錄
DB將被寫到此目錄,並使用上面 “dbfilename” 配置指令指定的名字。
僅僅是追加的文件 也會被創建到此目錄。
注意:你必須在這裏指定一個目錄,而不是文件。
dir ./
################################# 主從複製(REPLICATION) #################################
主從複製, 使用 slaveof 去 創建 另一個Redis 服務的 一個複製實例。 關於Redis 複製,需要理解下ASAP的一些方面。
1)Redis 複製 是異步進行的。在沒有達到最少指定數量的從的連接 時, 你可以配置master 來停止接受寫。
2)如果 複製連接 是 在相當短暫的時間內斷掉時,Redis 能夠執行 一個部分的重新同步(同master 的);你可能想要配置 複製 的backlog size(看這個文件的下個部分);backlog size的大小取決於你的需求
3)複製 時自動的,不需要用戶的交互,像網絡如果出現問題, 複製會自動 重新嘗試連接master 和重新和master同步
# slaveof <masterip> <masterport>
# 當 slave 失去和 master的連接, 或者 複製 仍在處理中, 那麼 slave 可以有兩種不同的行爲:
1) 如果 slave-server-stale-data 被設置爲 ‘yes’ (默認地),slave 仍然會響應 客戶端的請求, 可能響應的是過期數據,或者數據是空的
2) 如果 slave-serve-stale-data 被設置爲 ‘no’, slave 將響應一個錯誤“ SYNC with master in progress” 給 除了INFO 和 SLAVEOF的 所有的命令
slave-serve-stale-data yes
#你可以 配置 slave 實例 去接受或不接受 寫。 slave支持寫 可能 對 存儲一些 短暫臨時的數據 是很有用的,(因爲 寫在slave 的數據 可以很容易的在和master同步後被刪除), 但 如果客戶端的錯誤配置,也會引起問題
從 Redis 2.6 之後 默認的 slave 是隻讀的。
注意: 從服務 只讀 設置 不是 專爲 暴露給 在internet網絡上不信任的客戶端 設計的。它僅僅是 防止 錯誤使用 實例的 一個保護層。只讀 的從服務 默認地仍然會暴露所有的 管理性質的命令 如: “CONFIG”, “DEBUG”, 等等。 在一定程度上,你可以通過 使用“rename-command” 來掩蓋所有的管理的/危險的 命令。
slave-read-only yes
#複製 同步策略 : 硬盤 或者 socket
警告: 無硬盤複製 當前是 實驗性質。
#新的 slaves 和 重新建立連接的slave 是不能夠繼續 複製處理。 需要做的是叫做“全部同步“。
# 一個 RDB 文件 從 master 被傳播到 slaves.
# 有兩種不同的 傳播方式:
# 1) 硬盤back : master 創建一個新的 進程來在硬盤上寫 RDB 文件, 之後file 增量方式 從父進程 傳輸到 slave 。
#2) 無硬盤: master 創建一個新的進程 ,他 直接將 RDB文件 寫到 slave sockets, 完全不需要落地到硬盤
#使用硬盤的複製方式, RDB 文件生成時, 多個slave 排隊等待着處理, 當前RDB 文件被處理完成後,他就可以使用RDB文件來提供服務了。
無硬盤的複製 是 ,當前 一個 結束後,後邊排隊的傳輸就開始了。
#當使用 無硬盤複製時,master 可以等待一定時間(幾秒) 再開始傳輸,爲的就是 多個 slave 都能到達,然後並行傳輸。
#像 慢的硬盤速度, 和 快的,有大帶寬的網絡環境, 無硬盤複製 就更適合了。
repl-diskless-sync no
# 當啓用 無硬盤複製, 就很有必要 配置 延遲時間了, 這是爲了並行的開啓多個子進程 來通過 socket 將 RDB 傳輸 給 slaves
# 這很重要,因爲 一旦開始 傳輸了,他就不能去 服務 新來的slave 了, 新來的,只能排隊 等待下一次的 RDB 傳輸, 所以master
等待 一個 delay 時間 就是爲了 讓更多的slave 能及時到達。
# delay 以秒 爲單位, 且 默認 爲 5 秒, 爲了完全禁用它,你可以將它設置爲0, 這樣傳輸 使用 ASAP 方式
repl-diskless-sync-delay 5
# slaves 會 以事先定義好的間隔時間來發送PING 包。可以通過下面的選項 來改變 這個間隔時間的 值, 默認的值 是 10秒
# repl-ping-slave-period 10
#下面的 選項 設置 複製的超時時間 是爲了:
#1) 同步期間 大體量的傳輸 IO, 從slave角度看
#2)master超時時間, 從slaves 角度看 (data, pings)
# 3) slave 超時時間, 從 master角度看 ( Replconf ACK pings).
#
# 很重要的一點是 一定要 確保 下面選項的值 比 “repl-ping-slave-period “ 指定的 值大; 否則每次 master 和slave 的傳輸都會被
#認爲是 發生超時了,這是很很低效的傳輸。
#
# repl-timeout 60
# 在同步完成後 在 slave socket 上 禁用 TCP_NODELAY?
# 如果你設置爲 “yes” , Redis 將 使用 少量的TCP包 和少帶寬 來發送數據給 slaves.
# 但是這會使 數據到達 slave 上 增加延遲, 根據Linux 內核的默認配置 是 40毫秒。
# 如果 你 設置爲“no”, 數據到達slave 側 的延遲將會降低,但是會使用更多的帶寬。
# 默認的 我們優化的目標 是 低延遲, 但是在非常高的 傳輸負載 下、或者 master 和 slave 有許多跳 時,使用“yes” 可能是個好辦法。
repl-disable-tcp-nodelay no
# 設置複製 的“積壓大小” 。 這個 “backlog” 就是 緩衝, 有時slaves 失去連接時,積累從的數據 就放在這個緩衝區中, 所以當
# slave 再次連接進來,通常沒必要進行一個 完全的 同步,只需要部分的再 同步 就足夠了,只需要傳遞 slave 失去連接的這段時間的數據即可。
#
# 將 backlog 設置爲更大的值,就能支持 slave 失去連接的 時間更長。
# backlog 內存 只會被分配一次, 必要條件是 “至少有一個 slave ”,
#
# repl-backlog-size 1mb
#
# 在 master 和 slave 的連接 斷開一定時間後,backlog 對應緩衝區 將被釋放, 下面的配置選項 單位是秒。
#
# 0 的值 意味着 從來不要釋放 backlog.
#
# # repl-backlog-ttl 3600
# 有 小數字權重的 slave 是更有可能被 晉升, 所以 如果 現在 有 三個 slave 權重 分別是 10, 100, 25, 哨兵將會選擇 值爲10的slave,
# 因爲 他的值最小
#
# 然而 0 值的slave, 不能夠擔任master, 所以 0 值的slave, 不會被哨兵選擇來晉升。
#
# 默認的 權重的值 是 100
# slave-priority 100
#
# “如果 在 M秒的時間內,少於 N 個 slave 連接, master 就停止接受 寫” 這是可以做到的,
#
# N 個Slave 需要是 在線的狀態。
#
# 遲滯 的單位是秒, 它必須 小於等於 指定的值M, 遲滯的計算是從 收到上一個slave 發來的ping 開始計算。ping 通常每秒發送一個。
#
# 這個選項 不保證 N 個 slave 能接受 write, 但它可以限制 。。。。
#
# 例如: 至少 需要3 個 slave, 遲滯 小於等於 10秒 如下設置:
#
# min-slaves-to-write 3
# min-slaves-max-lag 10
# 可以 設置 上面的 爲 0 來禁用 此功能
#
# 默認的 “min-slaves-to-write” 被設置爲 0 (禁用此功能),min-slaves-max-lag 被設置爲 10
#
# master 能夠 以各種方式 列出 slave 的 地址 和端口 。如: “ INFO replication” , 它通常由 哨兵使用, 爲了去發現 slave.
# 另外一個地方 就是 master 的 “ROLE” 命令 的 輸出信息也包含它,
# slave 的 IP 地址 可以由 下面兩種方式獲取:
#
# IP: 可以通過 slave 到 master 連接 的 sockets 對 來自動的獲取 到
# Port : 在 slave 複製 的 握手階段,就可以得知 端口,
# 然而 當 端口轉發 或者 使用NAT , slave 可能被 通過 不同的IP 和 端口 到達。 下面的 兩個選項,slave 用來去 報告 給 master 它的 IP和port,
# 爲了 INFO 和 ROLE 能報告 這些值。
#
# slave-announce-ip 5.5.5.5
# slave-announce-port 1234
################################## 安全(SECURITY) ###################################
#要求 客戶端 在處理任何命令前 發出 AUTH <PASSWORD> 。 這可能 在某種環境下很有用,這樣環境是:你不信任其他的客戶端去訪問正在 運行着的 Redis服務器
#
# 爲了先後兼容,你可以註釋掉它,因爲大多數人不需要 auth (例如: 他們 運行他們自己的 服務器)
#
# 注意: 由於redis 是相當快, 外部的用戶 可以 以每秒 15萬次 去嘗試。 這意味着 使用 一個非常健壯的密碼, 否則很容易被破解。
#
# requirepass foobared
#
# 重命名 命令
#
# 在 一個共享的環境中 去對 危險的命令去重命名,是被允許的。例如 : CONFIG 命令, 它可以被重命名爲 更難猜的名字,這樣一般的客戶端
# 就不能再使用,對於內部使用的 工具 還是仍然可以使用此命令的。
#
# 例如:
#
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#
# 去完全禁用 一個命令 也是可以的,方法就是 重命名爲空字符串:
#
# rename-command CONFIG ""
#
#注意: 命令的名字,這種行爲也會被記錄在AOF 文件中 ,也會傳輸到slave 中,可能會引起問題。
################################### 限制(LIMITS) ####################################
#設置 在同一時間 的 最大 客戶端鏈接數量。 默認的,這個 limit 被設置爲 10000 客戶端。。。。
#
# 一旦 限制達到了, Redis將關閉所有新的連接,併發送給連接的另一端 一個錯誤“ max number of clients reached’.
#
# maxclients 10000
# 不要 使用內存超過 指定數量的字節
# 當 到達了內存限制,Redis 將 根據 相應的驅逐策略( maxmemory-policy ) 來嘗試移除 keys.
#
# 如果 不能夠根據 策略 來移除 keys 或者 policy 被設置爲 ‘不驅逐’, Redis 將 對一些命令響應 錯誤信息, 這些命令像
# SET, LPUSH,等等, 但它會繼續正常的響應 只讀的命令,如 GET.
#
# 如果Redis 被當作 LRU 緩存 時,這個選項很有用, 或者 被用來做一個嚴格內存限制(配合着,使用‘noeviction’ 策略).
#
# 警告: 如果 你的 slaves 開啓了 maxmemory, ………..【不能理解!】
#
# 簡而言之, 如果 你使用了 slave, 建議你 設置 一個更小的 maxmemory, 爲了在 slave上 系統還能爲 輸出緩衝,留有一些內存空間(
# 但是 如果 是‘noeviction’ 策略,就沒必要這樣做了)。
#
# maxmemory <bytes>
# MAXMEMORY 策略: 就是 當內存使用 達到 maxmemory 的值時, Redis 如何去移除keys
#
# volatile-lru, -> 使用LRU 算法 移除掉那些帶有 過期時間的key
# allkeys-lru -> 使用 LRU算法,移除掉 任意一個 key
# volatile-random -> 隨機地 刪除 一個帶過期時間的key
# allkeys-random -> 隨基地刪除 一個 任意的key
# volatile-ttl -> 移除那些馬上要過期的key (
# noeviction -> 不過期任何的key, 只是 對寫操作返回一個 錯誤
#
# 注意: 當沒有合適的key 來被刪除時, Redis 將對那些寫操作 返回 錯誤
#
# 能都寫過期日期的命令 是: 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 和 最小值 TTL 算法 不是 那種 罕見的算法, 而是 接近的算法 (都是爲了 節省內存),所以你可以 爲了速度 或者 精確性 來調整它。
# 默認地 Redis 將 檢測 5個keys 然後挑選一個 最近最少使用的, 你可以使用下面的配置 指令改變 這個 採樣大小
#
# 默認的5 是 能產生 足夠好的結果。 10左右 非常接近 真正的LRU,但是花費更多的CPU. 3 是 非常快,但不是非常精確
#
# maxmemory-samples 5
############################## 追加模式(APPEND ONLY MODE) ###############################
# 默認地 Reids 同步地到處數據到硬盤上。 這種模式 在大多數模式下 是足夠好了, 但是 Redis進程的問題 或者 突然的 停電 都可能
# 引起幾分鐘的數據丟失 (取決於配置的保存點)
#
# AOF 模式( Append Only File )是 一個 另類的持久化模式 它提供了更好的 持久性。 像使用了 fsync 策略 保存的數據,Redis 即便是在發生 如:
# 突然斷電的事件 或者 Redis 進程發生問題(但操作系統是仍然正確運行) 的 情況下 也只會丟失 一秒的寫數據。
#
# AOF 和 RDB 持久化方式 可以被同時使用,沒有任何問題。
# 如果AOF 被啓用了, 在Redis 啓動時 將會加載 AOF文件, 這個文件 會有更好的持久性的保證。
#
# 請 查看 http://redis.io/topics/persistence 來獲取更好的信息。
appendonly no
# 只 追加 文件 名字: (默認是 “appendonly.aof”)
appendfilename "appendonly.aof"
# fsync() 調用 告訴 操作系統 去 真實地 寫數據到硬盤上,而不是 等着 爲了有更多的數據到輸出緩衝。
# 一些OS 將真正地刷新數據到硬盤上, 一些其他的OS 將僅僅只是 試着去做 採用 ASAP方式。
#
# Redis 支持三種不同的模式:
#
# no : 不進行 fsync, 僅讓 OS 想刷新數據的時候再刷新。 這種快。
# always : 每次 寫append only 日誌 就去 fsync。 慢, 但是最安全。
# everysec : 每秒鐘 進行一次 fsync。 折中的方案。
#
# 默認是 “everysec”, 它通常是 速度快 和 數據安全 之間正確的折中,妥協的方案
#
# 更多詳情 可以檢查下面的標題:
# http://antirez.com/post/redis-persistence-demystified.html
#
# 如果不知道怎麼使用, 就用 ”everysec".
#
# appendfsync always
appendfsync everysec
# appendfsync no
# 當AOF fsync 策略被設置爲 always 或 everysec。 則後臺進程就會執行大量的I/O 操作, 在一些Linux配置, Redis 會在
# fsync上 阻塞很長時間。 注意當前 沒有修復這個問題。因爲即便 在不同的線程上執行,也將會阻塞我們的同步寫 調用。
#
# 爲了緩和這個問題, 使用下面的選項 將可以在 主進程正在調用BGSAVE 或 BGREWRITEAOF 時,阻止主進程調用fsync()。
#
# 這意味着 當另一個子進程 正在保存,Redis 的 持久性和 “appendfsync none” 一樣。 在特殊的時期,在特殊情況,Redis可能
# 丟失 達到 30秒( 這是 Linux 系統的默認設置)的數據。
#
# 如果你有潛在的問題 ,你可以改爲“yes” 。 否則,就讓它爲 “no”, 這是 從 持久性的角度看 是 最安全的選擇。
#
no-appendfsync-on-rewrite no
# 自動 重寫 AOF 文件
# 當 AOF 日誌文件 增長超過指定的百分比時, Redis 能夠自動地 重寫 log 文件,含蓄的叫 BGREWRITEAOF,
#
# 他的運行機制 是: Redis 會記錄最新的AOF 文件的大小(如果 從一啓動就沒有 rewrite 過,那麼就使用一開始的AOF)
# 和 當前的 大小 比較。 如果 當前大小 比 指定的百分比更大, 就會觸發 rewrite。
# 要給AOF文件 指定一個需要重寫的最小 大小,這個很有用,當AOF文件百分比增加達到了,但大小沒有達到,就可以避免rewrite 了
#
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 當AOF 數據被加載到內存時,Redis 的啓動進程 會找到 AOF文件,可能會在進程的最後階段將 AOF文件進行重置。
# 這會發生在 當 Redis 是 宕機, 特別是 ext4 文件系統 掛載時,沒有按照數據順序( 然而 當Redis 自己宕機,或者終止,而操作系統仍然工作正確)
#
# 當這種情況發生時,Redis 既可以推出並返回錯誤,也可以 (如果AOF文件被找到並在最後被重置) 加載更多地加載 數據。下面的選項可以控制此行爲。
#
# 如果 aof-load-truncated 被設置爲 yes, 則 AOF文件被加載並且Redis 服務 會 觸發一個日誌 來通知 用戶這個事情。
# 因此 如果 選項 被 設置爲 ‘no’, 服務器就會以發出錯誤信息終止,並且拒絕去開始啓動。 當 選項被設置爲 no, 用戶需要 在開始服務器前使用 “redis-check-aof”工具去修復AOF文件。
#
# 如果 AOF 文件 在中間部分 被發現 出錯誤了,那麼 Redis 服務 仍然會推出並返回錯誤。 這個選項 僅適用於 當Redis 試着去從AOF文件中 讀取更多的數據,而沒有足夠的
# 數據被發現時。
################################ LUA腳本 (LUA SCRIPTING) ###############################
#
# lua 腳本的 最大執行時間,單位 “毫秒”
#
# 如果達到了最大執行時間, Redis 將記錄日誌,腳本仍然會執行,並且對 給查詢要查詢的 命令 返回一個錯誤。
# 當 一個正在運行的腳本,超過了最大執行時間,這時只有SCRIPT KILL 和 SHUTDOWN NOSAVE 命令可以用。 第一個命令可以用來去停止一個腳本,
# 這個命令不認爲是 “寫命令”, 第二個命令用來去關閉服務器, 爲了防止腳本中的寫命令出現問題,並且用戶不想等待腳本的自然終止的這種情況。
#
# 設置爲 0 或者 負數 值 含義 是 不限制 執行時間,也不會產生警告!
#
################################ Redis 集羣 (REDIS CLUSTER ) ###############################
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# 警告:實驗性的 : Redis 集羣被認爲是 標準的代碼, 爲了能夠去給它 一個“成熟”的標籤,我們需要去等待 非凡的比例的用戶去部署在生成環境中。
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# 正常情況下 Redis 實例 不是Redis 集羣的一部分; 只有當它被當作集羣節點被啓動時,它才能成爲 集羣節點。 爲了將其作爲一個集羣節點來啓動,集羣需要
# 去掉下面選項的註釋
#
# cluster-enabled yes
# 集羣上的每一個節點 都有一個集羣配置文件。 redis 不被打算手動來編輯, 它被Redis 節點創建和更新。每個Redis 集羣節點都需要個一個不同的 集羣配置文件。
# 要確保 運行在同一個系統上的 實例 不要使用相同的集羣配置文件
#
# cluster-config-file nodes-6379.conf
#
# 集羣節點超時時間,是毫秒爲單位的, 一個節點 在這個時間內沒有到達,就被認爲處於 一個失敗的狀態。
#
# cluster-node-timeout 15000
# 一個 slave 如果它的數據 看起來很老,他會避免 開始故障轉移。
#
# 對於 slave 當前沒有 一個簡單方式 去 真實的測量他的 數據 有效期, 所以會 有下面的兩種檢查行爲。
#
# 1) 如果這裏有 多個 slave 可以來進行 故障轉移, 他們之間會交換信息,目的就是 選出 優勢最大的那個 slave (更多的數據來自master 進程)
# slave 將 獲取它自己的排名, 來應用到 故障轉移
#
# 2) 每個slave節點 會 計算他和master 上次交互時的時間。 這可以通過ping 或者 收到的命令, 或者 和master 斷開連接後的時間。
# 如果上次交互是太老, slave 將不會嘗試 去故障轉移。
#
# 第二點 可以被用戶調試到。 具體來說 一個slave 不會執行故障轉移,是由於,和master 的上次交互 的時間 大於:
#
# (node-timeout * slave-validity-factor) + repl-ping-slave-period
#
# 例如: 如果 node-timeout 是 30秒, 並且 slave-validity-factor 是 10, 並且 假定 repl-ping-slave-period 是 10秒 , 如果 slave 沒能夠 和master交互超過
# 310秒, 那麼slave 將不會嘗試着去故障轉移。
#
# slave-validity-factor 有一個大的值 可以允許 slave 有一些太老的數據 也能進行故障轉移, 然而 較小的值 可能會阻止集羣 去快速的選擇一個slave.
#
# 爲了最大的可用性, 將slave-validity-factor 設置爲0 值也是可以的,這樣意味着: slaves 將總是 嘗試 去故障轉移 master, 而不管 它上次和master交互的時間
# ( 然而他們總是去根據他們的排名 來 按比例延遲)。
#
# cluster-slave-validity-factor 10
# 集羣的 slave 能夠遷移到 孤兒master , 孤兒master 是指沒有 slaves 。 這會改進 集羣 對抗失敗的 能力.
# 孤兒master 如果在沒有slave 情況下失敗,是不能夠 故障轉移,
#
# 當 對於 老的 master 仍然 至少有一個(number 個)slave時, slave就可以遷移到 孤兒master。 這個number就是 “migration barrier” 。
# migration barrier 的值 1 意味着 master 至少有一個slave時 ,slave就可以 能遷移。 這個通常反映了 集羣中 每個master 對應的slave 數量。
#
# 默認是 1 ; 你想禁用 這個功能,只需要 設置一個很大值 即可。0 值也是可以設置的,這種設置對 debug很有用,對在生成環境上是很危險的。
#
# cluster-migration-barrier 1
# 如果集羣 偵測到 有至少一個 hash slot 沒有被覆蓋(沒有節點對此slot服務),那麼Redis集羣節點就會停止接受 查詢命令。
# 如果 集羣中的部分 掛掉了(例如 : 一個範圍的 hash slots 不再被覆蓋), 集羣 將變的 最終地, 不可用。
# 一旦所有的slots 被再次覆蓋,它會 自動變的 可用。
#
# 然而 有時 你想 你的集羣 部分是 正常工作,並能繼續接受 查詢 (這些查詢設計的slot 仍然被覆蓋的)。爲了做到這樣,你只需
# 設置 cluster-require-full-coverage 選項 爲 no。
#
# cluster-require-full-coverage yes
# 爲了去設置你的 集羣,首先要確保 查看了 相關文檔。
# 可用的 網址 : available at http://redis.io web site.
################################## 慢查詢日誌 ( SLOW LOG) ###################################
# Redis 的 慢查詢日誌 記錄了 那些超過了指定執行時間的 查詢。這個執行時間 不包括 I/O 操作 像 和客戶端的連接, 發送響應等,
# 它 僅僅是 確實要執行命令需要的時間 (在命令執行期間,線程是阻塞的,並且不能夠在同一時間服務其他的請求)
# 下面的時間,單位是微秒, 所以 1000000 是等於 1秒。 負數值 表示 禁用掉 滿查詢日誌, 0值 會強制記錄每個命令。
slowlog-log-slower-than 10000
# 這裏對 長度沒有限制, 只需要注意的是,它會消耗內存, 你可以 使用 SLOWLOG 重新聲明 內存。
slowlog-max-len 128
################################ 潛在的 監控(LATENCY MONITOR) ##############################
# Redis 的潛在的監控子系統 在Redis 運行時 可以採集不同的操作,爲了去 收集 Redis實例的數據。
# 通過 LATENCY 命令 用戶能夠獲取 相應的信息,並且可以打印爲 圖像 或 獲取報告。
#
# 系統 僅僅記錄 那些執行時間等於或者大於 “latency-monitor-threshold “ 的值的操作。 當它的值被設置爲0, 則,潛在的監控
# 就被關閉了。
#
# 默認地 潛在監控 被 禁用, 是由於 如果你沒有潛在的問題,它大多數是不需要的,並且收集數據會有性能上的損耗,儘管不大,但在
# 大負載的情況下還是能夠測量到的。如果有需要的話, 在運行時 可以使用“ CONFIG SET latency-monitor-threshold <milliseconds>”命令 來很容易地開啓。
latency-monitor-threshold 0
#
#############################事件通知( EVENT NOTIFICATION )##############################
# Redis 可以 給 Pub/Sub 客戶端 通知一些關於 key空間 的一些事件。
# 這個功能 的 文檔 在: http://redis.io/topics/notifications
#
# 對於實例 如果開啓了 事件通知, 當 一個 客戶端 對 一個 存儲在 Database 0 上 的 “foo” Key 執行 DEL 操作, 則 有兩種消息 會通過
# Pub/Sub 發佈出去。
#
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#
# 去 選擇 Redis 定義的一個類集的事件 來通知是可能的。 每個類 都被用 一個 單獨的字符 來定義。
#
# K Keyspace 事件, 使用 __keyspace@<db>__ 來發布
# E Keyevent 事件 , 使用 __keyevent@<db>__ 來發布
# g Generic 命令 , 非指定類型的命令 如: DEL, EXPIRE, RENAME, …
# $ 字符 命令,
# l 列表命令,
# s 集合 命令
# h 哈希 命令
# z 有序集合命令
# x 過期事件 (每次 一個key 過期時,就會產生一個事件)
# e 驅逐事件 (當一個key 被 maxmemory 機制 驅逐掉時 產生)
# A g$lshzxe 的別名,所以 “ AKE” 意味着 所有事件。
#
#
# notify-keyspace-events 接收 一個由 0個或多個 字符組成的字符串 作爲參數。空的字符串 意味着 禁用 通知機制。
#
# 例如 : 從事件名的 視角 來 啓用 list 和 generic 事件。使用:
#
# notify-keyspace-events Elg
#
# 例子2: 爲了 獲取 過期key 訂閱的 名叫 __keyevent@0__:expired 的頻道 產生的數據流。
#
# notify-keyspace-events Ex
#
# 默認地 所有的通知功能是被禁用的,因爲大多數人 不需要使用此功能,並且此功能有些開銷。注意,
#如果你不指定 K 或 E 中至少一個,那麼就不會有事件被投送。
notify-keyspace-events ""
############################### 高級配置 (ADVANCED CONFIG) ###############################
# Hash 當有一些少量的 entry 時 被 使用 一個內存高效的數據結構 編碼, 最大的 entry 數量不要 超過一個 給定的 門檻。
# 這個 門檻 可以使用如下的指令 來配置。
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# List 也會以一種特殊的方式 來進行編碼,爲了能夠節省空間。
# 每個 list 內部 entry 的數量 可以被 用 固定的內存大小或者 固定的元素數量,來指定。
# 對於固定的內存大小 ,使用 -5 至 -1 ,含義如下:
# -5 : 最大大小 :64Kb <— 不建議! 對正常的工作負載來說
# -4 :最大大小: 32Kb <— 不建議
# -3 :最大大小: 16Kb <— 可能不建議
# -2 : 最大大小: 8Kb <— 好
# -1 : 最大大小 <— 好
# 整數數值 意味着 每個 list 存儲的真是的 元素的數量
#
# 最高性能的選項 通常是 -2 或 -1
list-max-ziplist-size -2
# List 有可能也被壓縮。
# compress-depth 是 quicklist ziplist 從 *each* 到 *exclude* 的節點的數量 。列表的頭和尾總是不被壓縮,
# 是 爲了更快的 push/pop 操作。 設置有:
# 0 : 禁用 所有壓縮
# 1 : 在list 中 從 第一個節點後開始壓縮 , 不管是 從頭 或尾部 開始都是如此。
# 所以 :[head]->node->node->...->node->[tail]
# [head], [tail] 將總是不被壓縮, 內部的節點將被壓縮。
# 2 :[head]->[next]->node->node->...->node->[prev]->[tail]
# 2意味着 不壓縮 head 或 head->next 或者 or tail->prev 或者 tail。 但是壓縮他們中間的節點
# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail]
# 等等
list-compress-depth 0
# 在某種情況下 會使用特殊的編碼, 這個情況就是 一個 集合 由 字符串組成,碰巧 是 10 進制整型,範圍在 64位無符號整型範圍內。
# 下面的配置 可以設置 集合的限制,這個限制是爲了能夠使用 特殊的節省內存的編碼。
#
set-max-intset-entries 512
# 類似哈希、列表 ,有序集合 也會使用特殊的編碼 以 節省許多空間。
# 當 長度 和 有序集合裏邊的元素 低於 下面的 限制時,纔會使用此編碼。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64