在Redis数据库中,我有许多哈希对应于"故事"对象。
我有一个有序集stories
,其中包含上述所有键(故事),可以方便地检索故事。
我现在想要存储任意表情符号(即对应于"笑脸&#34等的Unicode字符)和故事作为用户情感"对应于故事让用户感受到的情感。
我在考虑:
emotions
的新哈希,其中包含单个表情符号(每个情感表达一个)story-emotions
的哈希,可以有效地检索和计算与故事相关的所有情绪user-story-emotions
的新哈希,将用户ID映射到故事情感哈希中的项目。典型的查询将是:
这听起来像是一种明智的做法吗?
答案 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脚本,以获得更高的吞吐量和更好的并发性。