1. 程式人生 > >動態新增 Redis 密碼認證

動態新增 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>

gzxRoWYiaQwMqd05jr6XibEbtAiazAZxTsuJs2MuU1xhOMsfG9sxnMKe53RjaduHycsQ1zSibn2y5kyFkSTtrmOXaA

好了

Redis的密碼認證就說到這裡

DZ5OKsovm0t6llnoAn0mcTBh2HzBFWar3Jy6Pqr4cWPcMxvnib8uwGicl2wkycgic3frHzWyuDibDMJaW20oMCGlzw

除此之外

部落還將給大家分享另外一個關於redis的課題

 《走向Redis底層實現:手把手帶你寫一個Redis客戶端》

這個課題將會在

今晚 8:30

騰訊課堂

動腦學院的

Java高階免費試聽課中

Tony大神 給大家講解

你只需要今晚準點

點選最下角 閱讀原文

即可立刻觀看學習

推薦閱讀

推薦程式設計師必備微訊號 

Java高階部落

微訊號:javagaojibuluo
在部落裡,將會分享程式設計師相關的的技術,職場生活,行業熱點資訊....以及更多好玩的IT趣文和趣圖都在此部落中.....這....只屬於我們程式猿..... ▼長按下方↓↓↓二維碼識別關注

DZ5OKsovm0srRNgT4VPYJ2FWuHvujFnXxia6nboPahRFFHH0QzkSdBWXatQkd2MyJvNQ0DLnPr7P2SKmuVibC8dg


推薦學習資料獲取微訊號 

長按下方二維碼識別關注

?