1. 程式人生 > >使用Java遠端連線操作Redis

使用Java遠端連線操作Redis

前言:

Redis是目前十分流行的key-value型別儲存系統,因為其高效的效能,主從同步的架構,豐富的儲存方式以及極其簡便的操作備受開發者青睞的一款工具。為了保證效率,資料都是快取在記憶體中,redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。Redis同時提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。

上一篇文章中我們中我們在Linux機器上安裝了Redis的server端,在本篇文章中我們將在Windows開發環境中使用java作為Client端遠端連線

並操作Redis。

準備:

1.已裝好Redis的Linux伺服器(Redis 3.2.6)
2.Jedis-2.9.0.jar(java-client端有很多,這裡我們推薦官方的Jedis,2.9.0是最新版)
3.Eclipse開發環境(可以自己選擇,不多做說明)

測試:

1.首先在server端啟動redis,啟動命令是:(詳情請看安裝篇)
./redis-server redis.conf
2.java建立project,因為jedis包是jdk 1.7編譯的,請使用1.7或以上版本的jre環境
測試程式碼如下

import redis.clients.jedis.Jedis;
public
class Test { public static void main(String[] args) { // TODO Auto-generated method stub init(); } public static void init(){ Jedis jedis = new Jedis("192.168.201.142"); jedis.set("myredis","ok"); System.out.println(jedis.get("myredis")); } }

若是成功的話,控制檯會輸出ok的結果,若是報錯,請看下面依照實際情況處理。

異常:

1.connection refused:connect的異常

報錯資訊如下:

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
    at redis.clients.jedis.Connection.connect(Connection.java:207)
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:126)
    at redis.clients.jedis.BinaryClient.set(BinaryClient.java:110)
    at redis.clients.jedis.Client.set(Client.java:47)
    at redis.clients.jedis.Jedis.set(Jedis.java:120)
    at roy.redis.test.Test.init(Test.java:13)
    at roy.redis.test.Test.main(Test.java:8)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at redis.clients.jedis.Connection.connect(Connection.java:184)
    ... 7 more

這可能是兩個原因造成的,首先可能是redis的6379埠無法訪問,清先在cmd中輸入命令
telnet 192.168.201.142 6379
看看可不可以訪問redis-server機器的6379埠,如果不能訪問,需要在遠端機器關掉防火牆或者新增允許通過
1)使用root使用者登入,vi /etc/sysconfig/iptables,新增如圖所以一行
這裡寫圖片描述
2)輸入命令service iptables restart重啟防火牆

或者可以直接root使用者使用命令service iptables stop關閉防火牆。

防火牆檢查完後,如果還是出現上述問題,說明redis還有地方需要配置,redis預設是隻有本機可以訪問的,想要遠端訪問需要修改redis.conf配置檔案。
進入redis.conf目錄,並使用vi命令開啟,找到bind那行修改後,wq儲存退出,重啟redis-server。
這裡寫圖片描述

bind 後加的是允許訪問的ip
bind 127.0.0.1代表只有本機可以訪問,可以將允許訪問的ip加入,也可以直接註釋掉這一行,這樣所有機器都可以訪問。

2.DENIED Redis is running in protected mode

報錯資訊如下:

Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 
1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 
2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 
3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
    at redis.clients.jedis.Protocol.processError(Protocol.java:127)
    at redis.clients.jedis.Protocol.process(Protocol.java:161)
    at redis.clients.jedis.Protocol.read(Protocol.java:215)
    at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
    at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239)
    at redis.clients.jedis.Jedis.set(Jedis.java:121)
    at roy.redis.test.Test.init(Test.java:13)
    at roy.redis.test.Test.main(Test.java:8)

報錯資訊很長,但是主要是說redis開啟了protected mode,這也是Redis3.2加入的新特性,開啟保護模式的redis只允許本機登入,同樣設定在配置檔案redis.conf中,如圖
這裡寫圖片描述
這裡原來是yes代表開啟了保護模式,後面可以填密碼也可以填no代表關閉,我們這裡選擇關閉保護模式,wq儲存退出後再重啟redis-server

此時應該就可以成功操作了,謝謝觀看本文,希望能幫到你。