本文主要展示在单台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/ ,后缀不再是org!!!。
安装在安装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"));
}
}