点击上方蓝字进行关注的都是靓仔和仙女

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

本文描述一种可行的方案,适用于客户端使用了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的依赖:

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.8.3</version>

<scope>system</scope>

<systemPath>${project.basedir}/../libs/jedis-2.8.3.jar</systemPath> <!-- 此处的systemPath是jedis-2.8.3所在的相对路径 -->

</dependency>

<dependency>

<groupId>org.apache.commons</groupId>

<artifactId>commons-pool2</artifactId>

<version>2.4.2</version>

</dependency>

<!--

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.8.1</version>

</dependency>

-->

因为把定制jedis通过本地jar包的形式提供,maven不会自动加载jedis的依赖,所以需额外添加对commons-pool2的依赖。

3.如果使用了低版本的jedis

老版本jedis的returnBrokenResource和returnResource这两个方法在新版本jedis中已经废弃,如果升级jedis版本的话,需要替换为close方法。

替换前:

try {

// ...

} catch (JedisException e) {

// ...

pool.returnBrokenResource(jedis);

}

finally {

pool.returnResource(jedis);

}

替换后:

try {

// ...

} catch (JedisException e) {

// ...

}

finally {

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,方便今后升级。

<dependency>

<groupId>redis.clients</groupId>

<artifactId>jedis</artifactId>

<version>2.8.1</version>

</dependency>

好了

Redis的密码认证就说到这里

除此之外

部落还将给大家分享另外的一个课题

spring AOP开发踩坑记  别让你的注解失效了

这个课题将会在

今晚 8:30

腾讯课堂

动脑学院的

Java高级免费试听课中

Lison大神 给大家讲解

你只需要今晚准点

点击最下角 阅读原文

即可立刻观看学习

推荐阅读

高并发与分布式系统的基石--数据库读写分离实战

这就是学编程的下场...

论程序员与产品经理是怎么互掐起来的

如何假装成为一名好的程序员

来自部落的邀请

Java框架 Spring 核心机制

至程序员的情书

Java高级部落送你ofo小黄车60天免费骑行,还不来?

Facebook研发的Cassandra你用过吗?

给 Java开发者的10个大数据工具和框架

推荐程序员必备微信号 

Java高级部落

微信号:javagaojibuluo


在部落里,将会分享程序员相关的的技术,职场生活,行业热点资讯....以及更多好玩的IT趣文和趣图都在此部落中.....这....只属于我们程序猿.....
 ▼长按下方↓↓↓二维码识别关注

推荐学习资料获取微信号 

长按下方二维码识别关注

动态添加 Redis 密码认证相关推荐

  1. Python学习——redis密码认证

    我们安装完Redis之后,在终端中输入redis-cli 直接进入redis数据库,redis默认是不需要密码认证的,只要连接的redis服务器的host和port(默认6379)正确,就可以连接使用 ...

  2. EMQX服务器搭建系列五:EMQX服务器动态添加用户名密码

    Username管理 CLI命令 启动emqx_auth_username插件后,可以使用CLI命令管理username root@VM-0-12-ubuntu:/home/ubuntu# emqx_ ...

  3. Redis添加密码认证Cacti监控读取Redis状态值为 -1 的最快速解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 通过分析ss_get_by_ssh.php脚本,函数redis_get()的用途就是通过打开Redis服务的socket连接, ...

  4. Redis添加密码认证Cacti监控读取Redis状态值为-1的最快速解决方案

    通过分析ss_get_by_ssh.php脚本,函数redis_get()的用途就是通过打开Redis服务的socket连接,发送"INFO\r\n"命令,而后读取返回的数据从而获 ...

  5. Redis使用认证密码登录

    Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用. 这在安全性上会有一定的问题,所以需要启用Redis的密码认证功能,增加Redis服务 ...

  6. 转:Redis使用认证密码登录

    Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用.这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安 ...

  7. Linux中Redis使用认证密码登录

    Redis默认配置是不需要密码认证的,也就是说只要连接的Redis服务器的host和port正确,就可以连接使用.这在安全性上会有一定的问题,所以需要启用Redis的认证密码,增加Redis服务器的安 ...

  8. redis三主三从部署集群以及动态添加节点和删除节点

    redis安装过程: redis6.2.6安装与学习_wtl1992的博客-CSDN博客_redis6安装1.redis在Linux上的安装github地址:Releases · redis/redi ...

  9. 用友U8配置动态密码认证

    一.安装动态密码认证服务器 二.配置用友ERP-U8 步骤1:在U8 服务器端安装DKEY AGENT FOR UFIDA_U8,一键安装. 步骤2:配置认证服务器信息 步骤3:为这些账户选择&quo ...

最新文章

  1. 案例 | 蓝天智通:智办事助力“智慧校园”数智化管理,提升人效
  2. 我专严新闻小偷之心得与大家交流
  3. 关于C++对象模型的一点理解(2)
  4. PHP的表单获取与HHTP请求方式
  5. php mysqli报错,php安装扩展mysqli的实现步骤及报错解决办法
  6. python-55: 验证码的生成机制
  7. 通过实例学习编写需求文档 【转】
  8. Qt5中this application has requested the runtime to terminate it in an unusual way 无法运行问题的解决
  9. 什么叫做石英表_什么是石英表?石英表与机械表的区别
  10. 随想·手中没有红玫瑰
  11. Linux 下查询 DNS 服务器信息
  12. 微信公众号二维码不同环境差异化处理
  13. linux下部署项目,下载文件时,中文文件名乱码问题
  14. 如何制作并使用python发布的模块压缩包和whl包,并进行pip安装和使用教程,加上传Pypi,上传之后又如何增删whl项目
  15. 用Python绘制皮卡丘
  16. 九月总结:快速成长的一个月
  17. flink-streaming-platform-web 源码解读
  18. Maven | 05.Maven项目结构及Maven命令
  19. 775 v8++ 参数
  20. 《Ceph源码分析》——导读

热门文章

  1. 苹果报告问题_郭明錤:入门款iPhone 12的相机镜头供应商遇到质量问题,但不会影响新品的发布时间...
  2. MySQL 使用sql添加和创建用户
  3. idea 全文搜索出内容之后一按回车没了,再怎么搜也搜不出来了
  4. 如何知道特征的重要性
  5. 使用C++ OpenCV实现椭圆区域检测与Aruco码的生成与检测并估计位姿
  6. 大连理工计算机科学与技术学院,本科生教育
  7. mysql 夸机房_Mysql跨机房同步方案
  8. JAVA——为新员工分配部门
  9. error: ‘CLOCK_MONOTONIC‘ undeclared (first use in this function)
  10. 微信团队的智能客服功能又出新功能了?