使用 redis 存储结构化事件日志



我对 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 中保存数组的哈希结构。

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

在 Redis 中构建它的一种方法,具体取决于您知道用户的事件并且您希望最新的记忆新鲜

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

    玛丽有sent_comment_reply吗?

  2. 一个哈希也为用户,这次你将有字段作为事件sent_comment_reply,值是它的内容,应该用最新的值更新,包括正文、日期等。

    如果是这样,最新的是什么时候?

注意:排序集真的很快,在这个例子中,我们依赖于事件作为数据。

使用排序集,您可以在非常 快速方式(在与数数成正比的时间内 元素)。由于元素是按顺序而不是有序的 之后,您还可以按分数或排名(位置)获得范围 一种非常快速的方法。访问排序集的中间也非常 快速,因此您可以将排序集用作非重复的智能列表 元素,您可以在其中快速访问所需的所有内容:元素 秩序,快速存在测试,快速进入中间元素!

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

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

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

这在某些情况下有效,但我可能会接受 https://stackoverflow.com/a/34886801/2868839 中建议的答案

最新更新