2016-10-03 7 views
0

Redisに100万(1,000,000)を追加すると問題ありません。
200万(2,000,000)レコードを追加するとエラーConnection reset by peer: socket write errorが表示されます。 1要素(4294967295、リストあたりの要素より40億) -Jedis lpushがRedisに100万レコード追加 - ピアによる接続リセット:ソケット書き込みエラー

Redis data types listによれば、リストの

最大長は2 です。

/*Creating the json list*/ 
Gson gson = new GsonBuilder().create(); 
List<String> employeeList = new ArrayList<String>(); 
for (int i = 1; i <= 2000000; i++) { 
    Employee employee = new Employee(i + "", "Jhon", "My Country", "[email protected]", "+777 92157325"); 
    String json = gson.toJson(employee); 
    employeeList.add(json); 
} 

/*add json list to Redis*/ 
Jedis jedis = pool.getResource(); 
// employeeList size is = 2,000,000 
String[] jsonArray = employeeList.toArray(new String[employeeList.size()]); 
jedis.lpush("employee_list_1", jsonArray); 

ログイン

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Connection reset by peer: socket write error 
    at redis.clients.jedis.Protocol.sendCommand(Protocol.java:83) 
    at redis.clients.jedis.Protocol.sendCommand(Protocol.java:63) 
    at redis.clients.jedis.Connection.sendCommand(Connection.java:84) 
    at redis.clients.jedis.BinaryClient.lpush(BinaryClient.java:281) 
    at redis.clients.jedis.Client.lpush(Client.java:205) 
    at redis.clients.jedis.Jedis.lpush(Jedis.java:869) 
    at com.mutu.redis.AddJosn.add(AddJosn.java:29) 
    at com.mutu.redis.AddJosn.main(AddJosn.java:48) 
Caused by: java.net.SocketException: Connection reset by peer: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 
    at redis.clients.util.RedisOutputStream.flushBuffer(RedisOutputStream.java:31) 
    at redis.clients.util.RedisOutputStream.write(RedisOutputStream.java:54) 
    at redis.clients.util.RedisOutputStream.write(RedisOutputStream.java:44) 
    at redis.clients.jedis.Protocol.sendCommand(Protocol.java:79) 
    ... 7 more 

どのように単一のトランザクション/処理で2万件の以上のレコードを追加するには?

+0

これは、レディスにプッシュされているオブジェクトのサイズによって生成される、より低レベルの問題のように見えます。それはjedisの実装に依存します。リスト内の小さなオブジェクトでテストできますか? – Pixou

答えて

0

ピアによる接続リセットは、RedisがJedisインスタンスの基礎となるソケット接続を切断することを意味します。 Redisログで、どの警告/エラーメッセージがログに記録されているかを確認してください。

Btw、配列付きのlpushが1つのコマンドに送られるので、リクエストボディは本当に大きくなるはずです。私はあなたがテスト目的のためだけにこれをやっていると思いますが、私はあなたがマルチエグゼクティブを使用し、たくさんのリクエストに膨大な配列でリクエストを分割する必要があることをお勧めします。これは依然として原子性を保証します。

アトミック性が必要ない場合は、パイプラインを使用してリクエストを分割できます。

関連する問題