存储32位内存有效的方式Redis的符号整数(Memory efficient way to sto

2019-08-31 17:05发布

由于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

Answer 1:

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

下面是如何Redis的存储字符串 -

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

在这个例子中你引用,它的8个字节的问题很长一段V / S 21个的字符串字节。

编辑:

所以,如果我有一组数字都超过10000如何Redis的存储我的一套少?

这取决于你有多少元素都有。

如果你有你的一套小于512元(见set-max-intset-entries ),那么将被存储为INTSET。 一个INTSET是一个有序整数数组一个荣耀的名字。 由于您的号码是小于10000,它会使用每个元素16位。 它是(几乎)作为存储器高效为C数组。

如果你有超过512点的元素,集合成为一个哈希表。 组中的每个元件被包裹在称为结构robj ,其具有16个字节的开销。 该robj结构有一个指针指向整数的共享池,让您不支付任何额外的整数本身。 最后, robj实例存储在哈希表和哈希表有一个开销成正比集的大小。

如果你有兴趣的元素究竟有多大的内存占用,运行Redis的-RDB的工具,在你的数据集。 或者你也可以阅读类的源代码MemoryCallback ,注释说明内存的布局方式。



Answer 2:

字符串存储与长度,所以它不会在数据库中只有4个字节 - 它可能存储为4个字节的数据+ 4字节长度+填充,这样你就不会获得任何东西。



文章来源: Memory efficient way to store 32 bit signed integer in Redis
标签: redis