在 Redis 数据库中,我有许多哈希对应于“故事”对象。
我有一个有序集 stories
,其中包含上述(故事)的所有键,可以方便地检索故事。
我现在想将任意表情符号(即对应于“笑脸”等的 Unicode 字符)与故事一起存储为“用户情绪”,对应于故事让用户感受到的情绪。
我在想:
- 创建名为
emotions
的新哈希值,其中包含单个表情符号(每个表情符号一个) - 创建一个名为
story-emotions
的哈希,可以高效检索和计算与故事相关的所有情绪 - 创建另一个名为
user-story-emotions
的新散列,将用户 ID 映射到 story-emotion 散列中的项目。
典型的查询是:
- 检索当前用户的故事的所有情绪
- 检索最近 50 篇故事中每种情绪的计数
这听起来像是一个明智的方法吗?
最佳答案
非常明智,但我想我可以帮助它变得更明智。
要存储表情符号字典,请使用两个哈希。首先,让我们称之为 emoticon-id
应该有一个字段来表示每个表情符号。字段名称是实际的 Unicode 序列,值是从 0 开始的唯一整数值,并随着每个新表情符号的添加而递增。
另一个哈希,id-emoticon
,应该放在适当的位置来进行反向映射,即从作为 id 的字段名称到实际的 Unicode 值。
这为您提供了 O(1) 的表情符号查找,您还应该考虑将其缓存在您的应用中。
要存储 user-story-emotions
数据,请查看 Redis 的位图。简而言之,使用表情符号 id 作为索引来切换该用户对该故事的存在/不存在。
请注意,为了保持紧凑,您会希望流行的情绪具有低 ID,以便您的位图尽可能小。
要存储聚合的story-emotions
,Sorted Set 是更好的选择。元素可以是 id 或实际的 unicode,分数应该是当前计数。这将允许您获取 HitTest 门的表情符号 (ZREVRANGEBYSCORE
) 和/或页面,类似于您处理最近 50 个故事的方式(我假设您使用的是 故事
排序集)。
最后,在为第二个查询提供服务时,在获取 50 个 story-emotion
计数器值的大部分时使用流水线或 Lua 脚本,以获得更高的吞吐量和更好的并发性。
关于redis - 在 Redis 中组织非规范化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377453/