Redis只是一个缓存吗?

Mat*_*ans 246 caching redis

我一直在阅读一些Redis文档并在http://try.redis-db.com/上尝试教程.到目前为止,我看不出Redis与Velocity或企业库缓存框架等缓存技术之间存在任何差异

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

我错过了什么?

Sri*_*nan 618

不,Redis不仅仅是一个缓存.

像Cache一样,Redis存储key = value对.但与缓存不同,Redis允许您对值进行操作.Redis中有5种数据类型 - 字符串,集合,哈希,列表和排序集.每种数据类型都公开了各种操作.

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

让我们说我们想要构建StackOverflow.com.为了简单起见,我们需要问题,答案,标签和用户.

建模问题,用户和答案

每个对象都可以建模为Map.例如,问题是包含字段{id,title,date_asked,votes,ask_by,status}的地图.同样,答案是带有字段{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
Run Code Online (Sandbox Code Playgroud)

处理投票

现在,每当有人提出问题或答案时,你只需要这样做

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2
Run Code Online (Sandbox Code Playgroud)

主页的问题列表

接下来,我们要存储最新的问题以显示在主页上.如果您正在编写.NET或Java程序,则可以将问题存储在List中.事实证明,这也是在Redis中存储它的最佳方式.

每当有人提出问题时,我们都会将其ID添加到列表中.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1
Run Code Online (Sandbox Code Playgroud)

现在,当您想要渲染主页时,您可以向Redis询问最近的25个问题.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"
Run Code Online (Sandbox Code Playgroud)

现在您已拥有ID,使用流水线技术从Redis检索项目并将其显示给用户.

按标签排列的问题,按投票排序

接下来,我们想要检索每个标签的问题.但是SO允许您在每个标签下查看最高投票问题,新问题或未回答的问题.

为了对此进行建模,我们使用Redis的排序集功能.分类集允许您将分数与每个元素相关联.然后,您可以根据其分数检索元素.

让我们继续为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"
Run Code Online (Sandbox Code Playgroud)

我们在这做了什么?我们在排序集中添加了问题,并将每个问题的得分(投票数)相关联.每次提出问题时,我们都会增加分数.当用户点击"标记为Redis的问题,按投票排序"时,我们只需执行一个zrevrange并返回最重要的问题.

没有刷新页面的实时问题

最后,奖金功能.如果您打开问题页面,SO会在添加新问题时通知您.Redis如何在这里提供帮助?

Redis有一个pub-sub模型.您可以创建频道,例如"channel_questions_tagged_redis".然后subscribe,您将用户转到特定频道.添加新问题后,您会publish收到该频道的消息.然后所有用户都会收到消息.您将不得不使用Web套接字或彗星等Web技术将消息实际传递到浏览器,但Redis可以帮助您完成服务器端的所有管道.

持久性,可靠性等

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

  • 它也是使用PUB/SUB相关命令的极其简单的服务总线. (14认同)
  • 我如何通过用户检索问题?我是否应该为您的每个用户创建一个列表,例如问题:user:1或者我应该使用标签吗? (3认同)
  • 非常有用和详细的解释,我每个人都看到了 (2认同)

Pan*_*wat 5

不仅仅是缓存。

  • 内存键值存储
  • 支持多种数据类型(字符串、散列、列表、集合、排序集合、位图和超级日志)
  • 它提供了将缓存数据存储到物理存储(如果需要)的能力。
  • 支持发布订阅模式
  • Redis 缓存提供复制以实现高可用性(主/从)