由于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
在内部,Redis以最有效的方式存储字符串。将整数强制为基数10的字符串实际上会占用更多的内存。
这是Redis存储字符串的方式-
在您引用的示例中,对于字符串的长v / s 21字节,其问题是8字节。
编辑:
因此,如果我的一组数字都小于10,000,Redis如何存储我的数字集?
这取决于您拥有多少个元素。
如果集合中的元素少于512个(请参阅set-max-intset- entries参考资料),则该集合将被存储为一个IntSet。IntSet是有序整数数组的专有名称。由于您的数字小于10000,因此每个元素将使用16位。它(几乎)和C数组一样具有高效的内存。
set-max-intset- entries
如果您有512个以上的元素,则该集合将成为HashTable。集合中的每个元素都包装在称为的结构中robj,该结构的开销为16个字节。该robj结构具有一个指向整数共享池的指针,因此您无需为整数本身支付任何额外费用。最后,robj实例存储在哈希表中,哈希表的开销与集合的大小成比例。
robj
如果您对元素消耗多少内存感兴趣,请在数据集上运行redis-rdb- tools(免责声明:我是该工具的作者)。或者,您可以阅读MemoryCallback类的源代码,这些注释说明了内存的布局方式。