忙碌是一種幸福,讓我們沒時間體會痛苦;奔波是一種快樂,讓我們真實地感受生活;疲憊是一種享受,讓我們無暇空虛。這幾句話就能簡單概括我最近的工作和生活。
好多小夥伴都來私信“催更”,今天它來了!為了表達阿Q的歉意,特贈送「億級流量Java高并發與網絡程式設計實戰」一本,規則見文末。
在往期的文章中我們已經對
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 bytes
複制
❝機關不區分大小寫,隻支援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
端口,預設為6379,設定為0表示不監聽TCP
端口TCP
- 「timeout 0」:空閑多少秒之後關閉連接配接,“0”表示不關閉
- 「tcp-keepalive 300」:機關為秒,如果為0,則不會進行
檢測,建議設定成60keepalive
- 「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
的緩存來使用。
❞
最大緩存政策
「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
節點不會超過實體記憶體的大小。
今天我們就先說到這了,至于配置檔案中關于主從複制和持久化部分我們将在後續的内容進行講解。
贈書活動
《億級流量Java高并發與網絡程式設計實戰》系統全面的介紹了開發人員必學的知識,如
JVM
、網絡程式設計、NIO等知識,讓開發人員系統地掌握JAVA高并發與網絡程式設計知識。
「推薦理由」
- 全面。本書從并發的底層核心技術、網際網路應用架構、資料處理等三部分對高并發系列技術做了系統講解。
- 實用。本書以實戰化訓練為宗旨,用詳盡且經典的案例闡述了Java大資料及進階程式設計中的重點、難點。書中案例由真實項目演化而來,既展現了所述知識點的精華,又屏蔽了無關技術的幹擾。
- 案例完整。案例都是以“理論講解 環境搭建 完整代碼及分析 運作截圖”這種完善的結構進行講解,考慮到了讀者可能會遇到的各種問題。