不,Redis 不仅仅是一个缓存。
像缓存一样,Redis 存储键值对。但与缓存不同的是,Redis 允许您对值进行操作。 Redis 中有 5 种数据类型——字符串、集合、哈希、列表和有序集合。每种数据类型都公开了各种操作。
了解 Redis 的最佳方式是对应用程序进行建模,而无需考虑如何将其存储在数据库中。
假设我们要构建 StackOverflow.com。为了简单起见,我们需要问题、答案、标签和用户。
建模问题、用户和答案
每个对象都可以建模为一个地图。例如,问题是包含字段 {id, title, date_asked, votes, ask_by, status} 的地图。类似地,Answer 是一个包含 {id, question_id, answer_text, answers_by, votes, status} 字段的映射。同样,我们可以为用户对象建模。
这些对象中的每一个都可以直接作为哈希存储在 Redis 中。要生成唯一 ID,您可以使用 atomic increment 命令。像这样的 -
$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK
$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK
处理投票
现在,每当有人提出问题或答案时,您只需要这样做
$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2
主页问题列表
接下来,我们要存储最近的问题以显示在主页上。如果您正在编写一个 .NET 或 Java 程序,您可以将问题存储在一个列表中。事实证明,这也是将其存储在 Redis 中的最佳方式。
每次有人提出问题时,我们都会将其 id 添加到列表中。
$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1
现在,当您想要呈现您的主页时,您可以向 Redis 询问最近的 25 个问题。
$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"
现在您有了 ID,使用管道从 Redis 检索项目并将它们显示给用户。
按标签提问,按票数排序
接下来,我们要检索每个标签的问题。但 SO 允许您在每个标签下查看投票最多的问题、新问题或未回答的问题。
为了对此进行建模,我们使用了 Redis 的 Sorted Set 功能。排序集允许您将分数与每个元素相关联。然后,您可以根据它们的分数检索元素。
让我们继续为 Redis 标签执行此操作
$ zadd questions_by_votes_tagged:redis 2 question:1
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5
1) "question:2"
2) "question:613"
3) "question:1"
我们在这里做了什么?我们将问题添加到已排序的集合中,并为每个问题关联一个分数(投票数)。每次一个问题被投票时,我们都会增加它的分数。当用户点击“标记为 Redis 的问题,按投票排序”时,我们只需执行 zrevrange 并返回热门问题。
不刷新页面的实时问题
最后,一个奖励功能。如果您保持问题页面打开,SO 会在添加新问题时通知您。 Redis 在这里有什么帮助?
Redis 有一个发布-订阅模型。您可以创建频道,例如“channel_questions_tagged_redis”。然后,您将 subscribe 用户转到特定频道。添加新问题时,您会向该频道发送publish 消息。然后所有用户都会收到该消息。您必须使用 Web 技术(如 Web 套接字或 Comet)才能将消息实际传递到浏览器,但 Redis 可以帮助您完成服务器端的所有工作。
持久性、可靠性等
与缓存不同,Redis 将数据持久保存在硬盘上。您可以进行主从设置以提供更好的可靠性。要了解更多信息,请在此处查看持久性和复制主题 - http://redis.io/documentation