本文描述一种可行的方案,适用于客户端利用了jedis连接池,做事端利用了redis master-slave集群的情形。
1.定制jedis
对redis返回的缺点的处理,做两处修正:

忽略 (error) ERR Client sent AUTH, but no password is set。使配置了密码的jedis可以在没有配置密码redis上利用;
发生(error) NOAUTH Authentication required时,将当前connection置为broken,从而将连接踢出连接池。这样动态给redis添加上密码时,jedis会自动重新创建可用连接。
我已经对jedis 2.8.x版本做好了以上修正。可以直接下载利用 。如果利用了更高的版本jedis,可以参考我的代码自行修正;如果利用了更低版本的,建议升级到2.8.x。
2.在项目代码中利用定制的jedis
修正maven配置。将原来的jedis依赖注释掉,添加对本地的定制jedis的依赖:
由于把定制jedis通过本地jar包的形式供应,maven不会自动加载jedis的依赖,以是需额外添加对commons-pool2的依赖。
3.如果利用了低版本的jedis
老版本jedis的returnBrokenResource和returnResource这两个方法在新版本jedis中已经废弃,如果升级jedis版本的话,须要更换为close方法。
更换前:
更换后:
4.将利用定制jedis的项目代码上线
此时redis尚未添加密码,但定制jedis忽略了“ERR Client sent AUTH, but no password is set”,以是线上运行正常。
5.给redis server添加密码认证
动态添加密码会导致redis主从同步断开,为避免引起全量同步对业务造成较大影响。须要dba先调大redis master的client-output-buffer-limit和repl-backlog-size参数,再做配置密码操作。
给redis server添加密码的同时,不雅观察业务代码的log,添加完密码后,log中会涌现数次如下报错,随后规复正常。报错次数是添加密码时,业务做事器的jedis连接池中与该redis server之间连接数量。
redis.clients.jedis.exceptions.JedisConnectionException: NOAUTH Authentication required.
如果利用了shardedJedis,请逐个分片进行操作,最小化对业务做事的影响。
6.改换jedis为官方版本
定制jedis便是为了动态添加密码认证。添加完毕后,换回官方jedis,方便今后升级。