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

时间:2016-01-19 20:06:55

标签: ruby data-structures 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中拥有一个包含数组的Hash结构。

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

2 个答案:

答案 0 :(得分:0)

在Redis中构建它的一种方法,取决于你知道用户事件的想法,并且你希望最新的内存是新的:

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

    Mary收到了sent_comment_reply吗?

  2. 也为用户提供了一个哈希,这次你将该字段作为事件sent_comment_reply,其值是应该用最新值更新的内容,包括正文,日期,这将回答这个问题:

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

  3. 注意:Sorted sets are really fast,在此示例中,我们依赖于事件作为数据。

      

    使用排序集,您可以添加,删除或更新元素   快速的方式(在与数量的对数成比例的时间内   元件)。由于元素按顺序排列而不是有序   之后,您还可以按分数或等级(位置)获取范围   一个非常快的方式。访问排序集的中间也非常   快速,因此您可以使用排序集作为非重复的智能列表   您可以快速访问所需内容的元素:元素   订单,快速存在测试,快速访问中间的元素!

答案 1 :(得分:0)

使用散列映射数组的可能方法如下:

add_element(key , value):

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

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

这适用于某些情况,但我可能会回答https://stackoverflow.com/a/34886801/2868839

中建议的答案