redis4.0 集群,jedis顾客端连接配置

如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题。

使用jedis 2.9.0连接,异常信息:

1.第一种方式
(当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,)

本文描述一种可行的方案,适用于客户端使用了jedis连接池,服务端使用了redis
master-slave集群的情况。

redis.clients.jedis.exceptions.JedisDataException:
ERR Client sent AUTH, but no password is set。

(1)首先进入redis,如果没有开启redis则需要先开启:
[root@iZ94jzcra1hZ bin]# redis-cli -p 6379
127.0.0.1:6379> 
(2)查看当前redis有没有设置密码:
127.0.0.1:6379> config get requirepass
1) “requirepass”
2) “”
(3)为以上显示说明没有密码,那么现在来设置密码:
127.0.0.1:6379> config set requirepass abcdefg
OK
127.0.0.1:6379> 
(4)再次查看当前redis就提示需要密码:
127.0.0.1:6379> config get requirepass
(error) NOAUTH Authentication required.
127.0.0.1:6379>

1.定制jedis

说我没有设置密码,当时我就震惊了。我明明设置了密码呀。我用redis-cli连接的时候
还让我输入密码了呢~

2.第二种方式
(永久方式)
需要永久配置密码的话就去redis.conf的配置文件中找到requirepass这个参数,如下配置:

对redis返回的错误的处理,做两处修改:

检查了好久才想起来,redis-cli默认连接6379,我只给6379设置密码了,实际上要给每个节点都设置密码:

修改redis.conf配置文件  

忽略 (error) ERR Client sent AUTH, but no password is
set。使配置了密码的jedis可以在没有配置密码redis上使用;

config set masterauth abc  
config set requirepass abc  

# requirepass foobared
requirepass 123   指定密码123

发生(error) NOAUTH Authentication
required时,将当前connection置为broken,从而将连接踢出连接池。这样动态给redis添加上密码时,jedis会自动重新创建可用连接。

 

保存后重启redis就可以了

我已经对jedis 2.8.x版本做好了以上修改。可以直接下载使用
。如果使用了更高的版本jedis,可以参考我的代码自行修改;如果使用了更低版本的,建议升级到2.8.x。

spring配置,jedis连接集群,竟然没有RedisCluster一个构造函数的参数只由
Set<HostAndPort>和password组成,害得我还要配置这么多参数。

 

2.在项目代码中使用定制的jedis

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       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-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">

    <context:property-placeholder location="classpath:conf/redis.properties"/>



    <!--cluster版本-->
    <bean class="redis.clients.jedis.JedisCluster" id="jedisClusterOrginal">
        <constructor-arg name="jedisClusterNode">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="${IP}"/>
                    <constructor-arg index="1" value="6379"/>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="${IP}"/>
                    <constructor-arg index="1" value="6380"/>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="${IP}"/>
                    <constructor-arg index="1" value="6381"/>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="${IP}"/>
                    <constructor-arg index="1" value="6382"/>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="${IP}"/>
                    <constructor-arg index="1" value="6383"/>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="${IP}"/>
                    <constructor-arg index="1" value="6384"/>
                </bean>
            </set>
        </constructor-arg>
        <constructor-arg name="connectionTimeout" value="10000"></constructor-arg>
        <constructor-arg name="soTimeout" value="10000"></constructor-arg>
        <constructor-arg name="maxAttempts" value="100"></constructor-arg>
        <constructor-arg name="password" value="${pwd}"></constructor-arg>
        <constructor-arg name="poolConfig" ref="jedisPoolConfig">
        </constructor-arg>
    </bean>

  <bean id="jedisPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
    <!--<property name="maxIdle" value="8"></property>-->
    <!--<property name="maxTotal" value="8"></property>-->
    <!--<property name="minIdle" value="0"></property>-->
  </bean>

<bean class="com.s2s.common.jedis.JedisClientCluster" id="jedisCluster"> <property name="jedisCluster" ref="jedisClusterOrginal"></property> </bean> </beans>

连接redis

修改maven配置。将原来的jedis依赖注释掉,添加对本地的定制jedis的依赖:

 

1.redis-cli连接redis

dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version2.8.3/version scopesystem/scope systemPath${project.basedir}/../libs/jedis-2.8.3.jar/systemPath !-- 此处的systemPath是jedis-2.8.3所在的相对路径 --/dependencydependency groupIdorg.apache.commons/groupId artifactIdcommons-pool2/artifactId version2.4.2/version/dependency!--dependency groupIdredis.clients/groupId artifactIdjedis/artifactId version2.8.1/version/dependency--

[root@iZ2ze3zda3caeyx6pn7c5zZ bin]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth
123        //指定密码
OK
127.0.0.1:6379> keys *
1) “a”
2) “cit”
3) “clist”
4) “1”
127.0.0.1:6379>