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