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, да.
Если вы ограничены в памяти, вам лучше обслужить дисковое хранилище.