首页 文章

Redis只是一个缓存吗?

提问于
浏览
222

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

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

我错过了什么?

5 回答

  • 0

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

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

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

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

    建模问题,用户和答案

    每个对象都可以建模为Map . 例如,问题是包含字段{id,title,date_asked,votes,ask_by,status}的 Map . 同样,答案是带有字段{id,question_id,answer_text,answers_by,votes,status}的 Map . 同样,我们可以为用户对象建模 .

    这些对象中的每一个都可以作为哈希直接存储在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"
    

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

    没有刷新页面的

    实时问题

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

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

    持久性,可靠性等

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

  • 1

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

    内存数据网格中有一个名为Redisson的Redis,可以轻松构建 distributed application on Java . 感谢分发 LockSemaphoreReadWriteLockCountDownLatchConcurrentMap 对象和许多其他对象 .

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

  • 2

    不只是缓存 .

    • 在内存键值存储中

    • 支持多种数据类型(字符串,散列,列表,集合,有序集,位图和超级日志)

    • 它提供了将缓存数据存储到物理存储(如果需要)的功能 .

    • 支持pub-sub模型

    • Redis缓存提供高可用性复制(主/从)

  • 3

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

    Redis很适合缓存它是真的,但它只是一个缓存 . 它是高速完全内存数据库 . 它确实在磁盘上保留数据 . 它不是关系型的,而是键值存储 .

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

  • 575

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

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

    我在过去的一年里使用它,当你需要非常快速地提供 生产环境 就绪解决方案以及任何与性能相关的问题时,它确实是一个救星,因为你可以随时使用它来缓存数据 .

相关问题