本文搭建redis3.0版本,3.0主要增长了redis集群功能。java
download.redis.io/releases/re… 将下载文件拷贝到/usr/localnode
tar -zxvf redis-3.0.0.tar.gz
复制代码
cd /usr/local/redis-3.0.0
make
复制代码
cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install
复制代码
cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin
复制代码
daemonize yes
复制代码
cd /usr/local/redis ./bin/redis-server ./redis.conf //在何处启动的server,一些配置文件就默认在该处生成(若是配置的相对路径)
复制代码
port 7001 //监听的端口
# bind 127.0.0.1 //绑定ip,只容许该ip访问,不填默认为*,表示容许全部ip访问
requirepass "你的密码" //开启密码
loglevel debug //日志级别,开发模式尽可能选用debug
logfile "redis.log" //日志文件路径,此处使用相对路径,将生成到/usr/local/redis下
maxmemory 100000000 //容许最大内存占用100m
appendonly yes //启用aof
auto-aof-rewrite-percentage 80 //部署在同一机器的多个redis实例,建议把auto-aof-rewrite错开(可分别写80-100不等),防止瞬间fork,全部redis进程作rewrite,占用大量内存
复制代码
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.0</version>
</dependency>
复制代码
链接池整合spring:redis
<!-- redis链接池(单例) -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool" destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig"/>
<constructor-arg name="host" value="${redis.host}"/>
<constructor-arg name="port" value="${redis.port}"/>
<constructor-arg name="timeout" value="${redis.timeout}"/>
<constructor-arg name="password" value="${redis.pass}"/>
</bean>
<!--redis配置文件-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大链接数 -->
<property name="maxTotal" value="150" />
<!-- 最大空闲链接数 -->
<property name="maxIdle" value="30" />
<!-- 最小空闲链接数 -->
<property name="minIdle" value="10" />
<!-- 获取链接时的最大等待毫秒数,小于零:阻塞不肯定的时间,默认-1 -->
<property name="maxWaitMillis" value="3000" />
<!-- 每次释放链接的最大数目 -->
<property name="numTestsPerEvictionRun" value="100" />
<!-- 释放链接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="3000" />
<!-- 链接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 链接空闲多久后释放, 当空闲时间>该值 且 空闲链接>最大空闲链接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 在获取链接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true" />
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true" />
<!-- 在归还给pool时,是否提早进行validate操做 -->
<property name="testOnReturn" value="true" />
<!-- 链接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false" />
</bean>
复制代码
测试:spring
@RunWith(SpringJUnit4ClassRunner.class) // 指定测试用例的运行器 这里是指定了Junit4
@ContextConfiguration("classpath:spring/application*.xml")
public class RedisTest {
@Autowired
private JedisPool pool;
@Test
public void testJedisPool() {
Jedis jedis = null;
String name = null;
try {
jedis = pool.getResource();
jedis.set("testName", "RCL");
name = jedis.get("testName");
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 返回给池
jedis.close();
}
Assert.assertEquals("RCL", name);
}
}
复制代码
若是链接不上,可查看是否防火墙没有将redis端口开放,/etc/sysconfig/iptables添加:后端
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7001 -j ACCEPT //7001即redis端口
复制代码
而后重启防火墙。ruby
集群管理工具redis-trib.rb依赖ruby环境 (1)安装ruby:bash
yum install ruby yum install rubygems
复制代码
(2)安装ruby和redis的接口程序: 拷贝redis-3.0.0.gem至/usr/local。执行:app
gem install /usr/local/redis-3.0.0.gem
复制代码
(1)创建存放redis群的文件夹及子文件夹(用于存放每一个redis实例):socket
cd /usr/local
mkdir redis-cluster
mkdir redis-cluster/7001
mkdir redis-cluster/7002
……
复制代码
(2)将刚刚安装的单机redis的/usr/local/redis文件夹拷贝到每一个700X文件夹下,(这里咱们创建六个实例,三主三从)tcp
(3)修改每一个700X目录下的redis.conf配置文件:
port 700X //各自监听的端口
#bind 127.0.0.1 //这里不绑定,默认容许全部ip访问,或者bind 0.0.0.0
cluster-enabled yes //开启集群
cluster-node-timeout 15000 //15时间内没有收到对方的回复,则单方面认为端节点挂掉
复制代码
另外,因为下面咱们须要配置集群密码,故以前配置的 requirepass 先删掉,集群成功后再进行配置。
分别进入700一、700二、...7006目录,执行:
./redis-server ./redis.conf
复制代码
/usr/local/redis-cluster/redis-trib.rb create --replicas 1 [ip]:7001 [ip]:7002 [ip]:7003 [ip]:7004 [ip]:7005 [ip]:7006
复制代码
注意: (1)为保证远程可访问,这里的ip尽可能使用公网ip,且建立集群时可先关闭防火墙,不然能够出现一直join……的现象。
(2)redis集群至少须要3个主节点,每一个主节点有一个从节点总共6个节点
(3)replicas指定为1表示每一个主节点有一个从节点
(4)若是出现[ERR] Sorry, can't connect to node
错误:
- ruby 和rubygem 版本过低,安装新版本。查看gem版本和redis版本(redis-cli -v可查看redis版本)
(5)若是出现[ERR] Node 127.0.0.1:7005 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
: 表示集群时,以前的redis已有数据,那么登陆到7005的redis中,执行FLUSHALL便可
(6)若是出现ERR Slot 0 is already busy (Redis::CommandError)
: 用redis-cli登陆到每一个节点执行flushall和cluster reset便可2.6进入集群:
./redis-cli -c -p 7001 -h 123.123.123.123(-c即-cluster 表示进入集群模式,不加表示进入单机redis)
复制代码
进入集群后,键入cluster info
,显示cluster_state:ok
,表示成功
(1)登陆到每一个节点,执行:
config set masterauth [你的密码] config set requirepass [你的密码]
复制代码
(2)随后登入 7001/bin/redis-cli -c -h 112.74.55.239 -p 7004 -a 你的密码,执行: config rewrite
(3)防火墙开放7001到7006端口,以及redis总线:17001到17006:
-A INPUT -p tcp -m state --state NEW -m tcp --dport 7001:7006 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 17001:17006 -j ACCEPT
复制代码
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version> //2.9.0才支持cluster密码认证,以前版本的jedisCluster.auth("密码")方法里面什么都没有实现,仅仅抛一个JedisClusterException("No way to dispatch this command to Redis Cluster.")
</dependency>
复制代码
整合spring:
<!-- redis集群 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg index="0">
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="${redis.host}"></constructor-arg>
<constructor-arg index="1" value="${redis.port1}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="${redis.host}"></constructor-arg>
<constructor-arg index="1" value="${redis.port2}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="${redis.host}"></constructor-arg>
<constructor-arg index="1" value="${redis.port3}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="${redis.host}"></constructor-arg>
<constructor-arg index="1" value="${redis.port4}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="${redis.host}"></constructor-arg>
<constructor-arg index="1" value="${redis.port5}"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="${redis.host}"></constructor-arg>
<constructor-arg index="1" value="${redis.port6}"></constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" value="${redis.timeout}"></constructor-arg>
<constructor-arg index="2" value="${redis.sockettimeout}"></constructor-arg>
<constructor-arg index="3" value="${redis.maxAttempts}"></constructor-arg>
<constructor-arg index="4" value="${redis.pass}"></constructor-arg>
<constructor-arg index="5" ref="jedisPoolConfig"></constructor-arg>
</bean>
复制代码
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring/application*.xml")
public class RedisTest {
@Autowired
private JedisCluster jCluster;
@Test
public void testJCluster() {
jCluster.set("name", "RCL");
String name = jCluster.get("testName");
Assert.assertEquals("RCL", name);
}
复制代码