0

我正在寻找存储以下信息组。我存储一分钟时间戳(例如,将在 1 分钟窗口中看到的所有 browserID 分组),然后存储浏览器引用列表。我希望能够只有一个浏览器 ID 实例

我可以为这个数据结构使用 Redis 中的什么数据结构?有没有更优化的存储方式?

...
12:06 -> browser1, browser7
12:07 -> browser8
12:08 -> browser4, browser5, browser6, browser9
...

每行可以有大约 1 天的生存时间。

添加新的 browserID 时,我首先检查浏览器 ID 是否已存在于数据中的某个位置,如果存在,请删除并添加到新的分钟行。

最后,我每隔 1 分钟取出 30 分钟前的行并处理这些浏览器 ID,然后在完全处理后从列表中删除该行。

在任何时候,此数据结构中最多可能有 100 万个浏览器引用。

4

2 回答 2

1

好的,新信息,新答案:)

让我们让每个浏览器成为数据库中的一个键,指向它当前所在的时间戳。还有每个时间戳的一个键,它“包含”一组浏览器。

添加新浏览器时;

  1. 通过检查它的密钥是否存在来检查它是否已经在系统中。
  2. 如果是,请检查它属于哪个时间戳,将其从旧时间戳中删除,并将其添加到新时间戳中。更新浏览器密钥。
  3. 如果没有,请将其添加到时间戳并设置浏览器密钥。

要使密钥到期,我可能不会使用内置的 expire,而是使用 cron 作业或其他东西来

  1. 删除时间戳中的所有浏览器密钥
  2. 删除时间戳键。

示例数据结构;

ts:12:01 -> {1, 3}
ts:12:02 -> {2}

browser:1 -> 12:01
browser:2 -> 12:02
browser:3 -> 12:01

这应该是合理的 O(1),但常数时间稍高(每个操作有多个请求)。可能通过使用服务器端 ruby​​ 脚本来减少。

希望有帮助!

于 2013-03-11T18:21:19.853 回答
0

清单就够了。实际上,如果浏览器的数量小于 400(根据你的 conf 文件,但默认为 400),Redis 实现了一个顺序数组替换列表以节省空间。

欲了解更多信息:https ://github.com/antirez/redis/blob/unstable/src/ziplist.h

于 2013-03-11T10:14:42.183 回答