Redis位图分割键分割策略
Redis bitmap split key division strategy
我正在从联邦选举委员会 public 数据源 API 抓取和归档大量数据,它有一个名为 "sub_id" 的唯一记录标识符,它是一个 19 位整数.
我想考虑一种内存效率高的方法来对我已经归档的行项目进行分类,并立即想到 redis 位图。
阅读redis 位图的文档表明最大存储长度为2^32 (4294967296)。
理论上,19 位整数的范围可以是 0000000000000000001 - 9999999999999999999。现在我知道,所讨论的数据源实际上并没有 99 个 quintillion 记录,因此它们显然是稀疏的,并且不是连续的。在我目前存档的数据中,最大 ID 为 4123120171499720404,最小值为 1010320180036112531。(我可以根据日期告诉 ID,因为键中的 2017 和 2018 对应于它们引用的记录的日期,但我不能排除其余的模式。)
如果我想存储我已经下载的订单项,我需要 2328306436 个不同的 redis 位图吗? (9999999999999999999 / 4294967296 = 2328306436.54)。给定一个 19 位数字的想法,我可能会制定一个小算法来除以某个常数以确定要检查哪个拆分位图索引。
这个策略似乎站不住脚,所以我想我一定是从根本上误解了这方面的某些方面。我是吗?
一共有多少个"items"?什么是 "A LOT"?
无论如何。使用单个位来跟踪 10^19 个潜在项目中的每一个的线性方法至少需要 1250 PB。这使得将其存储在内存中变得不切实际 (atm)。
我建议您自学一般的概率数据结构,并在了解权衡之后考虑使用 RedisBloom 工具箱中的东西。
如果 ids ids 不是连续的并且非常分散,使用位图跟踪你处理过的 ids 不是最好的选择,因为它会浪费大量内存。
但是,如果不知道您的数据集有多少个不同的 sub_id
,则很难指出最佳解决方案。如果您谈论的是几十到几百万,那么在 Redis 中进行简单的设置可能就足够了。
诸如 RedisBloom 之类的布隆过滤器将是最佳解决方案(如果您错误计算了所需的容量,RedisBloom 甚至可以增长)。
在你 BF.CREATE 你的过滤器之后,你传递给 BF.ADD 要插入的 'item'。这个项目可以只要你想要。过滤器使用散列函数和模数使其适合过滤器大小。当您想检查该项目是否已被检查时,请使用 'item'.
调用 BF.EXISTS
简而言之,您在这里描述的是布隆过滤器非常适合的经典示例。
我正在从联邦选举委员会 public 数据源 API 抓取和归档大量数据,它有一个名为 "sub_id" 的唯一记录标识符,它是一个 19 位整数.
我想考虑一种内存效率高的方法来对我已经归档的行项目进行分类,并立即想到 redis 位图。
阅读redis 位图的文档表明最大存储长度为2^32 (4294967296)。
理论上,19 位整数的范围可以是 0000000000000000001 - 9999999999999999999。现在我知道,所讨论的数据源实际上并没有 99 个 quintillion 记录,因此它们显然是稀疏的,并且不是连续的。在我目前存档的数据中,最大 ID 为 4123120171499720404,最小值为 1010320180036112531。(我可以根据日期告诉 ID,因为键中的 2017 和 2018 对应于它们引用的记录的日期,但我不能排除其余的模式。)
如果我想存储我已经下载的订单项,我需要 2328306436 个不同的 redis 位图吗? (9999999999999999999 / 4294967296 = 2328306436.54)。给定一个 19 位数字的想法,我可能会制定一个小算法来除以某个常数以确定要检查哪个拆分位图索引。
这个策略似乎站不住脚,所以我想我一定是从根本上误解了这方面的某些方面。我是吗?
一共有多少个"items"?什么是 "A LOT"?
无论如何。使用单个位来跟踪 10^19 个潜在项目中的每一个的线性方法至少需要 1250 PB。这使得将其存储在内存中变得不切实际 (atm)。
我建议您自学一般的概率数据结构,并在了解权衡之后考虑使用 RedisBloom 工具箱中的东西。
如果 ids ids 不是连续的并且非常分散,使用位图跟踪你处理过的 ids 不是最好的选择,因为它会浪费大量内存。
但是,如果不知道您的数据集有多少个不同的 sub_id
,则很难指出最佳解决方案。如果您谈论的是几十到几百万,那么在 Redis 中进行简单的设置可能就足够了。
诸如 RedisBloom 之类的布隆过滤器将是最佳解决方案(如果您错误计算了所需的容量,RedisBloom 甚至可以增长)。
在你 BF.CREATE 你的过滤器之后,你传递给 BF.ADD 要插入的 'item'。这个项目可以只要你想要。过滤器使用散列函数和模数使其适合过滤器大小。当您想检查该项目是否已被检查时,请使用 'item'.
调用 BF.EXISTS简而言之,您在这里描述的是布隆过滤器非常适合的经典示例。