Redis:我可以存储的密钥数量是否有限制?

Aru*_*lly 7 redis jedis

首先是上下文,我试图将Redis用作支持持久性的内存存储.我需要在Redis Hash中存储大量对象(数百万).

同时,我不希望我的redis实例占用太多内存.所以我将redis.conf中的maxmemory属性设置为100mb.我将maxmemory-policy设置为allkeys-random持久模式是AOF,fysnc是每秒.

现在面临的问题是,每当我尝试在哈希中存储超过二十万个对象时,哈希就会被重置(即哈希中的所有现有键值都会消失).我通过在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;
}
}
Run Code Online (Sandbox Code Playgroud)

另外,在下面找到存储到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);
    }
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

这是否意味着一旦达到maxmemory,redis就不会换出磁盘(它是否试图将所有键值保存在内存中?)这是否意味着我必须根据数量的增加逐步增加maxmemory限制我可能要存储的键值对?

Did*_*zia 8

我错过了什么吗?

是.Redis是一个纯粹的内存存储,具有持久性选项.一切都必须适合记忆.

这是否意味着一旦达到maxmemory,redis就不会换出磁盘.

正是.

它是否试图将所有关键值保存在内存中?

键和值,是的.

这是否意味着我必须根据我可能必须存储的键值对数量的增加来逐步增加maxmemory限制?

您需要预先确定为Redis分配多少内存,是的.

如果您受内存限制,使用基于磁盘的存储将更好地为您提供服务.

  • 它不是一个可扩展性问题,它是一种刻意选择,只支持内存数据库,以实现最佳性能.磁盘I/O太慢了.如果您有足够的内存,Redis可以用作主数据存储.如果您的数据量不适合内存,您可能需要查看MongoDB或Couchbase等解决方案.但不要指望同样的原始性能...... (5认同)