动态添加Redis密码认证的方法

如果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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • redis配置认证密码的方法

    1.通过配置文件进行配置 yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到 #requirepass foobared 去掉行前的注释,并修改密码为所需的密码,保存文件 requirepass myRedis 重启redis sudo service redis restart #或者 sudo service redis stop sudo redis-server /etc/redis.conf 这个时候尝试登录redis,发现可以登上,但是执行具体

  • redis密码设置、访问权限控制等安全设置

    redis作为一个高速数据库,在互联网上,必须有对应的安全机制来进行保护. 1.比较安全的办法是采用绑定IP的方式来进行控制. 复制代码 代码如下: bind 127.0.0.1 表示仅仅允许通过127.0.0.1这个ip地址进行访问.那么其实只有自己才能访问自己了,其他机器都无法访问他. 这段命令要去redis.conf里修改. 这里请注意 我们常用的启动方式src/redis-server 改为src/redis-server redis.conf 因为它需要加载配置文件. 这个方法有一点不

  • Linux下Redis设置密码及开机自启动

    1.设置Redis.conf中daemonize为yes,确保守护进程开启: 找到#requirepass foorbared这一行,直接替换掉这行,改为requirepass 新密码 2.编写开机自启动脚本 vi /etc/init.d/redis 脚本内容如下: #!/bin/sh #chkconfig: 2345 80 90 # Simple Redis init.d script conceived to work on Linux systems # as it does use of

  • 利用PHP访问带有密码的Redis方法示例

    一.首先设置Redis密码,以提供远程登陆 打开redis.conf配置文件,找到requirepass,然后修改如下: requirepass yourpassword yourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了. 命令如下: redis-cli -h 127.0.0.1 -p 6379//启动redis客户端,并连接服务器 keys * //输出服务器中的所有key 报错如下 (error) ERR operation not permitt

  • 动态添加Redis密码认证的方法

    如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题. 本文描述一种可行的方案,适用于客户端使用了jedis连接池,服务端使用了redis master-slave集群的情况. 1.定制jedis 对redis返回的错误的处理,做两处修改: 忽略 (error) ERR Client sent AUTH, but no password is set.使配置了密码的jedis可以在没有配置密码redis上使用:

  • javascript动态添加删除tabs标签的方法

    本文实例讲述了javascript动态添加删除tabs标签的方法.分享给大家供大家参考.具体实现方法如下: <html> <HEAD> <TITLE>网页对话</TITLE> <LINK href="style.css" type=text/css rel=stylesheet> <script> function $(obj) { var o = typeof(obj)=="object" ?

  • jQuery使用toggleClass方法动态添加删除Class样式的方法

    本文实例讲述了jQuery使用toggleClass方法动态添加删除Class样式的方法.分享给大家供大家参考.具体分析如下: jQuery通过toggleClass方法动态添加删除Class,一次执行相当于addClass,再次执行相当于removeClass,运行下面的代码点击按钮可以看到文本段落字体在蓝色和黑色间切换 <!DOCTYPE html> <html> <head> <script src="js/jquery.min.js"&

  • ASP.NET动态添加用户控件的方法

    本文实例讲述了ASP.NET动态添加用户控件的方法.分享给大家供大家参考.具体实现方法如下: 为了让用户控件能ASP.NET页面实现动态添加,首先写一个接口IGetUCable,这个接口有一个函数,返回对象类型是UserControl. using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; /// <summary> /// Summar

  • asp.net为网页动态添加description描述信息的方法

    本文实例讲述了asp.net为网页动态添加description描述信息的方法.分享给大家供大家参考.具体分析如下: 这段代码可以修改网页的head区的description meta HtmlMeta desc = new HtmlMeta(); desc.Name = "Description"; desc.Content = "描述"; Page.Header.Controls.Add(desc); 希望本文所述对大家的asp.net程序设计有所帮助.

  • php动态添加url查询参数的方法

    本文实例讲述了php动态添加url查询参数的方法.分享给大家供大家参考.具体分析如下: 这段代码可以动态为url添加key-value查询参数,如果参数已经存在则会用新的进行覆盖 function add_querystring_var($url, $key, $value) { $url=preg_replace('/(.*)(?|&)'.$key.'=[^&]+?(&)(.*)/i','$1$2$4',$url.'&'); $url=substr($url,0,-1);

  • jQuery实现动态添加tr到table的方法

    本文实例讲述了jQuery实现动态添加tr到table的方法.分享给大家供大家参考,具体如下: 运行效果图如下: 完整代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" co

  • asp.net在后端动态添加样式表调用的方法

    本文实例讲述了asp.net在后端动态添加样式表调用的方法.分享给大家供大家参考.具体实现方法如下: HtmlLink CssControl = new HtmlLink(); CssControl.Href = url; CssControl.Attributes.Add("rel", "stylesheet"); CssControl.Attributes.Add("type", "text/css"); page.Hea

  • 基于Android在布局中动态添加view的两种方法(总结)

    一.说明 添加视图文件的时候有两种方式:1.通过在xml文件定义layout:2.java代码编写 二.前言说明 1.构造xml文件 2.LayoutInflater 提到addview,首先要了解一下LayoutInflater类.这个类最主要的功能就是实现将xml表述的layout转化为View的功能.为了便于理解,我们可以将它与findViewById()作一比较,二者都是实例化某一对象,不同的是findViewById()是找xml布局文件下的具体widget控件实例化,而LayoutI

  • 原生JS实现动态添加新元素、删除元素方法

    1. 添加新元素 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>动态添加新元素</title> </head> <body> <ul class="example"> <li class="child">Coffee</li> <li c

随机推荐