10

最初のコンテキストは、永続性に裏打ちされたメモリ内ストアとして Redis を使用しようとしています。Redis ハッシュに多数のオブジェクト (数百万) を格納する必要があります。

同時に、redis インスタンスがメモリを消費しすぎないようにします。そこで、redis.conf のmaxmemoryプロパティを 100mb に設定しました。maxmemory-policyallkeys-randomに設定しました。持続モードは AOF で、fysnc は毎秒です。

現在、私が直面している問題は、20 万を超えるオブジェクトをハッシュに格納しようとするたびに、ハッシュがリセットされる (つまり、ハッシュ内の既存のすべてのキー値が消える) ことです。これを確認するには、redis-cli のハッシュに対して hlen コマンドを使用します。

保存しようとしているオブジェクトの下を見つけます

public class Employee implements Serializable {

private static final long serialVersionUID = 1L;
int id;
String name;
String department;
String address;

    /* Getters and Setters */

    /* Hashcode - Generates hashcode (key) for each object */
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((address == null) ? 0 : address.hashCode());
    result = prime * result + ((department == null) ? 0 : department.hashCode());
    result = prime * result + id;
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
}
}

また、redisに保存するコードの下を見つけてください(Jedisを使用してRedisとやり取りしています)

    JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "localhost");
    Jedis jedis = (Jedis) jedisPool.getResource();

    System.out.println("Starting....");
    for(int i=0;i<1000000;i++) {

             /* Converting object to byte array */
        Employee employee = new Employee(i, "Arun Jolly", "IT", "SomeCompany");
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
        objectOutputStream.writeObject(employee);
        byte[] value = byteArrayOutputStream.toByteArray();

        /* Creating key in byte array format using hashCode() */
        ByteBuffer buffer = ByteBuffer.allocate(128);
        buffer.putInt(employee.hashCode());
        byte[] field = buffer.array();

            /* Specyfying the Redis Hash in byte array format */ 
        String tableName = "Employee_Details";
        byte[] key = tableName.getBytes();

        jedis.hset(key, field, value);
        System.out.println("Stored Employee "+i);
    }

何か足りないのですか?

これは、最大メモリに達すると redis がディスクにスワップアウトしないことを意味しますか (メモリ内のすべてのキー値を保持しようとしていますか?) 数値の増加に応じて最大メモリ制限を段階的に増やす必要があることを意味しますか?私が保存しなければならないかもしれないキーと値のペアの?

4

1 に答える 1