在Redis中存储32位有符号整数的内存有效方法

时间:2013-04-22 00:59:40

标签: redis

由于Redis尝试将字符串解析为64位有符号整数,因此最好存储32位有符号整数的二进制表示而不是基数为10的整数字符串吗?

在我们的系统中,我们列出了许多32位有符号整数ID。

I can store them like
lpush mykey 102450  --> redis cast 102450 to 8 bytes long

or store it like 
lpush mykey  \x00\x01\x19\x32  ---> this is just 4 bytes

2 个答案:

答案 0 :(得分:18)

在内部,Redis以最有效的方式存储字符串。将整数强制为基数10个字符串实际上会占用更多内存。

以下是Redis如何存储字符串 -

  1. 小于10000的整数存储在共享内存池中,并且没有任何内存开销。如果您愿意,可以通过更改常量REDIS_SHARED_INTEGERS in redis.h并重新编译Redis来增加此限制。
  2. 大于10000且长度范围内的整数消耗8个字节。
  3. 常规字符串采用len(字符串)+ 4字节表示长度+ 4字节表示空闲空间+ 1字节表示空终结符+ 8字节表示malloc开销。
  4. 在你引用的例子中,字符串的长v / s 21字节是一个8字节的问题。

    编辑:

      
        

    因此,如果我有一组数字都小于10,000,Redis如何存储我的设置?

      

    这取决于你有多少元素。

    如果集合中的元素少于512(请参阅set-max-intset-entries),则该集将存储为IntSet。 IntSet是Sorted Integer Array的美化名称。由于您的数字小于10000,因此每个元素使用16位。它(几乎)与C数组一样具有内存效率。

    如果您有超过512个元素,则该集合将变为HashTable。集合中的每个元素都包含在一个名为robj的结构中,该结构的开销为16字节。 robj结构有一个指向共享整数池的指针,因此您不需要为整数本身支付任何额外费用。最后,robj实例存储在哈希表中,哈希表的开销与集合的大小成比例。

    如果您对元素消耗的内存感兴趣,请在数据集上运行redis-rdb-tools。或者您可以阅读类MemoryCallback的源代码,这些注释解释了内存的布局方式。

答案 1 :(得分:1)

字符串以长度存储,因此数据库中不会只有4个字节 - 它可能存储为4字节数据+ 4字节长度+填充,因此您无法获得任何内容。