[TOC]
REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 儲存系統。
Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value 資料庫,並提供多種語言的 API。它通常被稱為資料結構伺服器,因為值(value)可以是字串(String), 雜湊(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等型別。從 2010 年 3 月 15 日起,Redis 的開發工作由 VMware 主持。從 2013 年 5 月開始,Redis 的開發由 Pivotal 贊助。
Redis 預設埠
Redis 預設埠為 6379,sentinel.conf 配置器埠為 26379
一、系統環境
二、安裝依賴
# yum install gcc gcc-c++ -y
複製程式碼
三、安裝 Redis
解壓
# tar xvf redis-4.0.10.tar.gz
進入 redis 目錄
# cd redis-4.0.10
編譯
# make PREFIX=/usr/local/redis MALLOC=libc(可以不加,預設是 jemalloc) install
安裝
# make install
注意:Redis 並沒有自己實現記憶體池,沒有在標準的系統記憶體分配器上再加上自己的東西。
redis-2.4 以上自帶 jemalloc,你不需要加任何引數,通過 zmalloc.c 原始碼中我們可以看到,Redis 在編譯時,會先判斷是否使用 tcmalloc,如果是,會用 tcmalloc 對應的函式替換掉標準的 libc 中的函式實現。其次會判斷jemalloc 是否使得,最後如果都沒有使用才會用標準的 libc 中的記憶體管理函式。所以用 tcmalloc 優化請謹慎使用,這兩著分配器碎片率相差不大,建議用自帶 jemalloc。
複製程式碼
redis 安裝後,在 /usr/local/redis/bin
下有幾個以 redis 開頭的可執行檔案,稱為 redis shell,這些可執行檔案可以做很多事情。
檔名稱 | 作用 |
---|---|
redis-server | 啟動 redis |
redis-cli | redis 命令列工具 |
redis-benchmark | 基準測試工具 |
redis-check-aof | AOF 持久化檔案檢測工具和修復工具 |
redis-check-rdb | RDB 持久化檔案檢測工具和修復工具 |
redis-sentinel | 啟動 redis-sentinel |
四、配置 Redis
1、redis 啟動方法
-
第一種方法:
# redis-server # 前臺啟動 # redis-server & # 後臺啟動 複製程式碼
-
第二種方法:
修改 redis.conf 配置檔案,從原始碼目錄複製過來修改 # cp /usr/local/src/redis-4.0.10/redis.conf /usr/local/redis/ daemonize yes # 以後臺啟動 redis requirepass redis123 # 設定 redis 登陸密碼 # bind 127.0.0.1 # 註釋此行 protected-mode no # 設定為 no logfile "/usr/local/redis/logs/redis.log" # 設定日誌檔案 dir ./ # 資料目錄路徑 啟動服務 redis-server /usr/local/redis/redis.conf 複製程式碼
配置檔案詳解:
# 指定 redis 只接收來自於該 IP 地址的請求,如果不進行設定,那麼將處理所有請求,在生產環境中最好設定該項,如果只繫結 127.0.0.1 的話,就只有本機可以使用,外部無法訪問;實際上,應該 bind 的是 redis所在伺服器網路卡的 ip。也就是說,如果你的 redis 伺服器有兩張網路卡,一張是 ip-1,另一張是 ip-2,如果你 bind ip-1.那麼只有請求 ip-1 的請求會被受理。 bind 127.0.0.1 172.18.223.15 # redis 的一種安全機制,在這個機制開啟情況下 protected-mode yes,如果你 bind 127.0.0.1 客戶端也是連線不上的。 # 在這個機制關閉情況下 protected-mode no,如果你 bind 127.0.0.1 客戶端也是連線不上的,這個 bind 127.0.0.1 限定了 redis 只是監聽本地迴環的網路請求。 # 如果是這樣的配置 bind 127.0.0.1 192.168.0.5 和 protected-mode no 區域網可以連線; # 如果是這樣的配置 bind 127.0.0.1 192.168.0.5 和 protected-mode yes 配置, 區域網也可以連線; # 綜上感覺 protected-mode 引數配置感覺沒什麼用。所以保留為預設配置 protected-mode yes protected-mode yes # 監聽埠 port 63790 # TCP 最大連線數(這裡我改為和 linux 核心相同的值了,如果大型應用需要將核心的值修改到 2048 左右以應對更多的連線),預設是 511。 # 在 高請求/秒 的環境中,為了避免客戶端連線問題的緩慢,您需要大量的積壓。 # 請注意,Linux 核心將會悄悄地將其截斷為 /proc/sys/net/core/somaxconn 的值,因此要確保提高somaxconn 和 tcpmaxsynbacklog 的值,以獲得預期的效果。 tcp-backlog 128 # 設定最大客戶端連線數 maxclients 10000 # 表示客戶端空閒多長時間後關閉連線,如指定 0,表示該超時機制關閉。 timeout 0 tcp-keepalive 300 # 說明 redis 程式是後臺執行還是前臺執行,yes 表示後臺執行,no 表示前臺執行 daemonize yes # 設定訪問 redis 的口令 requirepass sfm@redis supervised no pidfile /mydata/redis/6379.pid # 指定日誌記錄級別,指定日誌記錄級別,Redis 總共支援四個級別:debug、verbose、notice、warning,預設為 notice loglevel notice logfile "/mydata/redis/logs/redis.log" # redis 資料庫個數(預設 16 個) databases 16 always-show-logo yes # 900秒(15分鐘) 內有 1 條資料發生了變化,將資料 dump 到磁碟 save 900 1 # 300秒(5分鐘) 內有 10 條資料發生了變化,將資料 dump 到磁碟 save 300 10 # 69秒(1分鐘) 內有 10000 條資料發生了變化,將資料 dump 到磁碟 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes # 設定 RDB 持久化儲存的檔名 dbfilename 6379.rdb # 設定 RDB 持久化儲存的路徑 dir /mydata/redis/ slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 maxmemory-policy allkeys-lru lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no slave-lazy-flush no # 啟用 Append Only Mode 持久化檔案 appendonly yes # 設定 AOF 持久化檔名 appendfilename "6379.aof" # fsync 持久化策略 appendfsync everysec # AOF 重寫期間是否禁止 fsync;如果開啟該選項,可以減輕檔案重寫時 CPU 和硬碟的負載(尤其是硬碟),但是可能會丟失 AOF 重寫期間的資料;需要在負載和安全性之間進行平衡 no-appendfsync-on-rewrite no # AOF 檔案重寫觸發條件之一 auto-aof-rewrite-percentage 100 # AOF 檔案重寫觸發條件之一 auto-aof-rewrite-min-size 64mb # 如果 AOF 檔案結尾損壞,Redis 啟動時是否仍載入 AOF 檔案 aof-load-truncated yes aof-use-rdb-preamble no lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes 複製程式碼
-
以 systemd 的方法來管理 redis 服務
新建 redis 使用者,不要以 root 使用者啟動 redis
# useradd -M -s /sbin/nologin redis 複製程式碼
在 /usr/lib/systemd/system/ 目錄下新建 redis.service 檔案,檔案內容如下:
[Unit] Description=Redis-4.0.10 # Documentation=man:mysqld(8) # Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=redis Group=redis Type=forking Restart=always ExecStart=/usr/local/redis-4.0.10/bin/redis-server /usr/local/redis-4.0.10/redis.conf ExecStop=/usr/local/redis-4.0.10/bin/redis-cli -h 127.0.0.1 -p 6379 -a redis123 shutdown LimitNOFILE=65535 複製程式碼
這樣就可以使用 systemctl start | stop | status | restart redis.service 命令來管理 redis 服務了
注意:redis 使用的 data 目錄及 logs 目錄需要給 redis 許可權
2、持久化設定
redis 的預設持久化策略是快照的方式
-
RDB 持久化配置
Redis 會將資料集的快照 dump 到 dump.rdb 檔案中。此外,我們也可以通過配置檔案來修改 Redis 伺服器 dump 快照的頻率,在開啟 redis.conf 檔案之後,我們搜尋 save,可以看到下面的配置資訊:
save 900 1 # 在 900 秒(15分鐘)之後,如果至少有 1 個 key 發生變化,則 dump 記憶體快照。 save 300 10 # 在 300 秒(5分鐘)之後,如果至少有 10 個 key 發生變化,則 dump 記憶體快照。 save 60 10000 # 在 60 秒(1分鐘)之後,如果至少有 10000 個 key 發生變化,則 dump 記憶體快照。 複製程式碼
預設 RDB 方式儲存的是
dump.rdb
檔案,恢復也是識別的是dump.rdb
儲存目錄也在配置檔案中可配置,預設當前位置
# Note that you must specify a directory here, not a file name. dir ./ # 預設 dump.rdb 檔案儲存位置 複製程式碼
-
AOF 方式持久化配置
如果把
appendonly no 修改為 appendonly yes 複製程式碼
則表示啟用 AOF 方式持久化(這種機制安全,儲存的資料最為健全,但要犧牲部分效能)
配置生成的 aof 檔名
appendfilename "appendonly.aof" appendfsync everysec | always | no # no 表示不執行 fsync,由作業系統保證資料同步到磁碟,速度最快。 # always 表示每次寫入都執行 fsync,以保證資料同步到磁碟。 # everysec 表示每秒執行一次 fsync,可能會導致丟失這 1 秒的資料。 appendfsync no 複製程式碼
五、管理
1、互動方式
可以使用兩種方式連線 redis 伺服器。
-
第一種:互動式方式
# redis-cli -h {host} -p {port} ## 以這種方式連線,然後所有的操作都是在互動的方式實現,不需要再執行 redis-cli 了。 複製程式碼
-
第二種:命令方式
# redis-cli -h {host} -p {port} {command} ## 直接得到命令的返回結果。 複製程式碼
命令方式常用引數:
引數 作用 用例 -r 代表將命令重複執行多次 $ redis-cli -r 3 ping
# ping 命令可用於檢測 redis 例項是否存活,如果存活則顯示 PONG-i 每隔幾秒(如果想用 ms,如 10ms 則寫成 0.01)執行一次命令,必須與 -r
一起使用$ redis-cli -r 10 -i 1 info | grep used_memory_human
# 每隔 1 秒輸出記憶體的使用量,一共輸出 10 次。-x 代表從標準輸入讀取資料作為該命令的最後一個引數。 $ echo "world" |redis-cli -x set hello
-c 連線叢集結點時使用,此選項可防止 moved 和 ask 異常。 -a 如配置了密碼,可用 a 選項。 $ redis-cli -a 123456 -r 10 -i 1 info | grep used_memory_human
--rdb 會請求 redis 例項生成併傳送 RDB 持久化檔案,儲存在本地。可做定期備份。
2、常用命令
1、檢視伺服器的資訊和統計:info
2. 刪除所有資料庫內容:flushall
3. 重新整理資料庫:flushdb
4. 看所有鍵:KEYS *,使用 select num 可以檢視鍵值資料。
5. 設定變數:set test "who am i"
6. config set dir dirpath 設定路徑等配置
7. config get dir/dbfilename 獲取路徑及資料庫配置資訊
8. save 儲存
9. get 變數,檢視變數名稱
10. time:返回當前伺服器時間
11. client list: 返回所有連線到伺服器的客戶端資訊和統計資料 參見http://redisdoc.com/server/client_list.html
12. client kill ip:port:關閉地址為 ip:port 的客戶端
13. save:將資料同步儲存到磁碟
14. bgsave:將資料非同步儲存到磁碟
15. lastsave:返回上次成功將資料儲存到磁碟的Unix時戳
16. shundown:將資料同步儲存到磁碟,然後關閉服務
17. config resetstat:重置info命令中的某些統計資料
18. config get:獲取配置檔案資訊
19. config set:動態地調整 Redis 伺服器的配置(configuration)而無須重啟,可以修改的配置引數可以使用命令 CONFIG GET * 來列出
20. config rewrite:Redis 伺服器時所指定的 redis.conf 檔案進行改寫
21. monitor:實時轉儲收到的請求
22. slaveof:改變複製策略設定
複製程式碼
Redis 主從複製配置
1、master 的 redis 配置檔案只需要設定好 bind、requirepass 等即可
2、slave 的 redis 配置檔案中新增以下行:
slaveof x.x.x.x 6379 # Master 的 IP 地址及埠號
masterauth redis123 # 如果 Master 上設定有密碼的話,這裡需要設定跟 Master 上一樣的密碼
或者動態修改設定:
通過 redis-cli 連線到從節點伺服器,執行下面命令即可。
slaveof x.x.x.x 6379
複製程式碼