JAVA项目集成redis集群

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/suchenbin/article/details/99317868

一、环境搭建

我这里直接使用搭建集群后的环境,【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"

如果有写的不对的地方,请大家多多批评指正,非常感谢!

猜你喜欢

转载自blog.csdn.net/suchenbin/article/details/99317868