当前位置: 首页 > 知识库问答 >
问题:

哈希比列表占用更多内存?

乌修筠
2023-03-14

请帮助选择如何存储消息

1)

SET msg:1 sender 12
SET msg:1 text "hello there"
SET msg:1 date 6278127367
SET msg:1 recpnt 88223
SET msg:1 viewed false
SET msg:2 sender 102
SET msg:2 text "blablabla"
SET msg:2 date 6278127643
SET msg:2 recpnt 523
SET msg:2 viewed false
SET msg:3 sender 16
SET msg:3 text "nice weather isntit"
SET msg:3 date 6278127432
SET msg:3 recpnt 48781
SET msg:3 viewed true

2)

LPUSH msg:1 12 "hello there" 6278127367 88234 false
LPUSH msg:2 523 "blablabla" 6278127367 4323 false
LPUSH msg:3 16 "nice weather isn't it" 6278127234 223 true
LPUSH fields sender text date recpnt viewed

SET似乎比LIST更容易使用,但Redis会在每条消息中存储字段名,从而使内存使用量增加一倍吗?

共有1个答案

赫连黎昕
2023-03-14

首先,我相信你的意思是说hash而不是set;设置的数据结构不适合您所描述的内容。

接下来您有两个选择:

>

  • 哈希:字符串到字符串的数据映射。如果您想象键值是JSON数据,那么您作为哈希的消息将如下所示:

    msg:1 = {
      "sender": "12",
      "text":   "hello there",
      "date":   "6278127367",
      "recpnt": "88223",
      "viewed": "false"
    }
    

    你会注意到你可以清楚地看到什么值映射什么键;数据有一些结构。哈希查找也是恒定的时间。

    列表:字符串的链表。同样,将您的数据想象为JSON:

    msg:1 = ["12", "hello there", "6278127367", "88223", "false"]
    

    现在还不清楚什么值对应于哪个字段,是吗?您必须跟踪列表的哪个索引存储哪些信息,这会增加应用程序的复杂性。此外,访问单个字段不再是固定时间。

    从以上两点来看,哈希似乎更合适。

    但是选择哈希表对空间有什么影响?这是哈希和列表的大小(使用DEBUG OBJECT找到

    • 列表:49字节

    消息只有11个字符。推特大小(116个字符)的呢?

    • 列表:143字节
    • 哈希:174字节(~1.22x)

    是的,散列的存储空间会更大,但在一般情况下,它的大小可能不会是你的两倍。

    因此,尽管有点大,我仍然相信哈希是正确的数据结构(当然,除非您增加的托管费用会让您破产)。

  •  类似资料:
    • 问题内容: 在Java中,如果我创建一个并将N个元素放入其中,它将占用多少内存?如果依赖于实现,那么什么才是好的“猜测”? 问题答案: 编辑; 噢,天哪,我是个白痴,我提供了HashMap的信息,而不是HashTable的信息。 但是,检查后,出于内存目的,实现是相同的。 这取决于您的VM的内部内存设置(项目的包装,32位或64位指针以及字对齐/大小),并且不是由Java指定的。 可以在这里找到有

    • 问题内容: 在如何哈希列表?有人告诉我,我应该转换为一个元组第一,如到。 因此,第一个不能散列,而第二个可以散列。为什么*? *我并不是真正地在寻求详细的技术说明,而是在寻找一种直觉 问题答案: 主要是因为元组是不可变的。承担以下工作: 现在,当您这样做时会发生什么?您已修改字典中的键!远道而来!如果您熟悉哈希算法的工作原理,这会让您感到恐惧。另一方面,元组是绝对不变的。看起来好像是在修改元组,但

    • keys 一个包含哈希表中查找到的键的序列。 请注意,并不是所有的哈希表都支持这个 (询问程序员一个指定的哈希表是否允许这么操作)。 <#assign h = {"name":"mouse", "price":50}> <#assign keys = h?keys> <#list keys as key>${key} = ${h[key]}; </#list> 将会输出: name = mouse

    • REDIS_HASH (哈希表)是 HSET 、 HLEN 等命令的操作对象, 它使用 REDIS_ENCODING_ZIPLIST 和 REDIS_ENCODING_HT 两种编码方式: 字典编码的哈希表 当哈希表使用字典编码时, 程序将哈希表的键(key)保存为字典的键, 将哈希表的值(value)保存为字典的值。 哈希表所使用的字典的键和值都是字符串对象。 下图展示了一个包含三个键值对的哈希

    • Hashtbl 模块 Hashtbl模块实现了一个高效的,可变的查询表。如下创建一个哈希表: # let my_hash = Hashtbl.create 123456;; val my_hash : ('_weak1, '_weak2) Hashtbl.t = <abstr> 这个123456是哈希表的初始大小。这个值可以是你对数据量的一种猜测,但是哈希表有可能会 随着数据量的增多而变大,因此

    • 哈希表 通过最简单的取模运算作为哈希算法 class HashNode(object): def __init__(self, id, data): self.id = id self.data = data self.next = None def __str__(self): return '(%d,%s)' %