hash - 使用 Redis 哈希来存储问题/答案对

标签 hash redis

应用程序有一个包含用户表的 MySQL 数据库。每个用户都有自己的 Redis 哈希值。每个用户拥有的 Redis 哈希都包含问题/答案字符串的键/值对。例如(在 Ruby 中):

user = User.find(1)
question = "What colour is the sky?"
answer = "Blue"
user_hash = Redis::HashKey.new(user.id)
user_hash[question] = answer
user_hash[question] # returns answer

现在用户需要能够存储每个问题的多个答案,例如:

question = "What colour is the sky?"
answers = ["Blue", "Grey", "Red"]

此外,应用程序还将对每个用户哈希范围内的问题/答案组执行方法,例如搜索包含某些单词的用户问题字符串。

1) Redis 哈希此时是否适合应用程序的数据类型?如果是,2) 处理具有多个答案的问题/答案对的最佳方法是什么?

最佳答案

您应该将它们视为 3 个对象 - 用户、问题和答案。那么,他们之间的关系就变得简单了。用户有问题,问题有答案。

现在,在 Redis 中对此进行建模很容易。

  • 对象 User、Question 和 Answer 存储在哈希中
  • 问题将包含 id、text、userid、date_asked、date_modified 等字段
  • 答案将包含 id、text、userid、questionid 等字段

然后您需要存储问题的答案。使用键 question:$id:answers 创建 Redis 列表。这将是答案 ID 列表。

要根据关键字进行搜索,您应该为每个关键字创建一个 Redis 集。在此集合中,存储包含该单词的问题的 ID。

例如,sadd tag:java 123 232 4231表示第123、232、4231题中有java。同样,为每个关键字添加这样一个集合。

然后,要过滤包含 java 和 redis 的问题,只需对 tag:javatag:redis 进行集合交集即可。

关于hash - 使用 Redis 哈希来存储问题/答案对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10348585/

相关文章:

python - 运行时错误: maximum recursion depth exceeded using default hash method

ruby - 合并多个哈希数组并进行计算

java - 使用 spring 3 security 对密码加盐

java - 该键是否具有映射到内存位置的哈希表?

redis - 我们是否可以在没有网络的情况下根据 Redis 中另一个值的结果查询该值?

Redis Lettuce 连接和 BLPOP

ruby-on-rails - Rails with Redis 和 Devise 不工作

ruby - 从 Ruby Hash 中获取独特的内容

redis - Redis 中的键丢失

python - 使用 Redis 与 memcached+db 作为 Django 的 session 系统的优缺点?