【问题标题】:Using redis to store a structured event log使用redis存储结构化事件日志
【发布时间】:2016-01-20 17:03:25
【问题描述】:

我对Redis有点新,所以如果这是基本的,请原谅。

我正在开发一个应用程序,该应用程序会针对某些事件向用户发送自动回复。我想用 Redis 来存储谁收到了什么事件。

本质上,在 ruby​​ 中,数据结构可能如下所示,其中您有一个用户到事件的映射以及每个事件的发送日期。

{
  "mary@example.com" => {
    "sent_comment_reply" => ["12/12/2014", "3/6/2015"],
    "added_post_reply" => ["1/4/2006", "7/1/2016"]
  }
}

在 Redis 数据结构中表示这一点的最佳方式是什么,因此您可以问,Mary 是否收到了 sent_comment_reply?如果有,最近的时间是什么时候?

简而言之,问题是,如何(如果可能)在 Redis 中拥有一个包含数组的 Hash 结构。

与使用复合键的集合或列表相反的基本原理是哈希具有 O(1) 查找时间,而列表 (lrange) 和集合 (smembers) 上的查找将是 O(s+n) 和集合分别为 O(n)。

【问题讨论】:

标签: ruby data-structures redis


【解决方案1】:

在 Redis 中构建它的一种方式,取决于您了解用户的事件并希望最新的事件在记忆中保持新鲜的想法:

  1. 每个用户的排序集。排序集的内容将是事件代码; sent_comment_reply, added_post_reply 以最新事件的得分为最高。您可以使用ZRANK 来获得问题的答案:

    玛丽收到了 sent_comment_reply 吗?

  2. 也是用户的哈希值,这次您将字段作为事件sent_comment_reply,值是它的内容,应该使用最新值更新,包括正文、日期等。这将回答问题:

    如果有,最新的时间是什么时候?

注意:Sorted sets are really fast,在本例中,我们依赖事件作为数据。

使用排序集,您可以添加、删除或更新元素 快速方式(在时间与数量的对数成正比 元素)。由于元素是有序而不是有序的 之后,您还可以通过分数或排名(位置)获得范围 一个非常快速的方法。访问一个有序集合的中间也很 快速,因此您可以将排序集用作非重复的智能列表 元素,您可以快速访问所需的一切:元素 顺序,快速存在测试,快速访问中间元素!

【讨论】:

  • 有趣的方法,因此您使用两种不同的数据结构,它们在概念上由用户链接。但是,这种方法似乎没有存储事件发生时间的历史记录。
  • 我无法从您的问题中得出结论,但这取决于您希望保留到 Redis 的速度和数量。您可以将其作为属性添加到每个事件已经保存在哈希中的数据中,或者您将需要一个新结构,这是另一个像以前一样的哈希并使用HINCRBY
【解决方案2】:

使用哈希映射数组的一种可能方法如下:

add_element(key , value):

 len := redis.hlen(key)
 redis.hset(key , len , value)

这会将array[i] 元素映射到哈希键中的i 字段。

这适用于某些情况,但我可能会选择https://stackoverflow.com/a/34886801/2868839中建议的答案

【讨论】:

    猜你喜欢
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多