Redis是一种最适合分布式环境/微服务架构的缓存。
它快速,可靠,提供原子性和一致性,并具有一系列数据类型,如集合,哈希,列表等。
我在过去的一年里使用它,当你需要非常快速地提供生产就绪解决方案以及任何与性能相关的问题时,它确实是一个救星,因为你可以随时使用它来缓存数据。
不,Redis不仅仅是一个缓存。
像Cache一样,Redis存储key = value对。但与缓存不同,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 并回到最重要的问题。
zrevrange
最后,奖金功能。如果您打开问题页面,SO会在添加新问题时通知您。 Redis如何在这里提供帮助?
Redis有一个pub-sub模型。您可以创建频道,例如“channel_questions_tagged_redis”。然后是你 subscribe 用户到特定频道。添加新问题时,您会这样做 publish 给该频道的消息。然后所有用户都会收到消息。您将不得不使用Web套接字或彗星等Web技术将消息实际传递到浏览器,但Redis可以帮助您完成服务器端的所有管道。
subscribe
publish
与Cache不同,Redis会将数据保留在硬盘上。您可以使用主从设置来提供更好的可靠性。要了解更多信息,请在此处查看持久性和复制主题 - http://redis.io/documentation
不只是缓存。
实际上,相对数据表示(或任何类型的数据表示)与数据库角色(缓存,永久持久性等)之间没有依赖关系。
Redis很适合缓存它是真的,但它只是一个缓存。它是高速完全内存数据库。它确实在磁盘上保留数据。它不是关系型的,而是键值存储。
我们在生产中使用它。 Redis帮助我们构建软件,每秒处理数千个请求,并在整个自然生命周期中保留客户业务数据。
Redis具有独特的能力,如超快速的lua脚本。它的执行时间等于C命令的执行。这也为工作许多高级对象(如Locks和Semaphores)所需的复杂Redis数据操作带来了原子性。
有一个Redis基于内存数据网格调用 Redisson 这允许轻松构建 的 Java上的分布式应用程序 强> 。感谢分发 Lock , Semaphore , ReadWriteLock , CountDownLatch , ConcurrentMap 对象和许多其他人。
Lock
Semaphore
ReadWriteLock
CountDownLatch
ConcurrentMap
完美适用于云和支持 AWS Elasticache , AWS Elasticache群集 和 Azure Redis缓存 支持