由于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的尝试解析字符串为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的存储字符串 -
在这个例子中你引用,它的8个字节的问题很长一段V / S 21个的字符串字节。
编辑:
所以,如果我有一组数字都超过10000如何Redis的存储我的一套少?
这取决于你有多少元素都有。
如果你有你的一套小于512元(见set-max-intset-entries
),那么将被存储为INTSET。 一个INTSET是一个有序整数数组一个荣耀的名字。 由于您的号码是小于10000,它会使用每个元素16位。 它是(几乎)作为存储器高效为C数组。
如果你有超过512点的元素,集合成为一个哈希表。 组中的每个元件被包裹在称为结构robj
,其具有16个字节的开销。 该robj
结构有一个指针指向整数的共享池,让您不支付任何额外的整数本身。 最后, robj
实例存储在哈希表和哈希表有一个开销成正比集的大小。
如果你有兴趣的元素究竟有多大的内存占用,运行Redis的-RDB的工具,在你的数据集。 或者你也可以阅读类的源代码MemoryCallback ,注释说明内存的布局方式。
字符串存储与长度,所以它不会在数据库中只有4个字节 - 它可能存储为4个字节的数据+ 4字节长度+填充,这样你就不会获得任何东西。