Redis只是一个caching吗?

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

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

我错过了什么?

不,Redis不仅仅是一个caching。

像Cache一样,Redis存储key = value对。 但是与caching不同的是,Redis允许您对值进行操作。 Redis中有5种数据types – string,集合,哈希,列表和sorting集合。 每种数据types公开各种操作。

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

比方说,我们想build立StackOverflow.com。 为了保持简单,我们需要问题,答案,标签和用户。

build模问题,用户和答案

每个对象都可以build模为一个Map。 例如,一个问题是一个包含字段{id,title,date_asked,votes,asking_by,status}的地图。 同样,答案也是一个包含字段{id,question_id,answer_text,answers_by,votes,status}的地图。 同样,我们可以build模一个用户对象。

这些对象中的每一个都可以作为散列直接存储在Redis中。 要生成唯一标识符,可以使用primefaces增量命令。 像这样的东西 –

$ 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,可以使用stream水线从Redis中检索项目并将其显示给用户。

按标签sorting的问题,按票数sorting

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

为了build模,我们使用Redis的Sorted Setfunction。 分类集允许您将分数与每个元素相关联。 然后,您可以根据分数检索元素。

让我们继续为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" 

我们在这里做了什么? 我们将问题添加到已sorting的集合,并将每个问题的得分(投票数)关联起来。 每次提问都会提高分数。 而当用户点击“标签为Redis的问题,按票数sorting”时,我们只是做一个zrevrange ,回到顶端的问题。

实时问题,无需刷新页面

最后,奖金function。 如果您保持打开问题页面,当添加新的问题时,SO会通知您。 Redis如何在这里帮忙?

Redis有一个pub-sub模型。 您可以创build频道,例如“channel_questions_tagged_redis”。 然后,您将subscribe到特定频道。 当添加新的问题时,您将publish消息到该频道。 所有的用户会得到这个消息。 您将不得不使用Websockets或彗星等Web技术将消息实际传递给浏览器,但Redis可以帮助您完成服务器端的所有pipe道工作。

持久性,可靠性等

与caching不同,Redis将数据保存在硬盘上。 你可以有一个主从设置来提供更好的可靠性。 要了解更多信息,请查看这里的持久性和复制主题 – http://redis.io/documentation

实际上,相对数据表示(或任何types的数据表示)和数据库angular色(caching,永久持久性等)之间不存在依赖关系。

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

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

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

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

完美适用于云,支持AWS Elasticache , AWS Elasticache Cluster和Azure Redis Cache支持