1. ホーム
  2. redis

javaで初めてredisに接続する際の問題点

2022-02-23 18:45:04

1. javaでredisに接続すると、以下のエラーが発生し、接続がタイムアウトします。

スレッドで例外発生 "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException.JedisConnectionException: ソフトウェアが原因で接続が中断されました:recvに失敗しました
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
at redis.clients.jedis.Protocol.process(Protocol.java:151)
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 com.hy.redis_maven.App.main(App.java:17)
原因:java.net.SocketException: ソフトウェアが原因で接続が中断されました: Recv に失敗しました
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:196)
... 7件以上

この問題の原因は、redis.conf ファイルに 127.0.0.1 というバインドがあるため、redis がローカルマシンのみをマッピングしてしまうことです。

解決策は、以下のようにbind 127.0.0.1:をコメントアウトすることです。



2. 2.redisに接続する際に発生した2つ目の問題は、パスワードが設定されていないのに認証が送信され、以下のようなエラーが発生することです。

スレッド "main" redis.clients.jedis.exceptions.JedisDataException で例外が発生しました。DENIED Redis は保護モードが有効で、バインドアドレスが指定されておらず、クライアントに認証パスワードが要求されていないため、保護モードで動作しています。外部のコンピュータからRedisに接続したい場合は、以下のいずれかの解決策を採用することができます。1) ループバックインターフェースから「CONFIG SET protected-mode no」コマンドを送信してプロテクトモードを無効にし、サーバーと同じホストからRedisに接続する。2) あるいは、サーバが動作しているのと同じホストから Redis に接続し、ループバックインタフェースから 'CONFIG SET protected-mode no' コマンドを送信して、保護モードを無効にすることもできますが、その場合は Redis がインターネットから一般にアクセスできないことを確認してください。4) バインドアドレスまたは認証パスワードを設定する。注:サーバーが外部からの接続を受け付け始めるためには、上記のうちの1つだけを行う必要があります。
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 com.hy.redis_maven.App.main(App.java:17)



おそらくこれは、パスワードは設定されていないが、パスワード認証は送信されるという意味だと思われる

解決策:redis.confファイルでrequirepass passwordを設定し、コメントを削除して、以下のようにします。


ウォームアップ後にredisサーバーを起動する際に、設定ファイル

src/redis-server redis.conf

これでパスワード認証の問題は解決し、クライアントコードは以下のようになります。

public class App { <未定義
public static void main(String[] args) { { <未定義
<スパン Jedis jedis = new Jedis("192.168.190.120", 6379)を使用します。
jedis.auth("zhoupengyong") を使用します。
jedis.set("name", "zhoupengyong") を実行します。
<スパン System.out.println(jedis.get("name")));
}
}