data-structures - Redis中的最优存储结构

标签 data-structures nosql redis

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

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

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

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

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

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

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

最佳答案

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

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

添加新浏览器时;

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

要使 key 过期,我可能不会使用内置过期,而是使用 cron 作业或其他东西来

  1. 删除时间戳中的所有浏览器 key
  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​​ 脚本来减少。

希望对您有所帮助!

关于data-structures - Redis中的最优存储结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15291065/

相关文章:

redis - redis 中 client.end() 和 client.quit() 的区别?

c++ - 一些修改的改变问题

data-structures - IPv6查找数据结构

mongodb - 如何连接mongodb和Informix服务器

nosql - 在 CouchDB View 中排序日期

c# - 使用默认队列时类型不包含方法

将图映射到另一个结构的算法

java - 复制单链表

python - Python 模型的 Google Cloud Datastore 真实世界示例

scala - 如何仅在 Spark Streaming 的分区内使用 `reduce`,也许使用 combineByKey?