已經對Redis
的概念和基本命令進行了講解,今天看下它的配置檔案,Redis
的配置檔案在我們的開發和實際應用中起著非常重要的作用
我們可以在安裝目錄下找到redis.conf
配置檔案,通過vim
命令進行檢視,為了防止配置檔案進行更改,大家在使用前一定要備份一下!
本文Redis
的版本為5.0.7
UNITS
1k => 1000 bytes
1kb => 1024 bytes
1m => 1000000 bytes
1mb => 1024*1024 bytes
1g => 1000000000 bytes
1gb => 1024*1024*1024 byte
單位不區分大小寫,只支援bytes
INCLUDES
和structs2
配置檔案類似,可以通過includes
包含。redis.conf
可以作為總閘,包含其他。
include /path/to/local.conf
include /path/to/other.conf
MODULES
loadmodule /path/to/my_module.so
loadmodule /path/to/other_module.so
Redis
可以通過loadmodule
選項在啟動時載入模組,若服務端無法載入模組,服務端會停止。可以通過多個loadmodule
選項載入多個模組。
NETWORK
- bind 127.0.0.1:預設情況下,如果未指定“bind”配置指令,
Redis
將偵聽伺服器上所有可用網路介面的連線。
可以使用“bind”配置指令,後跟一個或多個IP地址,只偵聽一個或多個選定介面。 例如: bind 192.168.1.100 10.0.0.1
當設定多個bind
地址後,Redis
內部會維護多個Socket
,每個Socket
用於一個network interface
。
- protected-mode yes:此選項預設開啟。
當Redis
服務端未使用bind
選項顯式指定要監聽的network interface
,並且未設定密碼,Redis
服務端只會接受來自127.0.0.1
和::1
的客戶端以及Unix
域的Socket
進行連線。
- port 6379:用於設定
Redis
監聽的TCP
埠,預設為6379,設定為0表示不監聽TCP
埠 - timeout 0:空閒多少秒之後關閉連線,“0”表示不關閉
- tcp-keepalive 300:單位為秒,如果為0,則不會進行
keepalive
檢測,建議設定成60 - tcp-backlog 511:設定
tcp
的backlog
,backlog
其實是一個連線佇列。
backlog
佇列總和 = 未完成三次握手佇列 + 已經完成三次握手佇列
在高併發環境下需要一個高backlog
值來避免慢客戶端連線問題。
注意:Linux
核心會將這個值減小到/proc/sys/net/core/somaxconn
的值,所以需要確認增大somaxconn
和tcp_max_syn_backlog
兩個值來達到想要的效果
GENERAL
daemonize
Redis
採用的是單程式多執行緒的模式,daemonize
是用來指定redis
是否要用守護執行緒的方式啟動。預設情況下,Redis
不作為守護程式執行。如果需要,請使用“是”。
#daemonize no
//當前介面將進入redis的命令列介面,
exit強制退出或者關閉連線工具(putty,
xshell等)都會導致redis程式退出。
daemonize yes
//代表開啟守護程式模式。在該模式下,
redis 會在後臺執行,並將程式 pid 號寫入
至 redis.conf 選項 pidfile 設定的檔案中,
此時 redis 將一直執行,除非手動kill該程式。
supervised no
當你通過upstart
或者systemd
執行Redis
時,Redis
可以和你的supervision tree
進行互動,可選的選項為:
- no 無互動(預設)
- upstart 通過向
Redis
傳送SIGSTOP
訊號來通知upstart
- systemd 通過向
$NOTIFY_SOCKET
寫入READY=1
來通知systemd
- auto 通過是否設定了
UPSTART_JOB
或者NOTIFY_SOCKET
環境變數來決定選項為upstart
或者systemd
pidfile
pidfile /var/run/redis_6379.pid //程式pid檔案
loglevel notice
指定伺服器日誌級別:從上到下依次減少
debug
:大量資訊,對開發/測試有用verbose
:許多很少有用的資訊,但不像除錯級別那樣混亂notice
:適度冗長,可能是生產中需要的內容warning
:只記錄非常重要/關鍵的訊息
logfile
logfile ""
日誌的名字,如果為空,redis
給控制檯標準輸出,如果配置為守護程式方式執行,且設定了logfile
為stdout
,則日誌將會傳送給/dev/null
database
databases 16
系統預設的庫16個,預設使用0庫
syslog
syslog-enabled no
:是否把日誌輸出到syslog
中,系統日誌預設是關著syslog-ident redis
:指定syslog
裡的日誌標誌裝置以redis
開頭syslog-facility local0
:指定syslog
裝置,值可以是USER
或LOCAL0-LOCAL7
,預設使用local0
Security (安全)
requirepass 12345!@#
設定redis
連線密碼,如果配置了連線密碼,客戶端在連線redis
時需要通過Auth <password>
命令提供密碼,預設關閉。
如果設定完密碼,ping
就失敗了,提示“NoAuth Authentication required”,加上auth + 密碼
就通了。
要求必須auth + password 在任何命令之前
Redis
一般做的是快取,不是安全,而且系統會認為Linux
是在安全的環境下。
CLIENTS
maxclients 10000
:最大連線數
設定redis
同時可以與多少個客戶端進行連線。預設情況下為10000
個客戶端。
當你無法設定程式檔案控制程式碼限制時,redis
會設定為當前的檔案控制程式碼限制值減去32
,因為redis
會為自身內部處理邏輯留一些控制程式碼出來。
如果達到了此限制,redis
則會拒絕新的連線請求,並且向這些連線請求方發出max number of clients reached以作回應。
MEMORY MANAGEMENT
設定redis
可以使用的記憶體量。一旦到達記憶體使用上限,redis
將會試圖移除內部資料,移除規則可以通過maxmemory-policy
來指定。
如果redis
無法根據移除規則來移除記憶體中的資料,或者設定了不允許移除,那麼redis
則會針對那些需要申請記憶體的指令返回錯誤資訊,比如SET
、LPUSH
等。但是對於無記憶體申請的指令,仍然會正常響應,比如GET
等。
如果你的redis
是主redis
(說明你的redis
有從redis
),那麼在設定記憶體使用上限時,需要在系統中留出一些記憶體空間給同步佇列快取,只有在你設定的是“不移除”的情況下,才不用考慮這個因素。
最大快取
#maxmemory <bytes>
maxmemory 128MB
設定maxmemory
和相對應的回收策略演算法,設定最好為實體記憶體的3/4,或者比例更小,因為redis
複製資料等其他服務時,也是需要快取的。以防快取資料過大致使redis
崩潰,造成系統出錯不可用。
犧牲一部分快取資料,儲存整體系統可用性。redis
新的記憶體機制,會把key
放在記憶體,value
存放在swap
區。
此配置需要和maxmemory-policy配合使用,當redis
中記憶體資料達到maxmemory
時,觸發清除策略。在記憶體不足時,任何write
操作(比如set
,lpush
等)都會觸發清除策略的執行。
實際環境
建議redis
的所有物理機器的硬體配置保持一致(記憶體一致),同時確保master/replica
中maxmemory policy配置一致。
記憶體滿時
如果還接收到set
命令,redis
將先嚐試剔除設定過expire
資訊的key
,而不管該key
的過期時間有沒有到達。
在刪除時,將按照過期時間進行刪除,最早將要被過期的key
將最先被刪除。如果帶有expire
資訊的key
都刪光了,記憶體還不夠用,那麼將返回錯誤。這樣,redis
將不再接收寫請求,只接收get
請求。
maxmemory
的設定比較適合於把redis
當作於類似memcached
的快取來使用。
MEMORY MANAGEMENT
最大快取策略
maxmemory-policy:
- volatile-lru:使用
LRU
(最近最少使用)演算法移除key
,只對設定了過期時間的鍵 - allkeys-lru:使用
LRU
演算法移除key
(所有key
) - volatile-lfu:對過期鍵使用 LFU(最不經常使用)近似演算法
- allkeys-lfu:對所有鍵使用 LFU 近似演算法
- volatile-random:在過期集合中移除隨機的
key
,只對設定了過期時間的鍵 - allkeys-random:移除隨機的
key
- volatile-ttl:移除那些
TTL
值最小的key
,即那些最近要過期的key
- noeviction:不進行移除。針對寫操作,只是返回錯誤資訊(預設)(去公司觀察維度,不應該選擇這個)
LRU
演算法、LFU
演算法或者TTL
演算法都是不是很精確演算法,而是個近似演算法。
使用策略規則:
- 如果資料呈現冪律分佈,也就是一部分資料訪問頻率高,一部分資料訪問頻率低,則使用
allkeys-lru
。 - 如果資料呈現平等分佈,也就是所有的資料訪問頻率都相同,則使用
allkeys-random
。
樣本數量
設定樣本數量,上邊提到的演算法都並非是精確的演算法,而是估算值,所以你可以設定樣本的大小。
maxmemory-samples 5
預設值是 5,也就是說Redis
隨機挑出5個鍵,然後選出一個最符合條件的。對LRU
來說5是比較合適的。10已經很接近於真正的LRU
,但會消耗更多的CPU
。3會更快但沒有那麼精確。
副本忽略最大記憶體
replica-ignore-maxmemory yes
從Redis 5
開始,預設情況下,replica
節點會忽略maxmemory
設定(除非在發生failover
後,此節點被提升為master
節點)。
這意味著只有master
才會執行過期刪除策略,並且master
在刪除鍵之後會對replica
傳送DEL
命令。
這個行為保證了master
和replicas
的一致性,並且這通常也是你需要的,但是若你的replica
節點是可寫的,或者你希望replica
節點有不同的記憶體配置,並且你確保所有到replica
寫操作都冪等的,那麼你可以修改這個預設的行為 (請確保你明白你在做什麼)。
注意 預設情況下replica
節點不會執行過期策略,它有可能使用了超過maxmemory
設定的值的記憶體。因此你需要監控replicas
節點所在的機器並且確保在master
節點到達配置的maxmemory
大小時,replicas
節點不會超過實體記憶體的大小。
後續:主從複製和持久化部分
本作品採用《CC 協議》,轉載必須註明作者和本文連結