Redis: Есть ли ограничение на количество ключей, которые я могу хранить?

Во-первых, я пытаюсь использовать Redis как хранилище в памяти с постоянным сохранением. Мне нужно хранить большое количество объектов (миллионов) в Redis Hash.

В то же время я не хочу, чтобы мой экземпляр Redis занимал слишком много памяти. Поэтому я установил свойство maxmemory в redis.conf равным 100 МБ. Я установил maxmemory-policy как allkeys-random. Режим сохранения - AOF, а fysnc - каждую секунду.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я пытаюсь сохранить более двухсот тысяч объектов в хэше, хэш сбрасывается (т. Е. Все существующие значения ключа в хэше исчезают). Я подтверждаю это, используя команду hlen для хэша в redis-cli.

Найти под объектом, который я пытаюсь сохранить

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 не выгружается на диск после того, как maxmemory достигнута (пытается ли он сохранить все ключевые значения в памяти?) Означает ли это, что мне нужно постепенно увеличивать предел maxmemory в соответствии с увеличением числа пар ключ-значение, которые мне, возможно, придется хранить?

1 ответ

Решение

Я что-то пропустил?

Да. Redis - это чисто хранилище в памяти с возможностью сохранения. Все должно уместиться в памяти.

Означает ли это, что Redis не выгрузится на диск после достижения максимальной памяти.

Точно.

Он пытается сохранить все ключевые значения в памяти?

Ключи и значения, да.

Означает ли это, что я должен постепенно увеличивать предел maxmemory в соответствии с увеличением количества пар ключ-значение, которые мне, возможно, придется хранить?

Вы должны заранее решить, сколько памяти вы выделяете для Redis, да.

Если вы ограничены в памяти, вам лучше обслужить дисковое хранилище.

Другие вопросы по тегам