【问题标题】:Is Redis just a cache?Redis 只是一个缓存吗?
【发布时间】:2012-04-25 15:24:39
【问题描述】:

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

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

我错过了什么?

【问题讨论】:

  • 来自redis.ioRedis 是一个开源的高级键值对存储。它通常被称为数据结构服务器,因为键可以包含字符串、哈希、列表、集合和排序集合。也就是说,我投票结束你的问题,因为它不符合 StackOverflow 的格式。
  • 我同意它不是 SO 格式。你觉得哪里更合适?

标签: caching redis


【解决方案1】:

不,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

【讨论】:

  • 它也是一个使用PUB/SUB相关命令的极其简单的服务总线。
  • 如何按用户检索问题?我应该为每个用户创建一个包含您的问题的列表,例如 questions:user:1 还是应该使用标签?
  • 我在 SO 上看到的非常有用和详细的解释
  • 这是黄金,最大的不同是心态的改变。
  • 那么它安全(永不丢失数据)吗?我知道 Redis 有 HA 文档,但我听说有人说它不适合。
【解决方案2】:

不仅仅是缓存。

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

【讨论】:

    【解决方案3】:

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

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

    完美地在云端运行,支持AWS ElasticacheAWS Elasticache ClusterAzure Redis Cache 支持

    【讨论】:

      【解决方案4】:

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

      Redis 对缓存很有用,这是真的,但它不仅仅是一个缓存。它是高速全内存数据库。它确实将数据保存在磁盘上。它不是关系型,它是键值存储。

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

      【讨论】:

        【解决方案5】:

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

        它快速、可靠、提供原子性和一致性,并且具有集合、散列、列表等多种数据类型。

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

        【讨论】:

          【解决方案6】:

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

          用python实现

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

          【讨论】:

            【解决方案7】:

            Redis的用法:

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

            【讨论】:

              【解决方案8】:

              Redis 除了作为缓存服务器外,还专门作为数据结构服务器。 作为数据结构服务器形式的缓存意味着很多,因为数据结构是程序或应用程序的基础。考虑到您正在使用 SQL 数据库作为存储技术,并且需要构建列表、哈希图、排名集或类似的东西,这有点让人头疼。 Redis 可以以非常简单的方式直接为您提供这些功能,从而高度简化开发。

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

              【讨论】:

                【解决方案9】:

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

                • Redis 是一个非常快速的非关系型数据库,它存储键到五种不同类型值(字符串、哈希、列表、集合、排序集合、位图和超日志)的映射。 @Sripathi Krishnan 的回答详细解释了这一点。

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

                • 复制以扩展读取性能

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-01-28
                  • 2018-01-17
                  • 2015-09-14
                  • 2019-01-17
                  • 2018-08-20
                  • 2019-01-02
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多