Redis只是一个缓存吗?


255

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

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

我想念什么?


3
redis.ioRedis的是一个开源的,先进的key-value存储。它通常被称为数据结构服务器,因为键可以包含字符串,哈希,列表,集合和排序集合。就是说,我投票结束了您的问题,因为它不适合StackOverflow的格式。
Linus Thiel 2012年

29
我同意它不是SO格式。您认为哪儿更合适?
马特·埃文斯

Answers:


631

不,Redis不仅仅是缓存。

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

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

假设我们要构建StackOverflow.com。为简单起见,我们需要问题,答案,标签和用户。

建模问题,用户和答案

每个对象都可以建模为地图。例如,问题是具有字段{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


15
它也是使用PUB / SUB相关命令的极其简单的服务总线。
Jim Dennis

3
如何按用户检索问题?我应该为每个有您问题的用户创建一个列表,例如问题:user:1,还是应该使用标签?
Diogo Alves 2015年

2
我在SO上看到的非常有用且详细的解释
Trong Vu

5

不只是缓存。

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

4

Redis具有独特的功能,例如超快速的lua脚本。它的执行时间等于C命令的执行时间。这也为处理许多高级对象(如锁和信号量)所需的复杂Redis数据操作带来了原子性。

有一个基于Redis的基于内存数据网格的Redisson,它允许轻松地在Java上构建分布式应用程序。由于分布式LockSemaphoreReadWriteLockCountDownLatchConcurrentMap对象和其他许多人。

完美地在云中运行并支持AWS ElasticacheAWS Elasticache ClusterAzure Redis Cache支持


1

实际上,相对数据表示形式(或任何类型的数据表示形式)与数据库角色(缓存,永久性持久性等)之间没有依赖关系。

Redis对缓存很有用,这是事实,但它远不只是缓存。它是高速的全内存数据库。它确实将数据保留在磁盘上。它不是关系的,而是键值存储。

我们在生产中使用它。Redis帮助我们构建每秒处理数千个请求的软件,并在整个自然生命周期中保留客户业务数据。


0

Redis是最适合分布式环境/微服务架构的缓存。

它快速,可靠,具有原子性和一致性,并具有一系列数据类型,例如集合,哈希,列表等。

我从去年开始就使用它,当您需要非常快速地提供生产就绪的解决方案并解决任何与性能相关的问题时,它确实是一个救星,因为您始终可以使用它来缓存数据。


0

除了作为缓存服务器之外,Redis特别是数据结构服务器。作为数据结构服务器形式的缓存很重要,因为数据结构是程序或应用程序的基础。考虑到您正在使用SQL数据库作为存储技术,并且需要构造列表,哈希图,排名集或类似的东西,这有点麻烦。Redis可以以非常简单的方式直接为您提供这些功能,从而极大地简化了开发。

另一方面,数据结构服务器不必采用高速缓存的形式。有些项目与Redis兼容,但具有持久性存储引擎。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.