天天看點

好飯不怕晚,扒一下Redis配置檔案的底Ku

忙碌是一種幸福,讓我們沒時間體會痛苦;奔波是一種快樂,讓我們真實地感受生活;疲憊是一種享受,讓我們無暇空虛。這幾句話就能簡單概括我最近的工作和生活。

好多小夥伴都來私信“催更”,今天它來了!為了表達阿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

    監聽的

    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

的緩存來使用。

最大緩存政策

「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

算法都是不是很精确算法,而是個近似算法。

「使用政策規則:」

  1. 如果資料呈現幂律分布,也就是一部分資料通路頻率高,一部分資料通路頻率低,則使用

    allkeys-lru

  2. 如果資料呈現平等分布,也就是所有的資料通路頻率都相同,則使用

    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大資料及進階程式設計中的重點、難點。書中案例由真實項目演化而來,既展現了所述知識點的精華,又屏蔽了無關技術的幹擾。
  • 案例完整。案例都是以“理論講解 環境搭建 完整代碼及分析 運作截圖”這種完善的結構進行講解,考慮到了讀者可能會遇到的各種問題。