redis叢集實戰(單臺機器Windows環境下搭建3主3從redis叢集)
本文主要展示在單臺win10機器上搭建三主三從redis叢集。
搭建過程
主要參考作者: 每天都在變得更好的阿飛 的兩篇部落格
《Redis叢集主從複製(一主兩從)搭建配置教程【Windows環境】》https://blog.csdn.net/u010648555/article/details/79427606
《Redis建立高可用叢集教程【Windows環境】》https://blog.csdn.net/u010648555/article/details/79427608
這兩篇部落格非常詳細的介紹了搭建過程,裡面還有相應軟體的下載地址。
注意:
1、由於域名問題,在安裝RubyGems時,最終的ruby映象源修改為 Ruby China http://gems.ruby-china.com
安裝在安裝RubyGems的下載地址 https://rubygems.org/pages/download, 下載後解壓,當前目錄切換到解壓目錄中,如 D:\Program Files\redis\rubygems-2.6.12 然後在命令列執行ruby setup.rb安裝RubyGems。
2、redis-trib.rb檔案需要使用(redis3.2.0即可)的原始碼壓縮包中src資料夾下的redis-trib.rb檔案。
下載redis原始碼版壓縮包:http://download.redis.io/releases/
若redis-trib.rb檔案版本較低,會出現以下錯誤:
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.
redis cluster使用
匯入依賴:
<!--引入reids--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
配置xml檔案:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<description>redis cluster configuation</description>
<bean id="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
<!--連線池中最大空閒連線數, 預設8個-->
<property name="maxIdle" value="${redis.pool.maxIdle}"/>
<!--連線池中最小空閒連線數-->
<property name="minIdle" value="${redis.pool.minIdle}"/>
<!--連線池中最大連線數, 預設8個-->
<property name="maxTotal" value="${redis.pool.maxTotal}"/>
<!--是否啟用pool的jmx管理功能, 預設true-->
<property name="jmxEnabled" value="${redis.pool.jmxEnabled}"/>
<!--當連線池資源耗盡時,呼叫者最大阻塞的時間,超時將跑出異常。單位,毫秒數;預設為-1.表示永不超時-->
<property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}"/>
<!--連線空閒的最小時間,達到此值後空閒連線將可能會被移除。負值(-1)表示不移除-->
<property name="minEvictableIdleTimeMillis" value="${redis.pool.minEvictableIdleTimeMillis}"/>
<!--對於“空閒連結”檢測執行緒而言,每次檢測的連結資源的個數。預設為3-->
<property name="numTestsPerEvictionRun" value="${redis.pool.numTestsPerEvictionRun}"/>
<!--向呼叫者輸出“連結”資源時,是否檢測是有有效,如果無效則從連線池中移除,
並嘗試獲取繼續獲取。預設為false。建議保持預設值.-->
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
<!--向連線池“歸還”連結時,是否檢測“連結”物件的有效性。預設為false。建議保持預設值-->
<property name="testOnReturn" value="${redis.pool.testOnReturn}"/>
<!--“空閒連結”檢測執行緒(用於釋放連結)檢測的週期(毫秒)。如果為負值,表示不執行“檢測執行緒”。預設為-1-->
<property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}"/>
<!--連線耗盡時是否阻塞, false報異常,true阻塞直到超時, 預設true-->
<property name="blockWhenExhausted" value="${redis.pool.blockWhenExhausted}"/>
</bean>
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster" destroy-method="close">
<constructor-arg>
<set>
<bean id="jedisClusterNode1" class="redis.clients.jedis.HostAndPort">
<constructor-arg value="${jedisClusterNode.1.host}"/>
<constructor-arg value="${jedisClusterNode.1.port}"/>
</bean>
<bean id="jedisClusterNode2" class="redis.clients.jedis.HostAndPort">
<constructor-arg value="${jedisClusterNode.2.host}"/>
<constructor-arg value="${jedisClusterNode.2.port}"/>
</bean>
<bean id="jedisClusterNode3" class="redis.clients.jedis.HostAndPort">
<constructor-arg value="${jedisClusterNode.3.host}"/>
<constructor-arg value="${jedisClusterNode.3.port}"/>
</bean>
</set>
</constructor-arg>
<!--redis的連線超時時間-->
<constructor-arg value="${redis.connectionTimeout}"/>
<!--redis獲取資料超時時間-->
<constructor-arg value="${redis.soTimeout}"/>
<!--redis出現異常最大重試次數-->
<constructor-arg value="${redis.maxAttempts}"/>
<constructor-arg ref="genericObjectPoolConfig"/>
</bean>
</beans>
redis.properties配置
# 本地redis叢集配置
jedisClusterNode.1.host=127.0.0.1
jedisClusterNode.1.port=20000
jedisClusterNode.2.host=127.0.0.1
jedisClusterNode.2.port=20001
jedisClusterNode.3.host=127.0.0.1
jedisClusterNode.3.port=20002
# timeout
redis.connectionTimeout=5000
redis.soTimeout=2000
redis.maxAttempts=3
# redis連線池配置
redis.pool.minIdle=1
redis.pool.maxIdle=50
redis.pool.maxTotal=512
redis.pool.jmxEnabled=false
redis.pool.maxWaitMillis=4000
redis.pool.minEvictableIdleTimeMillis=120000
redis.pool.numTestsPerEvictionRun=3
redis.pool.testOnBorrow=false
redis.pool.testOnReturn=false
redis.pool.timeBetweenEvictionRunsMillis=300000
redis.pool.blockWhenExhausted=true
編寫程式碼:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration //宣告一個ApplicationContext整合測試載入WebApplicationContext,作用是模擬ServletContext
@ContextConfiguration(locations={"classpath:spring/spring-application.xml"})
@Service
public class RedisServiceImpl implements RedisService {
//private static final Logger logger = Logger.getLogger(RedisServiceImpl.class);
@Autowired
private JedisCluster jedisCluster;
@Test
public void testRedis( ) {
jedisCluster.set("1","哈哈");
System.out.println(jedisCluster.get("1"));
}
}