目錄
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,則每次掃描計數器時進行減半。