首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Redis 單機與集群部署全流程:從源碼編譯到 Jedis/Spring 整合、集群擴縮容實操

     編輯:Java 綜合教學

一、單機版 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

三、集群運維常用操作

操作命令示例說明
添加 Masterredis-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)
添加 Slaveredis-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 防止無限重試。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved