Redis配置文件詳解
我們使用Redis,通常我們會去調整其默認的配置,讓其在我們自己的應用場景中更高效的運行,下邊有一篇不錯的文檔,算是對配置文件的翻譯,轉載過來分享下
#daemonize no 默認情況下, redis 不是在后臺運行的,如果需要在后臺運行,把該項的值更改為 yes daemonize yes當 redis 在后臺運行的時候, Redis 默認會把 pid 文件放在 /var/run/redis.pid ,你可以配置到其他地址。
當運行多個 redis 服務時,需要指定不同的 pid 文件和端口
pidfile /var/run/redis_6379.pid
指定 redis 運行的端口,默認是 6379
port 6379
在高并發的環境中,為避免慢客戶端的連接問題,需要設置一個高速后臺日志
tcp-backlog 511
指定 redis 只接收來自于該 IP 地址的請求,如果不進行設置,那么將處理所有請求
bind 192.168.1.100 10.0.0.1
bind 127.0.0.1
設置客戶端連接時的超時時間,單位為秒。當客戶端在這段時間內沒有發出任何指令,那么關閉該連接
0 是關閉此設置
timeout 0
TCP keepalive
在 Linux 上,指定值(秒)用于發送 ACKs 的時間。注意關閉連接需要雙倍的時間。默認為 0 。
tcp-keepalive 0
指定日志記錄級別,生產環境推薦 notice
Redis 總共支持四個級別: debug 、 verbose 、 notice 、 warning ,默認為 verbose
debug 記錄很多信息,用于開發和測試
varbose 有用的信息,不像 debug 會記錄那么多
notice 普通的 verbose ,常用于生產環境
warning 只有非常重要或者嚴重的信息會記錄到日志
loglevel notice
配置 log 文件地址
默認值為 stdout ,標準輸出,若后臺模式會輸出到 /dev/null 。
logfile /var/log/redis/redis.log
可用數據庫數
默認值為 16 ,默認數據庫為 0 ,數據庫范圍在 0- ( database-1 )之間
databases 16
########################## 快照
保存數據到磁盤,格式如下 :
save <seconds> <changes>
指出在多長時間內,有多少次更新操作,就將數據同步到數據文件 rdb 。
相當于條件觸發抓取快照,這個可以多個條件配合
比如默認配置文件中的設置,就設置了三個條件
save 900 1 900 秒內至少有 1 個 key 被改變
save 300 10 300 秒內至少有 300 個 key 被改變
save 60 10000 60 秒內至少有 10000 個 key 被改變
save 900 1
save 300 10
save 60 10000
后臺存儲錯誤停止寫。
stop-writes-on-bgsave-error yes
存儲至本地數據庫時(持久化到 rdb 文件)是否壓縮數據,默認為 yes
rdbcompression yes
RDB 文件的是否直接偶像 chcksum
rdbchecksum yes
本地持久化數據庫文件名,默認值為 dump.rdb
dbfilename dump.rdb
工作目錄
數據庫鏡像備份的文件放置的路徑。
這里的路徑跟文件名要分開配置是因為 redis 在進行備份時,先會將當前數據庫的狀態寫入到一個臨時文件中,等備份完成,
再把該該臨時文件替換為上面所指定的文件,而這里的臨時文件和上面所配置的備份文件都會放在這個指定的路徑當中。
AOF 文件也會存放在這個目錄下面
注意這里必須制定一個目錄而不是文件
dir /var/lib/redis-server/
########################### 復制
主從復制 . 設置該數據庫為其他數據庫的從數據庫 .
設置當本機為 slav 服務時,設置 master 服務的 IP 地址及端口,在 Redis 啟動時,它會自動從 master 進行數據同步
slaveof <masterip><masterport>
當 master 服務設置了密碼保護時 ( 用 requirepass 制定的密碼 )
slave 服務連接 master 的密碼
masterauth <master-password>
當從庫同主機失去連接或者復制正在進行,從機庫有兩種運行方式:
1) 如果 slave-serve-stale-data 設置為 yes( 默認設置 ) ,從庫會繼續響應客戶端的請求
2) 如果 slave-serve-stale-data 是指為 no ,出去 INFO 和 SLAVOF 命令之外的任何請求都會返回一個
錯誤 "SYNC with master in progress"
slave-serve-stale-data yes
配置 slave 實例是否接受寫。寫 slave 對存儲短暫數據(在同 master 數據同步后可以很容易地被刪除)是有用的,但未配置的情況下,客戶端寫可能會發送問題。
從 Redis2.6 后,默認 slave 為 read-only
slaveread-only yes
從庫會按照一個時間間隔向主庫發送 PINGs. 可以通過 repl-ping-slave-period 設置這個時間間隔,默認是 10 秒
repl-ping-slave-period 10
repl-timeout 設置主庫批量數據傳輸時間或者 ping 回復時間間隔,默認值是 60 秒
一定要確保 repl-timeout 大于 repl-ping-slave-period
repl-timeout 60
在 slave socket 的 SYNC 后禁用 TCP_NODELAY
如果選擇“ yes ” ,Redis 將使用一個較小的數字 TCP 數據包和更少的帶寬將數據發送到 slave , 但是這可能導致數據發送到 slave 端會有延遲 , 如果是 Linux kernel 的默認配置,會達到 40 毫秒 .
如果選擇 "no" ,則發送數據到 slave 端的延遲會降低,但將使用更多的帶寬用于復制 .
repl-disable-tcp-nodelay no
設置復制的后臺日志大小。
復制的后臺日志越大, slave 斷開連接及后來可能執行部分復制花的時間就越長。
后臺日志在至少有一個 slave 連接時,僅僅分配一次。
repl-backlog-size 1mb
在 master 不再連接 slave 后,后臺日志將被釋放。下面的配置定義從最后一個 slave 斷開連接后需要釋放的時間(秒)。
0 意味著從不釋放后臺日志
repl-backlog-ttl 3600
如果 master 不能再正常工作,那么會在多個 slave 中,選擇優先值最小的一個 slave 提升為 master ,優先值為 0 表示不能提升為 master 。
slave-priority 100
如果少于 N 個 slave 連接,且延遲時間 <=M 秒,則 master 可配置停止接受寫操作。
例如需要至少 3 個 slave 連接,且延遲 <=10 秒的配置:
min-slaves-to-write 3
min-slaves-max-lag 10
設置 0 為禁用
默認 min-slaves-to-write 為 0 (禁用), min-slaves-max-lag 為 10
############################ 安全
設置客戶端連接后進行任何其他指定前需要使用的密碼。
警告:因為 redis 速度相當快,所以在一臺比較好的服務器下,一個外部的用戶可以在一秒鐘進行 150K 次的密碼嘗試,這意味著你需要指定非常非常強大的密碼來防止暴力破解
requirepass foobared
命令重命名 .
在一個共享環境下可以重命名相對危險的命令。比如把 CONFIG 重名為一個不容易猜測的字符。
舉例 :
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
如果想刪除一個命令,直接把它重命名為一個空字符 "" 即可,如下:
rename-command CONFIG ""
############################# 約束
設置同一時間最大客戶端連接數,默認無限制,
Redis 可以同時打開的客戶端連接數為 Redis 進程可以打開的最大文件描述符數,
如果設置 maxclients 0 ,表示不作限制。
當客戶端連接數到達限制時, Redis 會關閉新的連接并向客戶端返回 max number of clients reached 錯誤信息
maxclients 10000
指定 Redis 最大內存限制, Redis 在啟動時會把數據加載到內存中,達到最大內存后, Redis 會按照清除策略嘗試清除已到期的 Key
如果 Redis 依照策略清除后無法提供足夠空間,或者策略設置為 ”noeviction” ,則使用更多空間的命令將會報錯,例如 SET, LPUSH 等。但仍然可以進行讀取操作
注意: Redis 新的 vm 機制,會把 Key 存放內存, Value 會存放在 swap 區
該選項對 LRU 策略很有用。
maxmemory 的設置比較適合于把 redis 當作于類似 memcached 的緩存來使用,而不適合當做一個真實的 DB 。
當把 Redis 當做一個真實的數據庫使用的時候,內存使用將是一個很大的開銷
maxmemory <bytes>
當內存達到最大值的時候 Redis 會選擇刪除哪些數據?有五種方式可供選擇
volatile-lru -> 利用 LRU 算法移除設置過過期時間的 key (LRU: 最近使用 Least RecentlyUsed )
allkeys-lru -> 利用 LRU 算法移除任何 key
volatile-random -> 移除設置過過期時間的隨機 key
allkeys->random -> remove a randomkey, any key
volatile-ttl -> 移除即將過期的 key(minor TTL)
noeviction -> 不移除任何可以,只是返回一個寫錯誤
注意:對于上面的策略,如果沒有合適的 key 可以移除,當寫的時候 Redis 會返回一個錯誤
默認是 : volatile-lru
maxmemory-policy volatile-lru
LRU 和 minimal TTL 算法都不是精準的算法,但是相對精確的算法 ( 為了節省內存 ) ,隨意你可以選擇樣本大小進行檢測。
Redis 默認的灰選擇 3 個樣本進行檢測,你可以通過 maxmemory-samples 進行設置
maxmemory-samples 3
######################## AOF
默認情況下, redis 會在后臺異步的把數據庫鏡像備份到磁盤,但是該備份是非常耗時的,而且備份也不能很頻繁,如果發生諸如拉閘限電、拔插頭等狀況,那么將造成比較大范圍的數據丟失。
所以 redis 提供了另外一種更加高效的數據庫備份及災難恢復方式。
開啟 append only 模式之后, redis 會把所接收到的每一次寫操作請求都追加到 appendonly.aof 文件中,當 redis 重新啟動時,會從該文件恢復出之前的狀態。
但是這樣會造成 appendonly.aof 文件過大,所以 redis 還支持了 BGREWRITEAOF 指令,對 appendonly.aof 進行重新整理。
你可以同時開啟 asynchronous dumps 和 AOF
appendonly no
AOF 文件名稱 ( 默認 : "appendonly.aof")
appendfilename appendonly.aof
Redis 支持三種同步 AOF 文件的策略 :
no: 不進行同步,系統去操作 . Faster.
always: always 表示每次有寫操作都進行同步 . Slow, Safest.
everysec: 表示對寫操作進行累積,每秒同步一次 . Compromise.
默認是 "everysec" ,按照速度和安全折中這是最好的。
如果想讓 Redis 能更高效的運行,你也可以設置為 "no" ,讓操作系統決定什么時候去執行
或者相反想讓數據更安全你也可以設置為 "always"
如果不確定就用 "everysec".
appendfsync always
appendfsync everysec
appendfsync no
AOF 策略設置為 always 或者 everysec 時,后臺處理進程 ( 后臺保存或者 AOF 日志重寫 ) 會執行大量的 I/O 操作
在某些 Linux 配置中會阻止過長的 fsync() 請求。注意現在沒有任何修復,即使 fsync 在另外一個線程進行處理
為了減緩這個問題,可以設置下面這個參數 no-appendfsync-on-rewrite
no-appendfsync-on-rewrite no
AOF 自動重寫
當 AOF 文件增長到一定大小的時候 Redis 能夠調用 BGREWRITEAOF 對日志文件進行重寫
它是這樣工作的: Redis 會記住上次進行些日志后文件的大小 ( 如果從開機以來還沒進行過重寫,那日子大小在開機的時候確定 )
基礎大小會同現在的大小進行比較。如果現在的大小比基礎大小大制定的百分比,重寫功能將啟動
同時需要指定一個最小大小用于 AOF 重寫,這個用于阻止即使文件很小但是增長幅度很大也去重寫 AOF 文件的情況
設置 percentage 為 0 就關閉這個特性
auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
########################## LUASCRIPTING
一個 Lua 腳本最長的執行時間為 5000 毫秒( 5 秒),如果為 0 或負數表示無限執行時間。
lua-time-limit 5000
##########################LOW LOG
Redis Slow Log 記錄超過特定執行時間的命令。執行時間不包括 I/O 計算比如連接客戶端,返回結果等,只是命令執行時間
可以通過兩個參數設置 slow log :一個是告訴 Redis 執行超過多少時間被記錄的參數 slowlog-log-slower-than( 微妙 ) ,
另一個是 slow log 的長度。當一個新命令被記錄的時候最早的命令將被從隊列中移除
下面的時間以微妙為單位,因此 1000000 代表一秒。
注意指定一個負數將關閉慢日志,而設置為 0 將強制每個命令都會記錄
slowlog-log-slower-than 10000
對日志長度沒有限制,只是要注意它會消耗內存
可以通過 SLOWLOG RESET 回收被慢日志消耗的內存
推薦使用默認值 128 ,當慢日志超過 128 時,最先進入隊列的記錄會被踢出
slowlog-max-len 128
########################## 事件通知
當事件發生時, Redis 可以通知 Pub/Sub 客戶端。
可以在下表中選擇 Redis 要通知的事件類型。事件類型由單個字符來標識:
K Keyspace 事件,以 keyspace@<db> 的前綴方式發布
E Keyevent 事件,以 keysevent@<db> 的前綴方式發布
g 通用事件(不指定類型),像 DEL, EXPIRE, RENAME, …
$ String 命令
s Set 命令
h Hash 命令
z 有序集合命令
x 過期事件(每次 key 過期時生成)
e 清除事件(當 key 在內存被清除時生成)
A g$lshzxe 的別稱,因此 ”AKE” 意味著所有的事件
notify-keyspace-events 帶一個由 0 到多個字符組成的字符串參數。空字符串意思是通知被禁用。
例子:啟用 list 和通用事件:
notify-keyspace-events Elg
默認所用的通知被禁用,因為用戶通常不需要改特性,并且該特性會有性能損耗。
注意如果你不指定至少 K 或 E 之一,不會發送任何事件。
notify-keyspace-events “”
######################## 高級配置
當 hash 中包含超過指定元素個數并且最大的元素沒有超過臨界時,
hash 將以一種特殊的編碼方式(大大減少內存使用)來存儲,這里可以設置這兩個臨界值
Redis Hash 對應 Value 內部實際就是一個 HashMap ,實際這里會有 2 種不同實現,
這個 Hash 的成員比較少時 Redis 為了節省內存會采用類似一維數組的方式來緊湊存儲,而不會采用真正的 HashMap 結構,對應的 valueredisObject 的 encoding 為 zipmap,
當成員數量增大時會自動轉成真正的 HashMap, 此時 encoding 為 ht 。
hash-max-zipmap-entries 512 hash-max-zipmap-value 64
和 Hash 一樣,多個小的 list 以特定的方式編碼來節省空間。
list 數據類型節點值大小小于多少字節會采用緊湊存儲格式。
list-max-ziplist-entries 512 list-max-ziplist-value 64
set 數據類型內部數據如果全部是數值型,且包含多少節點以下會采用緊湊格式存儲。
set-max-intset-entries 512
和 hashe 和 list 一樣 , 排序的 set 在指定的長度內以指定編碼方式存儲以節省空間
zsort 數據類型節點值大小小于多少字節會采用緊湊存儲格式。
zset-max-ziplist-entries 128 zset-max-ziplist-value 64
Redis 將在每 100 毫秒時使用 1 毫秒的 CPU 時間來對 redis 的 hash 表進行重新 hash ,可以降低內存的使用
當你的使用場景中,有非常嚴格的實時性需要,不能夠接受 Redis 時不時的對請求有 2 毫秒的延遲的話,把這項配置為 no 。
如果沒有這么嚴格的實時性要求,可以設置為 yes ,以便能夠盡可能快的釋放內存
activerehashing yes
客戶端的輸出緩沖區的限制,因為某種原因客戶端從服務器讀取數據的速度不夠快,
可用于強制斷開連接(一個常見的原因是一個發布 / 訂閱客戶端消費消息的速度無法趕上生產它們的速度)。
可以三種不同客戶端的方式進行設置:
normal -> 正常客戶端
slave -> slave 和 MONITOR 客戶端
pubsub -> 至少訂閱了一個 pubsub channel 或 pattern 的客戶端
每個 client-output-buffer-limit 語法 :
client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
一旦達到硬限制客戶端會立即斷開,或者達到軟限制并保持達成的指定秒數(連續)。
例如,如果硬限制為 32 兆字節和軟限制為 16 兆字節 /10 秒,客戶端將會立即斷開
如果輸出緩沖區的大小達到 32 兆字節,客戶端達到 16 兆字節和連續超過了限制 10 秒,也將斷開連接。
默認 normal 客戶端不做限制,因為他們在一個請求后未要求時(以推的方式)不接收數據,
只有異步客戶端可能會出現請求數據的速度比它可以讀取的速度快的場景。
把硬限制和軟限制都設置為 0 來禁用該特性
client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb60 client-output-buffer-limit pubsub 32mb 8mb60
Redis 調用內部函數來執行許多后臺任務,如關閉客戶端超時的連接,清除過期的 Key ,等等。
不是所有的任務都以相同的頻率執行,但 Redis 依照指定的“ Hz ”值來執行檢查任務。
默認情況下,“ Hz ”的被設定為 10 。
提高該值將在 Redis 空閑時使用更多的 CPU 時,但同時當有多個 key 同時到期會使 Redis 的反應更靈敏,以及超時可以更精確地處理。
范圍是 1 到 500 之間,但是值超過 100 通常不是一個好主意。
大多數用戶應該使用 10 這個預設值,只有在非常低的延遲的情況下有必要提高最大到 100 。
hz 10
當一個子節點重寫 AOF 文件時,如果啟用下面的選項,則文件每生成 32M 數據進行同步。
aof-rewrite-incremental-fsync yes</pre>