一、單機版 Redis 部署
1. 源碼編譯安裝(推薦指定目錄)
# 下載
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar -zxf redis-7.2.4.tar.gz
cd redis-7.2.4
# 編譯安裝到 /usr/local/redis
make PREFIX=/usr/local/redis install
# 複製配置文件
mkdir -p /usr/local/redis/conf
cp redis.conf /usr/local/redis/conf/
2. 核心配置修改 (redis.conf)
bind 0.0.0.0 # 監聽所有網卡
port 6379
daemonize yes # 後台運行
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis_6379.log"
dir /data/redis # 數據文件目錄
maxmemory 2gb # 內存上限
maxmemory-policy allkeys-lru
requirepass your_strong_password # 生產必須設置密碼
3. 啟動與驗證
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ps -ef | grep redis
/usr/local/redis/bin/redis-cli -a your_strong_password ping # 返回 PONG
4. Jedis 單機整合(含連接池)
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version></dependency>
@Bean
public JedisPool jedisPool() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50);
config.setMaxIdle(20);
config.setMinIdle(5);
config.setTestOnBorrow(true);
return new JedisPool(config, "192.168.1.100", 6379, 3000, "your_strong_password");
}
// 使用
try (Jedis jedis = jedisPool.getResource()) {
jedis.set("key", "value");
String val = jedis.get("key");
}
二、Redis Cluster 集群部署(3 Master + 3 Slave)
1. 環境準備:Ruby + redis-gem
yum install -y ruby rubygems
gem install redis -v 4.8.0 # cluster 管理工具 redis-trib.rb 依賴
2. 6 節點目錄結構與配置
# 基礎目錄
mkdir -p /usr/local/redis-cluster/{7001,7002,7003,7004,7005,7006}/{conf,data,logs}
# 每個節點 conf/redis.conf 關鍵差異
port 7001 # 7001~7006
cluster-enabled yes
cluster-config-file nodes-7001.conf # 各節點獨立
cluster-node-timeout 15000
appendonly yes
dir /usr/local/redis-cluster/7001/data
3. 啟動 6 個實例
for port in {7001..7006}; do
/usr/local/redis/bin/redis-server /usr/local/redis-cluster/$port/conf/redis.conf
done
4. 創建集群(1 個副本,即 3M3S)
/usr/local/redis/bin/redis-cli --cluster create \
192.168.1.100:7001 192.168.1.100:7002 192.168.1.100:7003 \
192.168.1.100:7004 192.168.1.100:7005 192.168.1.100:7006 \
--cluster-replicas 1 -a your_strong_password
# 輸入 yes 確認分配 16384 slots
5. 驗證集群狀態
redis-cli -c -p 7001 -a your_strong_password cluster nodes
# 顯示 6 節點,3 master 各持有 ~5461 slots,3 slave 對應 replication
三、集群運維常用操作
| 操作 | 命令示例 | 說明 |
| 添加 Master | redis-cli --cluster add-node 192.168.1.100:7007 192.168.1.100:7001 -a pwd | 新節點無 slots,需再執行 reshard |
| Slot 遷移 | redis-cli --cluster reshard 192.168.1.100:7001 -a pwd | 交互式輸入:移動槽數、目標節點ID、源節點ID(all) |
| 添加 Slave | redis-cli --cluster add-node --slave --master-id <master_id> 192.168.1.100:7008 192.168.1.100:7001 -a pwd | 指定主節點 ID |
| 刪除節點 | redis-cli --cluster del-node 192.168.1.100:7008 <node_id> -a pwd | 刪除前必須將其 slots 遷移完畢 |
| 手動故障轉移 | redis-cli -p 7004 -a pwd cluster failover | 在 slave 上執行,模擬主節點掛了 |
四、Jedis Cluster 整合與 Spring 配置
@Bean
public JedisCluster jedisCluster() {
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.1.100", 7001));
nodes.add(new HostAndPort("192.168.1.100", 7002));
nodes.add(new HostAndPort("192.168.1.100", 7003));
// 至少一個 master 節點即可,客戶端自動發現拓撲
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(100);
return new JedisCluster(nodes, 3000, 3000, 3, "your_strong_password", config);
}
// Spring XML 簡化版
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg value="192.168.1.100"/><constructor-arg value="7001"/>
</bean>
<!-- 其他節點 -->
</set>
</constructor-arg>
<constructor-arg value="3000"/> <!-- timeout -->
<constructor-arg value="3000"/> <!-- soTimeout -->
<constructor-arg value="3"/> <!-- maxAttempts -->
<constructor-arg value="your_strong_password"/>
<constructor-arg ref="jedisPoolConfig"/>
</bean>
五、集群模式下的關鍵限制與最佳實踐
- 多鍵操作:
MGET、MSET、Pipeline、Lua 腳本、事務 要求所有 Key 落在**同一 Slot**(CRC16(key) & 16383)。解決方案:Hash Tags 強制同槽 {user:100}:profile、{user:100}:cart。
- Keys * 禁用:生產環境嚴禁
KEYS,用 SCAN 游標迭代。
- 大 Key 拆分:防止熱點 Slot 傾斜、網絡阻塞。
- 客戶端路由表緩存:JedisCluster 內部維護 Slot-Node 映射,MOVED/ASK 重定向自動處理,
maxAttempts 防止無限重試。