在Redis中存储32位带符号整数的高效内存方法
由于Redis尝试将字符串解析为64位有符号整数,因此存储32位有符号整数的二进制表示形式而不是基数为10的整数字符串是一个好主意吗 在我们的系统中,我们有许多32位有符号整数ID的列表在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
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存储字符串的方式-
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个物理字节?谢谢