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

时间:2013-07-23 09:05:01

标签: 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;
}
}

另外,在下面找到存储到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);
    }

我错过了什么吗?

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

1 个答案:

答案 0 :(得分:8)

  
    

我错过了什么吗?

  

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

  
    

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

  

正。

  
    

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

  

键和值,是的。

  
    

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

  

您需要预先决定分配给Redis的内存量,是的。

如果您受内存限制,最好使用基于磁盘的商店。