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

сначала контекст, im пытается использовать Redis в качестве хранилища в памяти, поддерживаемого с сохранением. Мне нужно хранить большое количество объектов (миллионы) в хэше Redis.

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

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

найти ниже объекта im пытается сохранить

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 (Im с помощью 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.

точно.

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

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

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

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

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