Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Redis中存储32位带符号整数的高效内存方法_Redis - Fatal编程技术网

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

在Redis中存储32位带符号整数的高效内存方法,redis,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

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

字符串以一定的长度存储,因此它在数据库中不会只有4个字节——它可能存储为4字节数据+4字节长度+填充,因此您不会得到任何东西。

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

以下是Redis存储字符串的方式-

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

    编辑:

    如果我有一组数字都小于10000,Redis如何存储我的数据集

    这取决于你有多少元素

    如果集合中的元素少于512个(请参见
    set max intset entries
    ),则集合将存储为intset。整数集是排序整数数组的美化名称。因为您的数字小于10000,所以每个元素将使用16位。它的内存效率几乎与C数组一样高

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


    如果您对元素消耗的内存量感兴趣,请在您的数据集上运行(免责声明:我是此工具的作者)。或者您可以阅读该课程的源代码,注释解释了内存的布局。

    谢谢您的回答。请你再解释一下共享内存池好吗。因此,如果我有一组数字都小于10000,Redis如何存储我的数据集?@arsen-请参阅我答案的更新。如果您存储的整数集小于10000,Redis在内存方面将非常有效。@sripathi krishnan您不能指定用于存储字符串键的字节数吗?“len()+4+4+1+8字节”是否仅适用于值?我们需要存储一个非常大的数据集,数据集由字符串(43)=>int组成,并需要计算体积。无论如何,谢谢你的信息!另一个问题是我们是否应该将len(string)乘以4(C++中每个字符的字节数)?那么str(40)在内存中变成了177个物理字节?谢谢