來源:Java技術棧

添加配置信息

spring.redis:
database: 0 # Redis數據庫索引(默認爲0)
#host: 192.168.1.8
#port: 6379
password: 123456
timeout: 10000 # 連接超時時間(毫秒)
pool:
max-active: 8 # 連接池最大連接數(使用負值表示沒有限制)
max-idle: 8 # 連接池中的最大空閒連接
max-wait: -1 # 連接池最大阻塞等待時間(使用負值表示沒有限制)
min-idle: 0 # 連接池中的最小空閒連接
cluster:
nodes:
- 192.168.1.8:9001
- 192.168.1.8:9002
- 192.168.1.8:9003

只需要添加3個master節點,3個slave節點不需要添加。

你要做的也只有這些配置了,其他的spring boot都自動配置好了。

現在就可以像使用單機一樣使用集羣,redis會自動按key分片到不同的集羣實例。

遇到的問題

Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:53)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
at redis.clients.jedis.JedisSlotBasedConnectionHandler.getConnectionFromSlot(JedisSlotBasedConnectionHandler.java:66)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:116)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:141)
at redis.clients.jedis.JedisClusterCommand.runBinary(JedisClusterCommand.java:60)
at redis.clients.jedis.BinaryJedisCluster.set(BinaryJedisCluster.java:77)
at org.springframework.data.redis.connection.jedis.JedisClusterConnection.set(JedisClusterConnection.java:618)
... 36 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
at redis.clients.jedis.Connection.connect(Connection.java:207)
at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1767)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:106)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
at redis.clients.util.Pool.getResource(Pool.java:49)
... 46 more
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at redis.clients.jedis.Connection.connect(Connection.java:184)
... 53 more

嘗試往redis寫數據的時候,報不能獲取連接異常,跟蹤了半天代碼,發現連接的是127.0.0.1,而不是配置的192.168.1.8,這就奇怪了,繼續跟蹤代碼發現是往redis服務器獲取的返回的集羣實例列表,真是坑!

Spring Boot Redis Cluster 實戰乾貨


源碼:


redis.clients.jedis.Jedis#clusterSlots
@Override
public List clusterSlots() {
checkIsInMultiOrPipeline();
client.clusterSlots();
return client.getObjectMultiBulkReply();
}

就是這裏獲取返回的集羣列表,返回的就是127.0.0.1,而不是配置的192.168.1.8。

最後修改各個集羣節點的配置文件redis.conf,添加:

bind 192.168.1.8

重啓集羣節點之後,讀寫正常。

(完)

相關文章