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

Redis高效存储数据(散列)

柯昆杰
2023-03-14

我需要你的一些建议。我试图用redis和哈希(redis类型)存储一些非常有效的内存数据。有一些随机字符串列表(在rfc中平均大小是40个字符,但最大可能是255个字符)--它是文件id,例如我们有100kk的file_id列表。我们还需要每个ID的轨道2参数:download_count(int,incremented)和server_id--tiny int,redis config添加了:

hash-max-ziplist-entries 1024
file_id(40 byte) + download_count + server_id) * 100kk + redis pointers --no need to calculate at all.

其次,使用一些128bit的散列函数,并按照redis散列的方式存储:但也有一些开销,但比1个要少。

最后,通过redis哈希,我们得到了这样的结果:

hmset(bucket, server_id_field, value1, download_count_filed, value2), 
server_id_field = crc32(file_id)
download_count_filed = crc32(file_id) + 1,
bucket = murmur2(file_id) div 10^5

所以这里有100k个bucket,所以在这一点上我们可以得到碰撞,例如:(cataract与perit碰撞)感谢链接,数据得到相同的bucket,但是字段有crc32散列,理论上我们在这一点上不能得到碰撞(概率较小),这个方案理论上是否可以和64位散列一样抗碰撞?

但它并不是真正有效的内存方案,所以我们可以得到如下的结果(有一个文件):

hmset(bucket, crc32(file_id as server_id_and_download_count_field), value1+’--’+value2)

所以我们不能使用增量函数,但是我们减少了字段和内存的使用,并且需要一些cpu来解析结果并用新的值(增量download_count),也许我们可以使用lua来做一些内置的操作?

所以我的问题是:它是强大的冲突抵抗(对于100kk数据)或者也许我们需要在字段中使用一些64位散列函数(不是crc32),但是当我们将有10亿行是足够强大的这个数据的时候呢?

也许还有更高效的方案?

谢谢你!

共有1个答案

步致远
2023-03-14

Redis哈希非常适合这个。看着HSET的Redis文档,我们看到

HSET myhash field1 "Hello"

我们还应该记住Redis是关于字符串的。我建议您将file_id拆分到X个字符之后(比如10个字符),并将第一部分用作myhash,其余部分用作field1。这样,就可以将以相同X字符开头的所有FILE_ID折叠到一个散列中,并且只需支付一次费用。因此,在myhash上用不同的长度进行测试,看看什么值对您有利。

要做的第二件事是创建“hello”,即您的值。由于Redis喜欢字符串,您应该将所有数据编码为一个。从server_id开始,因为您知道它的字节大小,然后追加download_count。如果您使用的是Python,那么可以轻松地使用struct.pack()将其转换为字符串。

您还可以查看file_id中是否存在所有字符。如果这些只是一个子集,那么您也可以将它们编码成一个更加密集的形式,并且可能节省一些字符。

祝你好运!

 类似资料:
  • 我正在使用Facenet算法进行人脸识别。我想基于此创建应用程序,但问题是Facenet算法返回一个长度为128的数组,即每个人的人脸嵌入。 对于人物识别,我必须找到两个人面部嵌入之间的欧几里得差异,然后检查它是否大于阈值。如果是,那么这些人是相同的;如果它小于,那么这些人是不同的。 比方说,如果我必须在10k人的数据库中找到人x。我必须计算每个人嵌入的差异,这是没有效率的。 有没有办法有效地存储

  • 我将redis用于发布/订阅以及服务器端缓存。我的意思是,我的应用服务器将redis服务器作为一个进程运行(也可以作为缓存)。我有几个瘦客户端(运行redis client)以发布/订阅模式连接到此应用服务器。我想知道redis在哪里存储缓存数据?单独在服务器中,或者在客户端中也会有一个副本。如果有近100个Redis客户端通过发布/订阅通道连接到服务器,那么以这种方式使用Redis也是一个好主意

  • 此外,应用程序将对每个用户散列范围内的问题/答案组执行方法,例如搜索包含某些单词的用户问题字符串。 1)Redis散列是否是应用程序当前的适当数据类型,如果是,2)处理具有多个答案的问题/答案对的最佳方法是什么?

  • 问题内容: 您将如何解决以下存储和检索问题? 每天(每年365天)将添加大约2.000.000行,每行包含以下信息: id(唯一的行标识符) entity_id (取值介于1到2.000.000(含)之间 date_id(每天增加一次-取值范围为1到3.650(十年:1 * 365 * 10)) value_1(取值范围在1到1.000.000之间(包括1和1.000.000之间) value_2

  • 我很难看到一些潜在的大规模重构的全局。我正在寻找一种同时解决两个问题的解决方案(如果存在的话)。我已经很长时间没有用d3编码了,一开始也不太流利。 所有数据都存在于一个数组中,该数组的维数为n,或2 x。。。(链长度随着每次鼠标单击而增加)。 现在我想显示一个老化,每个链的长度都是一样的。对于左边的图,老化将以不同的颜色(例如橙色和红色)显示每个链的第一个点。实际上,已经存在的第一个点将被不同地着

  • 问题内容: 我目前有一个电子表格类型程序,该程序将其数据保存在HashMaps的ArrayList中。当我告诉您这还不理想时,您无疑会感到震惊。开销似乎使用的内存比数据本身多5倍。 这个问题询问有效的馆藏库,答案是使用Google馆藏。 我的跟进是“ 哪一部分? ” 。我一直在阅读文档,但感觉不像是哪种类最适合。(我也向其他图书馆或建议开放)。 因此,我正在寻找可以使我以最小的内存开销存储密集电子