我在阅读this article,其中提到在Redis中存储100万个密钥将使用17 GB的内存。然而,当切换到哈希时,每个哈希值以1 k的速度分块(例如:HSET "mediabucket:1155" "1155315" "939"
)可以让它们在5GB中存储1 M,这是一个相当大的节省。
我读过redis memory-optimization,但我不太明白其中的区别。它说HGbit不完全是O(1),但足够接近,并提到使用hsets时更多的CPU使用。我不明白为什么会有更多的CPU使用(当然是时间交换空间。但如何/什么?)。它提到了'编码',但没有提到他们如何编码。
它也只提到了字符串,但我不知道只有字符串意味着什么。它是哈希字段吗?它意味着哈希字段吗?我在HSET中没有看到任何关于它的内容。到底会编码什么?为什么编码比使用SET更有效?
怎么可能HSET "mediabucket:1155" "1155315" "939"
个
效率高于SET "mediabucket:1155315" "939"
?
SET中的数据较少(使用1155315和1155而不是1155315)。我个人会尝试使用二进制密钥,但我不认为这与为什么HSET更有效有关。
编辑:
Cross也发表在redis-db邮件列表上:https://groups.google.com/d/topic/redis-db/90K3UqciAx0/discussion
1条答案
按热度按时间7rtdyuoh1#
小的哈希对象根据hash-max-ziplist-entries和hash-max-ziplist-value参数的值被编码为ziplist。这是简单的数据序列化。
ziplist的定义如下(摘自Redis源代码):
字符串
哈希对象中的每一项都表示为ziplist中的键/值对(2个连续的条目)。键和值都可以存储为简单的字符串或整数。这种格式在内存中更紧凑,因为它节省了实现动态数据结构(如真实的哈希表)所需的大量指针(每个8字节)。
缺点是HSET/HGET操作在ziplist上应用时实际上是O(N)的。这就是为什么ziplist必须保持小。当ziplist数据适合L1 CPU缓存时,相应的算法足够快,尽管它们的线性复杂度。
您可能需要参考以下链接以获取更多信息:
Redis的内存使用量是数据的10倍
Redis数据结构空间需求
这些答案涉及其他数据结构(如集合、列表或排序集合),但它们是完全相同的概念。