一個Redis配置文件redis.conf上的小問題:JedisDataException

問題來源

昨天因爲電腦上的VMware不小心升級版本後,虛擬機莫名其妙運行不起來了,折騰了一晚上沒搞定,索性重裝了VMware和ubuntu虛擬機,自然的,原來安裝在虛擬機上的一切服務都沒有了。
在安裝完Redis後,發現之前本地windows主機連接虛擬機Redis的Jedis測試代碼連不上了,於是乎開始解決問題,其實第一次安裝的時候就遇到過,不過太久遠忘記了,這次正好記錄下來,省的下次還要百度解決。

先是Connection refused: connect

redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
    at redis.clients.jedis.Connection.connect(Connection.java:134)
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:69)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:79)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:75)
    at redis.clients.jedis.BinaryClient.auth(BinaryClient.java:499)
    at redis.clients.jedis.Jedis.auth(Jedis.java:1963)
    at com.lhx.redis.JedisTest.setup(JedisTest.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
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:339)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:579)
    at redis.clients.jedis.Connection.connect(Connection.java:129)
    ... 34 more

這個問題算是迅速反應過來了,第一反應就是查看redis默認監聽的6379端口下的進程。
netstat -anp|grep 6379

lhx@ubuntu:/usr/local/redis/bin$ netstat -anp|grep 6379
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      792/redis-server *:
tcp        0      0 127.0.0.1:52752         127.0.0.1:6379          TIME_WAIT   -               
tcp6       0      0 :::6379                 :::*                    LISTEN      792/redis-server *:

可以看到只有127.0.0.1,說明配置文件redis.conf默認綁定了本地ip,該配置會導致,其他ip登錄被拒絕,比如我的ubuntu虛擬機的ip地址192.168.241.128。

所以我們把綁定ip的語句註釋掉,打開redis文件夾下的redis.conf,註釋掉下圖中紅框代碼即可。
這裏寫圖片描述

修改完redis.conf,重啓redis服務,再次運行Jedis連接的測試代碼,遇到了第二個問題。

JedisDataException

Junit的報錯信息發生了變化,如下圖所示:
這裏寫圖片描述

連接失敗的錯誤是解決了,這個問題又是指什麼呢?

看報錯信息,我們不難發現,這個錯誤大概是說Redis目前在保護模式下運行,不允許非本地客戶端鏈接,我們可以通過給Redis設置訪問密碼來讓非本地客戶端去訪問它,然後客戶端鏈接的時候,設置Jedis密碼Auth就可以解決了。

設置服務端訪問密碼

127.0.0.1:6379> config set requirepass lhxaiee123
OK
127.0.0.1:6379> auth lhxaiee123
OK
127.0.0.1:6379> 

Jedis通過密碼訪問

@Before
public void setup() {
     //連接redis服務器,192.168.0.100:6379
     jedis = new Jedis("192.168.241.128", 6379);
     //權限認證
     jedis.auth("lhxaiee123");  
 }

記得以後每次通過SecureCRT連接Redis時要先輸入訪問密碼咯。

127.0.0.1:6379> auth lhxaiee123

至此,windows本機代碼對ubuntu虛擬機Redis的訪問恢復如初。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章