我正在寻找存储以下信息组。我存储了一个分钟时间戳(例如,将在 1 分钟窗口中看到的所有浏览器 ID 分组),然后是浏览器引用列表。我希望只有一个浏览器 ID 实例
这个数据结构可以使用Redis中的什么数据结构?有没有更好的存储方式?
...
12:06 -> browser1, browser7
12:07 -> browser8
12:08 -> browser4, browser5, browser6, browser9
...
每一行可以有大约 1 天的生存时间。
添加新的 browserID 时,我首先检查浏览器 ID 是否已存在于数据中的某处,如果存在则删除并添加到新的分钟行。
最后,我每隔 1 分钟获取 30 分钟前的行并处理这些浏览器 ID,然后在完全处理后从列表中删除该行。
此数据结构中任何时候都可能有多达 100 万个浏览器引用。
最佳答案
好的,新信息,新答案:)
让我们让每个浏览器成为数据库中的一个键,指向它当前所在的时间戳。还有一个键代表每个时间戳,以及它“包含”的一组浏览器。
添加新浏览器时;
- 通过检查它的 key 是否存在来检查它是否已经在系统中。
- 如果是,检查它属于哪个时间戳,将其从旧时间戳中删除,添加到新时间戳中。更新浏览器 key 。
- 如果不是,则将其添加到时间戳中并设置浏览器 key 。
要使 key 过期,我可能不会使用内置过期,而是使用 cron 作业或其他东西来
- 删除时间戳中的所有浏览器 key
- 删除时间戳键。
示例数据结构;
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/