当前位置: 首页 > 面试题库 >

在Redis中存储32位有符号整数的内存有效方式

松涵容
2023-03-14
问题内容

由于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存储字符串的方式-

  1. 小于10000的整数存储在共享内存池中,并且没有任何内存开销。如果愿意,可以通过更改redis.h中的常数REDIS_SHARED_INTEGERS并重新编译Redis 来增加此限制。
  2. 大于10000并且在long范围内的整数会消耗8个字节。
  3. 常规字符串的长度为len(string)+ 4个字节的长度+ 4个字节的标记可用空间+ 1个字节的空终止符+ 8个字节的malloc开销。

在您引用的示例中,对于字符串的长v / s 21字节,其问题是8字节。

编辑:

因此,如果我的一组数字都小于10,000,Redis如何存储我的数字集?

这取决于您拥有多少个元素

如果集合中的元素少于512个(请参阅set-max-intset- entries参考资料),则该集合将被存储为一个IntSet。IntSet是有序整数数组的专有名称。由于您的数字小于10000,因此每个元素将使用16位。它(几乎)和C数组一样具有高效的内存。

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

如果您对元素消耗多少内存感兴趣,请在数据集上运行redis-rdb-
tools
(免责声明:我是该工具的作者)。或者,您可以阅读MemoryCallback类的源代码,这些注释说明了内存的布局方式。



 类似资料:
  • (*在下面的帖子中,所有的IP、端口和密码都已更改。很抱歉这篇文章的格式,编辑似乎不喜欢新行。) 问题:如何将整数存储为带符号的32位小尾数? 背景:我试图使用RCon连接到bash中的minecraft服务器。到目前为止,服务器显示正在接收连接,但我无法正确格式化数据包。我可以使用mcrcon连接到服务器并在wireshark中查看数据包,但是当我尝试使用bash脚本时,数据包长度、reques

  • 我的数字类型是有符号二的补码整数。 在内存寄存器%rdi/edi/di中,我有0xFFFFFFFF。在%rsi/esi/si中,我有0x8000000。 如何正确添加这些? 我认为答案是: 由于我添加的是完整的32位寄存器,因此可以添加完整的0xFFFFFFFF和0x8000000。 我把一个有符号整数加到一个有符号整数上,它们都是32位的。我实际上是在加-2147483648和0x8000000

  • 问题内容: 我有两个用Go编写的类似程序的示例。该代码的主要目的是使用结构中的值对结构进行排序。 指针示例 有值的例子 我想知道2分钟: 哪个示例将提高内存效率?(我想这是一种指针方式) 如何使用地图中具有不同数量结构的测试数据来衡量这些示例的性能?您能帮我建立基准吗? 我认为地图中每个结构的大小平均在1-2kB之间。 问题答案: “高效内存”是一个相当宽泛的术语,在诸如Go之类的垃圾收集语言中,

  • 问题内容: 我存储了1.11亿个键值对(一个键可以有多个值-最多2/3),它们的键是50位整数,值是32位(最大)整数。现在,我的要求是: 快速插入(键,值)对[允许重复] 基于键快速检索一个或多个值。 这里基于MultiMap给出了一个很好的解决方案。但是,我想在主内存中存储更多键/值对,而不会降低性能。我从网络文章中研究到B +树,R+树,B树,紧凑多图等可以是一个很好的解决方案。有谁能够帮我

  • 我用雷迪森换雷迪斯。我已经在我的本地系统上安装了Redis。我已经编写了以下代码并运行了它: 但是,当我进入redis-cli并尝试检索该键时,我得到这是为什么?为什么它不把数据推入Redis?

  • 卡桑德拉新手问题。我正在使用REST调用从社交网站收集一些数据。因此,我最终得到了以JSON格式返回的数据。 JSON 只是我的表中的列之一。我试图弄清楚存储JSON字符串的“最佳实践”是什么。 首先我想到使用map类型,但JSON包含字符串、数字类型等的混合。看起来我不能为map键/值声明通配符类型。JSON字符串可能非常大,可能超过10KB。我可以将其存储为字符串,但这似乎效率低下。我会假设这