一、环境搭建
我这里直接使用搭建集群后的环境,【Redis的集群搭建】
查看下集群节点信息
[root@*** redis-cluster]# ./redis-5.0.4/src/redis-cli -h 192.168.0.24 -p 8001
192.168.0.24:8001> cluster nodes
e80b66392e8c56b46ca9c899056f4d3be15d71da 192.168.0.24:8001@18001 myself,master - 0 1564931257000 1 connected 0-5460
1dd0742fe874901f6d59a1c55611779977dd5e9f 192.168.0.111:8001@18001 master - 0 1564931259373 2 connected 5461-10922
533fd78ee6316b8e87231b690a03b722960dbfad 192.168.0.58:8001@18001 master - 0 1564931260429 3 connected 10923-16383
0765663dff45fef94deb7c471b962ba983cf733a 192.168.0.24:8002@18002 slave 533fd78ee6316b8e87231b690a03b722960dbfad 0 1564931259000 4 connected
07bfd8acd3e7dc3cf68a617f386c282291c81b6a 192.168.0.111:8002@18002 slave e80b66392e8c56b46ca9c899056f4d3be15d71da 0 1564931256000 5 connected
d4387bb2288d436e12a17dc9a750bc447adb6e55 192.168.0.58:8002@18002 slave 1dd0742fe874901f6d59a1c55611779977dd5e9f 0 1564931257000 6 connected
很明显,上面集群是用私网ip启动的,所以,当你在java连接上述集群时,可能会出现连接不上的问题。
解决上述问题,可以进行下面操作:
1、关闭进程(三台服务器都需要进行这一步操作)
[root@*** redis-cluster]# ps -ef|grep redis
root 25920 1 0 09:24 ? 00:00:00 ./redis-5.0.4/src/redis-server 192.168.0.24:8001 [cluster]
root 25933 1 0 09:24 ? 00:00:00 ./redis-5.0.4/src/redis-server 192.168.0.24:8002 [cluster]
[2]+ Done ./redis-5.0.4/src/redis-server 8002/redis8002.conf
[root@*** redis-cluster]# kill -9 25920
[root@*** redis-cluster]# kill -9 25933
[root@*** redis-cluster]# ps -ef|grep redis
root 25978 25691 0 09:24 pts/0 00:00:00 grep --color=auto redis
2、删除之前搭建集群生成的文件(三台服务器都需要进行这一步操作)3、修改redis节点配置(三台服务器都需要进行这一步操作)
[root@*** redis-cluster]# vim 8001/redis8001.conf
[root@*** redis-cluster]# vim 8002/redis8002.conf
#注掉bind
#bind 192.168.0.24
4、重新启动redis节点
[root@*** redis-cluster]# ./redis-5.0.4/src/redis-server 8001/redis8001.conf &
[1] 10061
[root@*** redis-cluster]# ./redis-5.0.4/src/redis-server 8002/redis8002.conf &
[2] 10071
[1] Done ./redis-5.0.4/src/redis-server 8001/redis8001.conf
[root@*** redis-cluster]# ps -ef|grep redis
root 10062 1 0 14:27 ? 00:00:00 ./redis-5.0.4/src/redis-server *:8001 [cluster]
root 10072 1 0 14:27 ? 00:00:00 ./redis-5.0.4/src/redis-server *:8002 [cluster]
root 10081 9891 0 14:27 pts/0 00:00:00 grep --color=auto redis
5、搭建集群
[root@*** redis-cluster]# ./redis-5.0.4/src/redis-cli --cluster-replicas 1 --cluster create 118.***.***.***:8001 118.***.***.***:8001 118.***.***.***:8001 118.***.***.***:8002 118.***.***.***:8002 118.***.***.***:8002
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 118.***.***.***:8002 to 118.***.***.***:8001
Adding replica 118.***.***.***:8002 to 118.***.***.***:8001
Adding replica 118.***.***.***:8002 to 118.***.***.***:8001
M: 021cab0f787c93658de00ec5c44e11df67128816 118.***.***.***:8001
slots:[0-5460] (5461 slots) master
M: 4f1405d6077ce5a1dcb4e233b853ae1d1db3708f 118.***.***.***:8001
slots:[5461-10922] (5462 slots) master
M: 5d371b19e24508b716f9bf88c8ab2947cfbc409e 118.***.***.***:8001
slots:[10923-16383] (5461 slots) master
S: 206d735a3dce087941f0fcc6240a02dd05e2ec0b 118.***.***.***:8002
replicates 5d371b19e24508b716f9bf88c8ab2947cfbc409e
S: 48f262b3faac9c72383cc6576e57539e8440bda1 118.***.***.***:8002
replicates 021cab0f787c93658de00ec5c44e11df67128816
S: e18aa3c4d2bcae3568649ed9fa516dd356bbd774 118.***.***.***:8002
replicates 4f1405d6077ce5a1dcb4e233b853ae1d1db3708f
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 118.***.***.***:8001)
M: 021cab0f787c93658de00ec5c44e11df67128816 118.***.***.***:8001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 4f1405d6077ce5a1dcb4e233b853ae1d1db3708f 118.***.***.***:8001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 206d735a3dce087941f0fcc6240a02dd05e2ec0b 118.***.***.***:8002
slots: (0 slots) slave
replicates 5d371b19e24508b716f9bf88c8ab2947cfbc409e
S: 48f262b3faac9c72383cc6576e57539e8440bda1 118.***.***.***:8002
slots: (0 slots) slave
replicates 021cab0f787c93658de00ec5c44e11df67128816
M: 5d371b19e24508b716f9bf88c8ab2947cfbc409e 118.***.***.***:8001
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: e18aa3c4d2bcae3568649ed9fa516dd356bbd774 118.***.***.***:8002
slots: (0 slots) slave
replicates 4f1405d6077ce5a1dcb4e233b853ae1d1db3708f
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
如果构建集群卡在Waiting for the cluster to join,可以在服务器安全组中开放redis集群总线端口。redis集群总线端口为redis客户端端口加上10000,比如,我这里使用了8001、8002端口,那么总线端口为18001、18002端口,入方向规则、出方向规则都增加规则即可。
6、从上面搭建结果,可以知道redis节点的ip为公网ip,如果不放心的可以再次查看下节点信息
[root@*** redis-cluster]# ./redis-5.0.4/src/redis-cli -c -h 118.***.***.*** -p 8001
118.***.***.***:8001> cluster nodes
4f1405d6077ce5a1dcb4e233b853ae1d1db3708f 118.***.***.***:8001@18001 master - 0 1565681079582 2 connected 5461-10922
206d735a3dce087941f0fcc6240a02dd05e2ec0b 118.***.***.***:8002@18002 slave 5d371b19e24508b716f9bf88c8ab2947cfbc409e 0 1565681080628 4 connected
48f262b3faac9c72383cc6576e57539e8440bda1 118.***.***.***:8002@18002 slave 021cab0f787c93658de00ec5c44e11df67128816 0 1565681080000 5 connected
5d371b19e24508b716f9bf88c8ab2947cfbc409e 118.***.***.***:8001@18001 master - 0 1565681079000 3 connected 10923-16383
021cab0f787c93658de00ec5c44e11df67128816 192.168.0.24:8001@18001 myself,master - 0 1565681077000 1 connected 0-5460
e18aa3c4d2bcae3568649ed9fa516dd356bbd774 118.***.***.***:8002@18002 slave 4f1405d6077ce5a1dcb4e233b853ae1d1db3708f 0 1565681079000 6 connected
二、java集成redis集群
ssm框架下集成redis集群
1、在pom.xml文件中加入以下配置
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2、在applicationContext.xml加入,(这个配置是直接从网上找的,亲测可用),记得把ip、端口改成你自己redis集群ip、端口,这些参数也可以写到配置文件中,然后在applicationContext.xml中读取配置类。
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30"/>
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10"/>
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000"/>
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000"/>
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000"/>
<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
<property name="maxWaitMillis" value="1500"/>
<!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testOnBorrow" value="true"/>
<!-- 在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="true"/>
<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
<property name="blockWhenExhausted" value="false"/>
</bean>
<!-- 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="118.***.***.***"></constructor-arg>
<constructor-arg index="1" value="8001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="118.***.***.***"></constructor-arg>
<constructor-arg index="1" value="8002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="118.***.***.***"></constructor-arg>
<constructor-arg index="1" value="8001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="118.***.***.***"></constructor-arg>
<constructor-arg index="1" value="8002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="118.***.***.***"></constructor-arg>
<constructor-arg index="1" value="8001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg index="0" value="118.***.***.***"></constructor-arg>
<constructor-arg index="1" value="8002"></constructor-arg>
</bean>
</set>
</constructor-arg>
<constructor-arg index="1" ref="jedisPoolConfig"></constructor-arg>
</bean>
3、这里简单使用main方法测试
package com.su.mybatis.oracle.controller;
import java.io.IOException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import redis.clients.jedis.JedisCluster;
public class Test {
/**
* @param args
* @author sucb
* @throws IOException
* @date 2019-8-13
*/
@SuppressWarnings("resource")
public static void main(String[] args) throws IOException {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
JedisCluster jedisCluster = (JedisCluster) applicationContext.getBean("jedisCluster");
jedisCluster.set("name", "zhangsan");
String value = jedisCluster.get("name");
System.out.println(value);
}
}
运行结果:
redis集群查询:
118.***.***.***:8001> get name
-> Redirected to slot [5798] located at 118.***.***.***:8001
"zhangsan"
如果有写的不对的地方,请大家多多批评指正,非常感谢!