我对 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 中构建它的一种方法,具体取决于您知道用户的事件并且您希望最新的记忆新鲜
:每个用户的排序集。排序集的内容将是事件代码;
sent_comment_reply
,added_post_reply
最新事件的得分最高。您可以使用ZRANK
来获取问题的答案:玛丽有sent_comment_reply吗?
一个哈希也为用户,这次你将有字段作为事件
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 中建议的答案