redis - 在 Redis 中组织非规范化数据

标签 redis

在 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/

相关文章:

performance - 具有层次结构性能的 DocumentDB 与键值数据库

node.js - Laravel 5 - Homestead - Redis - NodeJs - Socket IO 运行不正常

redis - 是否建议使用 Supervisor 运行 redis

node.js - 我是否需要使用 .quit() 退出我的 Node redis 客户端实例?

node.js - 我无法使用 socket.io 发送聊天消息

nosql - Redis GET 与 SQL SELECT

python - 使用 Python 和 Redis 进行优雅的缓存

node.js - 如何为REDIS设​​置主机、端口、数据库和密码?

redis - Redis 小片段的解释

performance - Redis 性能 : Many queries returning small objects vs one query returning large objects