緩存學習(五):Redis安裝、配置

目錄

1.安裝

2.配置

2.1 include

2.2 loadmodule

2.3 網絡配置

2.4 通用配置

2.5 RDB配置

2.6 主從配置

2.7 安全配置

2.8 maxclients

2.9 內存管理

2.10 AOF配置

2.11 Lua腳本最大執行時間

2.12 slowlog

2.13 高級配置


1.安裝

安裝本身比較簡單,就是去官網下載源碼包,解壓後執行make和make install即可,不過有可能會遇到一個錯誤:

fatal error: jemalloc/jemalloc.h: No such file or directory
 #include <jemalloc/jemalloc.h>
          ^~~~~~~~~~~~~~~~~~~~~

該問題在README.md有描述,只要在make時使用

make MALLOC=libc

即可

完整命令如下:

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxvf redis-5.0.4.tar.gz
cd redis-5.0.4/
make MALLOC=libc
make install

然後可以執行 redis-server -v來驗證有沒有安裝成功:

root@Yhc-Surface:~/redis-5.0.4# redis-server -v
Redis server v=5.0.4 sha=00000000:0 malloc=libc bits=64 build=172bab0d8aa0a3b7

2.配置

這裏的配置主要是指redis-server的配置。

首先是redis-server的-h選項輸出:

root@Yhc-Surface:~/redis-5.0.4# redis-server -h
Usage: ./redis-server [/path/to/redis.conf] [options]
       ./redis-server - (read config from stdin)
       ./redis-server -v or --version
       ./redis-server -h or --help
       ./redis-server --test-memory <megabytes>

Examples:
       ./redis-server (run the server with default conf)
       ./redis-server /etc/redis/6379.conf
       ./redis-server --port 7777
       ./redis-server --port 7777 --replicaof 127.0.0.1 8888
       ./redis-server /etc/myredis.conf --loglevel verbose

Sentinel mode:
       ./redis-server /etc/sentinel.conf --sentinel

可以看出,redis-server支持通過命令行選項直接指定本機節點和集羣主節點,還支持通過配置文件配置單機和集羣環境,以及哨兵節點。

命令行配置比較簡單,哨兵配置暫時不看,所以這裏主要看redis.conf文件的配置。

此處沒有包括集羣相關的配置,以及被標註爲實驗性功能的碎片整理功能的配置。

2.1 include

redis支持通過include引用其他配置文件的配置,並且可以同時引用多個配置文件:

include ~/first.conf
include ~/second.conf

include引入的配置可以被覆蓋,conf文件中,在前面的配置可以被後面的配置覆蓋,因此,如果需要動態調整配置,最好將include寫在開頭處,反之,如果不希望模板中的配置被覆蓋掉,可以把include寫到結尾處。

2.2 loadmodule

模塊是Redis 4提出的,可以在 Redis Module Hub 找到很多模塊,然後在redis.conf中通過loadmodule加載:

loadmodule ~/first.so
loadmodule ~/second.so

和include一樣,這裏也可以加載多個模塊。配置的模塊會在Redis服務器實例啓動時加載。

除了在配置文件中加載模塊,Redis也支持在運行中通過 MODULE LOAD和MODULE UNLOAD命令動態加載/卸載模塊。

2.3 網絡配置

1)bind

即Redis接收哪些主機發來的連接,如果不配置,則默認接受所有連接,是不安全的,Redis未授權訪問詳解 - FreeBuf專欄·安全之光 是一個藉助Redis漏洞進行免密登錄的案例。默認配置 bind 127.0.0.1 代表只允許本地訪問。

2)port

即Redis監聽的端口,默認6379。

3)protected-mode

默認yes,當沒有配置bind和密碼時,會強制只能本地訪問。

4)tcp-backlog

backlog是已連接但未進行accept處理的SOCKET隊列大小,如果這個隊列滿了,將會發送“Connection Refused”錯誤信息給客戶端,默認511,如果設置的太大,可能會導致請求來沒來得及處理就已經超時。

5)unixsocket

配置Redis監聽的Socket文件,沒有默認值,即不顯式配置的話就不監聽

6)timeout

默認0,即客戶端斷開後立即關閉連接,單位爲秒

7)tcp-keepalive

用來配置發送保持連接的ACK的時間間隔,默認300,即每300秒發送一次ACK以保持連接。

2.4 通用配置

1)daemonize

是否以後臺模式啓動,默認no,如果設置爲yes,則寫入pid到/var/run/redis.pid(可配置)

2)pidfile

指定後臺模式pid文件的位置

3)loglevel

指定日誌級別,有:debug、verbose、notice、warning四種級別(內容越來越少),默認notice。

4)logfile

指定日誌輸出位置,默認爲空,即輸出到標準輸出(後臺模式則丟棄日誌)

5)使用system logger

一共三個配置項:

  • syslog-enabled:默認no,代表是否啓用系統的日誌記錄
  • syslog-ident:設置在系統日誌中的名稱
  • syslog-facility:設置使用的系統日誌設備,可以是USER,或者LOCAL0~LOCAL7

6)databases

redis也是有 數據庫 的概念的,必須選中數據庫才能操作數據,默認16個數據庫,並默認選中DB0,即第一個數據庫

7)always-show-logo

是否顯示LOGO,默認yes

2.5 RDB配置

1)save

格式爲:save <seconds> <changes>,代表在seconds秒內,如果有至少changes個修改,則持久化到磁盤上,例如下列默認配置:

save 900 1 //如果過了15分鐘,有過至少1次改動,則持久化
save 300 10 //如果過了5分鐘,有過至少10次改動,則持久化
save 60 10000 //如果過了1分鐘,有過至少10000次改動,則持久化

如果沒有配置save,或者配置了 save "",則不持久化

2)stop-writes-on-bgsave-error

默認yes,即持久化失敗後停止寫入,以免運維感知不到持久化異常。

3)rdbcompression

是否在持久化時對string對象使用LZF進行壓縮,默認yes,但是會消耗CPU

4)rdbchecksum

是否向RDB文件寫入校驗碼,默認yes,no的話就寫入0,即跳過校驗

5)dbfilename

即RDB文件的名稱,默認dump.rdb

6)dir

即RDB存放的位置,默認在Redis工作目錄下

2.6 主從配置

1)slaveof

即將本節點配置爲指定節點的從節點,格式爲:slaveof <masterip> <masterport>

2)masterauth

主節點可能配置了密碼,可以在此配置密碼,以完成認證,格式爲:masterauth <master-password>

3)slave-serve-stale-data

即(作爲從節點的)本節點,當與主節點斷開連接後,是否繼續爲客戶端提供服務,默認yes,但是可能會造成不一致

4)slave-read-only

從節點是否只讀,默認yes,如果是一些存活期短的數據,可以寫在從節點上,一方面能夠減輕寫壓力,另一方面與主節點同步後這些數據就消失了,也不會影響整體一致性

5)repl-diskless-sync

這一條是配置主從節點同步方式,默認no,即同步時需要先創建一個RDB文件,把主節點的數據寫進來再恢復,這種方式的好處在於,可以將集羣配置爲樹狀結構,讓已完成同步的從節點爲未完成同步的從節點提供數據,從而大幅加快同步速度,壞處在於,如果硬盤很慢,那麼讀寫RDB文件將會大幅降低節點同步效率;如果配置爲yes,則不寫入RDB文件,而是直接同步進內存

6)repl-diskless-sync-delay

設置主節點在無盤傳輸前等待多久,因爲同步過程是阻塞的,如果不等待就直接開始同步,那麼有些新加入的節點就不能及時同步數據、提供服務,必須等到下次同步,如果設置了延時,就可以讓更多的從節點加入同步過程,默認設置5秒

7)repl-ping-slave-period

從節點每隔一段時間就向主節點發送PING,該項就是設置這個發送間隔,默認10秒

8)repl-timeout

設置分區超時時間,主要應用於:

  • 同步時數據包傳輸時間
  • 主從節點互PING

如果以上兩個操作所用時間超過了超時時間,則認爲分區連接中斷,默認60秒

9)repl-disable-tcp-nodelay

默認no,代表發送較小的數據包,這種方式延遲小,但是帶寬佔用大,yes則是發送較大的數據包,帶寬佔用小,但是延遲比較大

10)repl-backlog-size、repl-backlog-ttl

分區的backlog可以理解爲一個緩存,用來保存從節點的最近的數據包,如果從節點又很快重新連接上來,就可以根據這些數據包恢復工作,最多進行一次增量同步,這樣就避免了全量同步帶來的開銷,repl-backlog-size代表這個緩存大小,默認設置爲1MB,repl-backlog-ttl代表這個緩存的存活時間,默認3600秒,設置爲0代表永不淘汰

11)slave-priority

用來設置從節點優先級,值越低優先級越高,在主節點宕機後,哨兵節點會優先選擇高優先級的從節點晉升爲主節點,默認值爲100

12)分區規模配置

min-slaves-to-write和min-slaves-max-lag限定了一個分區的規模,設前者的值爲N,後者的值爲M,則一個可以正常執行寫入操作的分區,必須有N個延遲小於等於M的從節點。默認配置:N=3,M=10

13)slave-announce-ip、slave-announce-port

一個從節點可以用一個ip-port對標記,但是如果使用了NAT或端口轉發時,可能會導致同一個從節點被重複標記,可以使用該配置進行唯一標記

2.7 安全配置

1)requirepass

爲服務器設置一個密碼

2)rename-command

修改命令名稱,主要是爲了防止一些關鍵命令被濫用,例如config,如果某個命令被設置爲空字符串,則表示廢棄

2.8 maxclients

代表最多允許同時連接多少個客戶端,默認10000

2.9 內存管理

1)maxmemory

代表Redis最多可以存儲多少字節的數據,當存儲的數據到達上限之後,就會觸發緩存清除

2)maxmemory-policy

代表Redis緩存清除策略,有如下選項:

  • volatile-lru -> 對過期數據採用LRU策略清除,直到空間足夠或者無數據可以清除(此時回退到默認策略)
  • allkeys-lru -> 對所有數據採用LRU策略清除,直到空間足夠
  • volatile-lfu -> 對過期數據採用LFU策略清除,直到空間足夠或者無數據可以清除(此時回退到默認策略)
  • allkeys-lfu -> 對所有數據採用LFU策略清除,直到空間足夠
  • volatile-random -> 對過期數據隨機清除,直到空間足夠
  • allkeys-random -> 對所有數據隨機清除
  • volatile-ttl -> 根據ttl屬性,刪除即將過期的數據
  • noeviction -> 默認策略,僅響應讀請求,對寫請求返回錯誤

3)maxmemory-samples

上述的算法不是精確算法,默認情況下,Redis抽出5個數據,對其中最符合策略的一個進行清除,如果調大取樣率,則效果更好但也更消耗CPU,反之亦然

4)懶刪除

默認的del命令是阻塞命令,雖然Redis提供了unlink等非阻塞命令,但是其他操作造成的數據清除還是阻塞的,比如上述的緩存清除,此時就需要配置懶刪除,以非阻塞方式釋放內存。這些選項默認都是no。

  • lazyfree-lazy-eviction :代表是否在緩存數據清除時使用非阻塞方式
  • lazyfree-lazy-expire :代表數據過期清除時是否使用非阻塞方式
  • lazyfree-lazy-server-del : 代表由於其他命令導致的數據清除時,是否使用非阻塞方式
  • slave-lazy-flush :代表由於全量同步導致數據清除時是否使用非阻塞方式

2.10 AOF配置

AOF是另一種持久化方案,RDB在持久化時,由於用時較長,可能會導致最近若干時間內的改動丟失,AOF採用增量方式持久化,最多丟失1秒的更改。

AOF和RDB可以共存,如果啓用AOF,則會在Redis服務器啓動時加載AOF文件進行數據恢復。

1)appendonly

表示是否啓用AOF,默認no

2)appendfilename

設置AOF文件的名稱

3)appendfsync

代表持久化頻率,有三個選項:

  • always:每次修改都觸發fsync,將數據刷寫到硬盤上
  • no:不觸發fsync,由操作系統管理數據的刷寫
  • everysec(默認):每秒觸發一次fsync

4)no-appendfsync-on-rewrite

如果appendfsync爲always或everysec時,Redis可能阻塞fsync調用太久,該選項可以使Redis在有其他進程調用fsync時不會去觸發fsync,即退化爲appendfsync no,可以在一定程度上緩解問題,不過也會導致可能有數據來不及持久化

5)自動重寫時機

Redis會記住上一次重寫後AOF文件的大小,然後根據當前大小與auto-aof-rewrite-percentage(默認100)和auto-aof-rewrite-min-size(默認64MB)的值進行比較,如果達到配置值,則自動觸發重寫

6)aof-load-truncated

Redis在啓動時會自動加載AOF文件,如果因爲操作系統崩潰導致AOF文件不完整,默認情況下(即該配置爲yes),Redis會嘗試儘可能多地讀取數據並恢復,如果此配置項爲no,則Redis會拒絕啓動並報錯

7)aof-use-rdb-preamble

相當於把AOF文件變成 RDB+AOF元數據 ,這樣做讀寫都會更快,不過可能導致格式問題,所以默認爲no

2.11 Lua腳本最大執行時間

lua-time-limit指定了腳本最多允許運行多少毫秒,如果一個腳本運行時間超過該時長,就會對接下來的請求響應錯誤,此時可以使用script kill結束腳本,或shutdown nosave關閉服務器。

2.12 slowlog

slowlog用來統計慢查詢,需要注意的是,這裏只統計了命令本身調用所用的時間,而不包括命令調用導致的I/O時間(如連接客戶端等),所以slowlog沒有記錄不代表沒有超時操作。

1)slowlog-log-slower-than

表示slowlog記錄調用時間在多少毫秒以上的慢查詢,默認10000

2)slowlog-max-len

代表slowlog記錄最近多少個慢查詢記錄,默認128

2.13 高級配置

1)數據結構配置

Redis支持的數據結構,如string、hash、set等,都會根據存儲的數據規模大小,對底層的數據結構進行轉換,例如hash,在數據量較小時,會以鏈表的形式存儲,當數據量足夠大時,就會轉換爲hashtable,此處的配置就是各數據結構底層結構轉換的閾值:

  • hash-max-ziplist-entries(默認512)、hash-max-ziplist-value(默認64):即當哈希表存儲了超過512條數據,或者單條數據超過64字節時,就會轉換爲hashtable
  • list-max-ziplist-size(默認-2):該值設置了list的容量,取值範圍是:負值(-5~-1),分別代表64、32、16、8、4KB,或者正數,例如3,則代表3KB
  • list-compress-depth(默認0):代表從頭、尾起壓縮多少個節點,0代表不壓縮,對於一個鏈表 head-node1-node2-node3-tail,如果壓縮深度設置爲2,則僅有node2不壓縮。
  • zset-max-ziplist-entries(默認128)、zset-max-ziplist-value(默認64):作用和hash的一樣,轉換爲跳躍表
  • hll-sparse-max-bytes(默認3000):HyperLogLog用來統計不同元素的數量,當元素數少於這裏的配置值時,以稀疏形式表示,超過配置值後變爲密集表示
  • activerehashing(默認yes):Redis的hashtable默認使用懶重哈希策略,可能導致重哈希操作積壓太多,如果該項設爲yes,就會立即進行重哈希,從而節約內存

2)客戶端緩存配置

  • client-output-buffer-limit:配置客戶端輸出緩存,默認配置如下:
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

後面四個項的意思是:

1)類型:有normal、slave、pubsub三種,分別代表普通客戶端、連接到從節點的客戶端、訂閱了pubsub通道的客戶端

2) hard-limit:當緩存大小到達hard-limit時,直接斷開

3)soft-limit、soft-seconds:當緩存大小到達soft-limit時,等待soft-seconds秒後斷開

  • client-query-buffer-limit:配置客戶端查詢緩存,默認1GB

3)其他服務器配置

  • proto-max-bulk-len:默認512MB,即批量請求的大小最多512MB
  • hz:默認10,用來配置Redis檢查需要執行的後臺任務的頻率,該值越大,延遲越小,但是CPU消耗更大
  • aof-rewrite-incremental-fsync:默認yes,即每積累32MB數據就調用fsync刷寫進磁盤

4)LFU配置

Redis提供了兩個LFU的配置項:lfu-log-factor(默認10)、lfu-decay-time(默認1)。

LFU策略下,Redis的計數器有8位,默認值爲5,最大值爲255(2的8次方減1),如果每次訪問都增大,很容易溢出,所以採用了概率增大計數器的方式。當一個鍵被訪問時,首先從0到1中隨機選一個值R,然後用舊值參與計算計數器增大概率P,公式爲:1/(oldvalue*lfu_log_factor+1),當R<P時,計數器增大。

lfu-decay-time代表計數器值的半衰期,默認1代表每過1分鐘,計數器值減半(小於等於10時則減1),如果設置爲0,則每次掃描計數器時進行減半。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章