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

Are*_*esn 9 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
Run Code Online (Sandbox Code Playgroud)

Sri*_*nan 18

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

以下是Redis如何存储Strings -

  1. 小于10000的整数存储在共享内存池中,并且没有任何内存开销.如果您愿意,可以通过更改redis.h中的常量REDIS_SHARED_INTEGERS并重新编译Redis 来增加此限制.
  2. 大于10000且长度范围内的整数消耗8个字节.
  3. 定期取字符串LEN(字符串)+ 4个字节用于长度+ 4个字节为空终止+为malloc的开销8个字节标记自由空间+ 1个字节.

在你引用的例子中,字符串的长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类的源代码,这些注释解释了内存的布局方式.