在redis中组织非规范化数据

时间:2017-07-28 15:38:46

标签: redis

在Redis数据库中,我有许多哈希对应于"故事"对象。

我有一个有序集stories,其中包含上述所有键(故事),可以方便地检索故事。

我现在想要存储任意表情符号(即对应于"笑脸&#34等的Unicode字符)和故事作为用户情感"对应于故事让用户感受到的情感。

我在考虑:

  • 创建名为emotions的新哈希,其中包含单个表情符号(每个情感表达一个)
  • 创建一个名为story-emotions的哈希,可以有效地检索和计算与故事相关的所有情绪
  • 创建另一个名为user-story-emotions的新哈希,将用户ID映射到故事情感哈希中的项目。

典型的查询将是:

  • 为当前用户检索故事的所有情绪
  • 检索50个最新故事中每种情绪的计数

这听起来像是一种明智的做法吗?

1 个答案:

答案 0 :(得分:2)

非常明智,但我想我可以帮助它更加明智。

要存储表情词典,请使用两个哈希。第一个,让我们称之为emoticon-id应该为每个表达的表情符号都有一个字段。字段名称是实际的Unicode序列,值是从0开始的唯一整数值​​,并且对于添加的每个新表情符号都会增加。

应该使用另一个Hash id-emoticon来进行反向映射,即从作为id的字段名到实际的Unicode值。

这为你提供了表情符号的O(1)查找,你也应该考虑在你的应用程序中缓存它。

要存储user-story-emotions数据,请查看Redis'位图。 Tersely,使用表情符号作为索引来切换该用户对该故事的存在/缺失。

请注意,为了保持紧凑,您希望流行的情绪具有较低的ID,以便您的位图尽可能小。

要存储聚合story-emotions,排序集将是更好的选择。元素可以是id或实际unicode,分数应该是当前计数。这将允许您获取顶部表情符号(ZREVRANGEBYSCORE)和/或页面,与您最近50个故事的处理方式类似(我假设您正在使用stories已排序为此设定。)

最后,在提供第二个查询时,在获取大量50个story-emotion计数器值时使用管道传输或Lua脚本,以获得更高的吞吐量和更好的并发性。