一尘不染

Redis只是一个缓存吗?

redis

我一直在阅读一些Redis文档,并在http://try.redis-db.com/上尝试了该教程。到目前为止,我看不到Redis和诸如Velocity或Enterprise Library Caching
Framework之类的缓存技术之间的任何区别。

您实际上只是在使用唯一键将对象添加到内存数据存储中。似乎没有任何关系语义…

我想念什么?


阅读 301

收藏
2020-06-20

共1个答案

一尘不染

不,Redis不仅仅是缓存。

像缓存一样,Redis存储键=值对。但是与缓存不同,Redis可让您对值进行操作。Redis中有5种数据类型-
字符串,集合,哈希,列表和排序集合。每种数据类型都公开各种操作。

理解Redis的最好方法是对应用程序建模,而不用考虑如何将其存储在数据库中。

建模问题,用户和答案

每个对象都可以建模为地图。例如,问题是具有字段{id,title,date_asked,votes,asked_by,status}的地图。类似地,答案是具有字段{id,question_id,answer_text,answer_by,票数,状态}的地图。同样,我们可以为用户对象建模。

这些对象中的每一个都可以作为哈希直接存储在Redis中。要生成唯一的ID,可以使用atomic递增命令。像这样-

$ 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向该频道发送消息。然后,所有用户都将收到该消息。您必须使用网络套接字或彗星之类的网络技术才能将消息实际传递到浏览器,但是Redis可以帮助您解决服务器端的所有问题。

持久性,可靠性等

与缓存不同,Redis将数据持久保存在硬盘上。您可以使用主从设置来提供更好的可靠性。要了解更多信息,请遍历此处的持久性和复制主题-http:
//redis.io/documentation

2020-06-20