使用HSET或SETBIT在Redis中存储60亿个SHA256哈希值。

4
问题集:我想存储60亿个SHA256哈希值。我要检查哈希是否存在,如果存在,则执行某个操作。在存储SHA256哈希(64字节字符串)以仅检查密钥是否存在方面,我发现了两个可用的函数

HSET/HEXISTGETBIT/SETBIT

我想确保占用最少的内存,但也要确保查询很快。

使用情况将是"检查SHA256哈希是否存在"。

问题:

我想了解如何存储这些数据,因为当前从文本 -> redis有200%的增加。我想了解使用 ziplist entriesziplist value 的最佳分片选项是什么,如何拆分哈希以使ziplist最大化。

我尝试将 ziplist entries 设置为 16 ^ 4(65536),并将值设置为60,基于分割 4:60

请帮助我了解选项和技术,以使其占用的空间尽可能小而且查询速度快。

谢谢


ziplist不是免费的 - 这是内存/CPU之间的权衡,所以最小内存和最大速度不是一个选项。这被称为时空权衡。https://en.wikipedia.org/wiki/Space%E2%80%93time_tradeoff - Ersoy
由于RAM比磁盘要昂贵得多,而6B的记录将占用大量空间,我建议您将数据存储在某种数据库中,它不太快,但更便宜。 - Hi computer
1个回答

0
有点晚了,但是你可以使用纯Redis键来实现这个功能:
# Store a given SHA256 hash

> SET 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 ""
OK

# Check whether a specific hash exists

> EXISTS 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae
0

SETEXISTS对于单个键的时间复杂度均为O(1)。由于Redis最多可以处理2^32个键,因此您应该将数据集分成两个或更多的Redis服务器/集群,这也取决于节点数和服务器/集群可用的总内存。

我还建议使用哈希的二进制序列而不是它们的文本表示-因为这样可以在存储Redis键时节省约50%的内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接