SpringBoot實戰電商專案mall(30k+star)地址:github.com/macrozheng/…
摘要
為了提高Redis的儲存容量和響應速度,有時候我們需要搭建Redis叢集。本文主要講述Redis叢集環境的搭建步驟以及如何在SpringBoot中整合使用Redis叢集。
Redis叢集搭建
這裡我們使用最方便的搭建方式,使用Docker Compose來搭建,對Docker Compose不瞭解的朋友可以參考下《使用Docker Compose部署SpringBoot應用》。我們將搭建一個6節點的Redis叢集,包括3個主節點和3個從節點。
-
在搭建Redis叢集之前,我們需要修改下Redis的配置檔案
redis.conf
,該檔案的下載地址:github.com/antirez/red… -
需要修改的屬性如下,主要是修改了一些叢集配置和執行埠,埠號需要按需修改為6391~6396:
# 開啟叢集功能
cluster-enabled yes
# 設定執行埠
port 6391
# 設定節點超時時間,單位毫秒
cluster-node-timeout 15000
# 叢集內部配置檔案
cluster-config-file "nodes-6391.conf"
複製程式碼
- 然後我們需要編寫docker-compose.yml檔案用於編排6個Redis容器,具體屬性的作用可以參考下面的註釋;
version: "3"
services:
redis-master1:
image: redis:5.0 # 基礎映象
container_name: redis-master1 # 容器名稱
working_dir: /config # 切換工作目錄
environment: # 環境變數
- PORT=6391 # 會使用config/nodes-${PORT}.conf這個配置檔案
ports: # 對映埠,對外提供服務
- 6391:6391 # redis的服務埠
- 16391:16391 # redis叢集監控埠
stdin_open: true # 標準輸入開啟
tty: true # 後臺執行不退出
network_mode: host # 使用host模式
privileged: true # 擁有容器內命令執行的許可權
volumes:
- /mydata/redis-cluster/config:/config #配置檔案目錄對映到宿主機
entrypoint: # 設定服務預設的啟動程式
- /bin/bash
- redis.sh
redis-master2:
image: redis:5.0
working_dir: /config
container_name: redis-master2
environment:
- PORT=6392
ports:
- 6392:6392
- 16392:16392
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- /mydata/redis-cluster/config:/config
entrypoint:
- /bin/bash
- redis.sh
redis-master3:
image: redis:5.0
container_name: redis-master3
working_dir: /config
environment:
- PORT=6393
ports:
- 6393:6393
- 16393:16393
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- /mydata/redis-cluster/config:/config
entrypoint:
- /bin/bash
- redis.sh
redis-slave1:
image: redis:5.0
container_name: redis-slave1
working_dir: /config
environment:
- PORT=6394
ports:
- 6394:6394
- 16394:16394
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- /mydata/redis-cluster/config:/config
entrypoint:
- /bin/bash
- redis.sh
redis-slave2:
image: redis:5.0
working_dir: /config
container_name: redis-slave2
environment:
- PORT=6395
ports:
- 6395:6395
- 16395:16395
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- /mydata/redis-cluster/config:/config
entrypoint:
- /bin/bash
- redis.sh
redis-slave3:
image: redis:5.0
container_name: redis-slave3
working_dir: /config
environment:
- PORT=6396
ports:
- 6396:6396
- 16396:16396
stdin_open: true
network_mode: host
tty: true
privileged: true
volumes:
- /mydata/redis-cluster/config:/config
entrypoint:
- /bin/bash
- redis.sh
複製程式碼
-
從docker-compose.yml檔案中我們可以看到,我們的Redis容器分別執行在6391~6396這6個埠之上, 將容器中的
/config
配置目錄對映到了宿主機的/mydata/redis-cluster/config
目錄,同時還以redis.sh
指令碼作為該容器的啟動指令碼; -
redis.sh
指令碼的作用是根據environment環境變數中的PORT
屬性,以指定配置檔案來啟動Redis容器;
redis-server /config/nodes-${PORT}.conf
複製程式碼
- 接下來我們需要把Redis的配置檔案和
redis.sh
上傳到Linux伺服器的/mydata/redis-cluster/config
目錄下;
- 接下來上傳我們的docker-compose.yml檔案到Linux伺服器,並使用docker-compose命令來啟動所有容器;
docker-compose up -d
複製程式碼
- 啟動過程中會輸出如下資訊;
- 此時進入其中一個Redis容器之中,初始化Redis叢集;
# 進入Redis容器
docker exec -it redis-master1 /bin/bash
# 初始化Redis叢集命令
redis-cli --cluster create \
192.168.6.139:6391 192.168.6.139:6392 192.168.6.139:6393 \
192.168.6.139:6394 192.168.6.139:6395 192.168.6.139:6396 \
--cluster-replicas 1
複製程式碼
- 叢集建立過程中會讓你確認配置,輸入
yes
確認即可;
- Redis叢集建立成功後會輸出如下資訊;
- 建立成功後我們可以使用
redis-cli
命令連線到其中一個Redis服務;
# 單機模式啟動
redis-cli -h 127.0.0.1 -p 6391
# 叢集模式啟動
redis-cli -c -h 127.0.0.1 -p 6391
複製程式碼
- 之後通過
cluster nodes
命令可以檢視節點資訊,發現符合原來3主3從的預期。
SpringBoot中使用Redis叢集
我們在《Spring Data Redis 最佳實踐!》中講到了在SpringBoot中如何使用Redis,用的是單節點的Redis服務,這次我們講下如何使用Redis叢集服務。
- 我們在原來程式碼的基礎上進行改造,修改application.yml配置檔案,新增Redis叢集配置;
spring:
redis:
# host: 192.168.6.139 # Redis伺服器地址
# database: 0 # Redis資料庫索引(預設為0)
# port: 6379 # Redis伺服器連線埠
password: # Redis伺服器連線密碼(預設為空)
timeout: 3000ms # 連線超時時間
lettuce:
pool:
max-active: 8 # 連線池最大連線數
max-idle: 8 # 連線池最大空閒連線數
min-idle: 0 # 連線池最小空閒連線數
max-wait: -1ms # 連線池最大阻塞等待時間,負值表示沒有限制
cluster:
nodes:
- 192.168.6.139:6391
- 192.168.6.139:6392
- 192.168.6.139:6393
- 192.168.6.139:6394
- 192.168.6.139:6395
- 192.168.6.139:6396
複製程式碼
-
此時我們再次呼叫獲取品牌詳情的介面,就會把品牌資訊快取到Redis叢集中去了;
-
由於Redis容器
redis-master1
和redis-slave2
互為主從,所以裡面都快取了相同的品牌詳情資訊。
配置檔案地址
專案原始碼地址
公眾號
mall專案全套學習教程連載中,關注公眾號第一時間獲取。