Redis只是一个缓存吗?

时间:2012-04-13 08:49:22

标签: caching redis

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

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

我错过了什么?

9 个答案:

答案 0 :(得分:599)

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

与缓存类似,Redis存储键=值对。但与缓存不同,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

处理投票

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

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

主页的问题列表

接下来,我们要存储最新的问题以显示在主页上。如果您正在编写.NET或Java程序,则可以将问题存储在List中。事实证明,这也是在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的“排序集”功能。分类集允许您将分数与每个元素相关联。然后,您可以根据其分数检索元素。

让我们继续为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有一个pub-sub模型。您可以创建频道,例如“channel_questions_tagged_redis”。然后,您subscribe用户访问特定频道。添加新问题后,您会publish向该频道发送消息。然后所有用户都会收到消息。您必须使用Web套接字或彗星等Web技术将消息实际传送到浏览器,但Redis可以帮助您完成服务器端的所有管道。

持久性,可靠性等。

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

答案 1 :(得分:3)

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

在内存数据网格中有一个名为Redisson的Redis,它允许在Java上轻松构建分布式应用程序。感谢分发的LockSemaphoreReadWriteLockCountDownLatchConcurrentMap个对象和许多其他对象。

完美适用于云端并支持AWS ElasticacheAWS Elasticache ClusterAzure Redis Cache支持

答案 2 :(得分:2)

不只是缓存。

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

答案 3 :(得分:1)

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

Redis有利于缓存它是真的,但它不仅仅是一个缓存。它是高速完全内存数据库。它确实在磁盘上保留数据。它不是关系型的,它是键值存储。

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

答案 4 :(得分:1)

Redis 的用法:

  1. 使用多种数据结构缓存,例如:字符串、集合、zset、列表、哈希和位图(可用于许多聚合用例)
  2. KV 数据库。 Reids 内存中的数据可以存储在磁盘上:RDB 和 AOF 可以获取快照和编辑日志。
  3. 消息队列。但是一条消息只能被一个消费者消费
  4. 发布订阅
  5. 分布式锁。依靠 setnx 命令,只有成功执行它的第一个线程才会持有锁。 https://redis.io/commands/setnx

答案 5 :(得分:0)

Redis是最适合于分布式环境/微服务体系结构的缓存。

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

Redis支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超级日志,带有半径查询和流的地理空间索引。 Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

使用python实现

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

答案 8 :(得分:0)

除了目前为止做出的回答再总结

  • Redis 是一个非常快的非关系型数据库,它存储键到五种不同类型值(字符串、散列、列表、集合、排序集合、位图和超级日志)的映射。 @Sripathi Krishnan 的答案对此进行了详细说明。

  • Redis 支持磁盘上的内存持久存储

  • 复制以扩展读取性能

  • 客户端分片以扩展写入性能

如果您想获得有关 Redis 的更多详细信息和深度信息,可以查看Redis In ActionRedis Essentials 的书籍。