用于 Redis 的 Amazon ElastiCache
ElastiCache for Redis 用户指南 (API 版本 2015-02-02)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

常用 ElastiCache 使用案例以及 ElastiCache 如何提供帮助

无论是提供最新资讯、前 10 位的排行榜、产品目录还是销售活动的门票,速度都是关键。传输内容的速度对您的网站和业务的成功有很大的影响。

在“对于没有耐心的 Web 用户而言,一眨眼的功夫都显得太长”中,《纽约时报》报道用户会记下竞争网站之间的 250 毫秒(1/4 秒)的差异。用户将离开速度较慢的网站并转至速度较快的网站。网页加载时间与访客流失率的相关性中引用的 Amazon 所进行的测试表明,加载时间每增加 100 毫秒(1/10 秒),销售额就会减少 1%。

如果某人需要的数据已缓存,则您可以更快地提供该数据。无论是网页还是驱动业务决策的报告,都是如此。您的公司是否能在不缓存网页的情况下以可能最短的延迟传输网页?

直观上显著的一点是,您需要缓存请求次数最多的项目。但您为何不缓存请求次数极少的项目? 甚至最优化的数据库查询或远程 API 调用的速度也比从内存中缓存检索平面密钥的速度慢得多。显著变慢是导致客户流失的原因。

下面的示例演示了使用 ElastiCache 提高应用程序的总体性能的一些方式。

内存中的数据存储

内存中密钥值存储的主要目的是,提供对数据副本的超快 (毫秒级延迟) 的、低成本的访问。大部分数据存储具有经常访问但很少更新的数据区域。此外,查询数据库将始终比在密钥值对缓存中查找密钥更慢且成本更高。某些数据库查询执行起来特别昂贵。一个示例是涉及跨多个表的联接的查询或具有密集计算的查询。通过缓存此类查询结果,您只需支付一次查询价格。然后,您可以多次快速检索数据,而无需重新执行查询。

下图显示了 ElastiCache 缓存。


				图像:ElastiCache 缓存

我应对哪些数据进行缓存?

在决定要缓存的数据时,请考虑这些因素:

速度和费用 – 与从缓存中获取数据相比,从数据库中获取数据始终更慢且费用更高。一些数据库查询原本就比其他查询更慢且费用更高。例如,在多个表上执行联接的查询比简单的单个表查询更慢且费用更高。如果要使用速度慢且费用高的查询来获取所需数据,则该数据是要缓存的候选项。如果要使用相对快速且简单的查询来获取数据,则该数据可能仍是要缓存的候选项,具体取决于其他因素。

数据和访问模式 – 确定要缓存的数据还需要了解数据本身及其访问模式。例如,对快速变化或很少访问的数据进行缓存是没有意义的。要使缓存提供真正的好处,数据应该是相对静态的且经常被访问。一个示例是社交媒体网站上的个人资料。另一方面,如果对数据进行缓存不会提供速度或成本优势,那么您将无需缓存数据。例如,对返回搜索结果的网页进行缓存是没有意义的,因为查询与结果通常是唯一的。

过时 – 根据定义,缓存的数据是过时的数据。即使数据在特定环境中是未过时的,也应始终将其视为过时数据。要判断数据是否为要缓存的候选项,请确定应用程序对过时数据的容忍性。

您的应用程序也许能够在一种环境中容忍过时数据,但不能在另一种环境中容忍过时数据。例如,假设您的网站提供公开交易的股票价格。您的客户可能接受对价格可能延迟 n 分钟具有免责声明的某种过时性。但是,如果您向进行销售或购买的经纪人提供该股票价格,您需要实时数据。

在以下情况下,需要考虑对数据进行缓存:

  • 与缓存检索相比,获取数据的速度更慢或费用更高。

  • 用户经常访问您的数据。

  • 您的数据保持相对相同,或者如果它快速变化,过时并不是一个大问题。

有关更多信息,请参阅下列内容:

游戏排行榜 (Redis 排序集)

Redis 排序集将排行榜的计算复杂性从应用程序移至 Redis 集群。

排行榜(例如游戏的前 10 个分数)在计算上非常复杂。当存在大量并发玩家并且不断更改分数时,尤其如此。Redis 排序集可确保唯一性和元素排序。使用 Redis 排序集时,每次将新元素添加到排序集时,它都会实时重新排序。然后它会按正确数字顺序添加到集中。

在下图中,您可以看到 ElastiCache for Redis 游戏排行榜如何工作。

图像:ElastiCache for Redis 游戏排行榜图

例 - Redis 排行榜

在本示例中,使用 ZADD 将 4 个游戏玩家及其分数输入排序后的列表中。命令 ZREVRANGEBYSCORE 按玩家的分数列出玩家(从高到低)。紧接着,使用 ZADD 覆盖现有条目来更新 June 的分数。最后,ZREVRANGEBYSCORE 按玩家的分数列出玩家(从高到低)。列表显示 June 的排名已上升。

ZADD leaderboard 132 Robert ZADD leaderboard 231 Sandra ZADD leaderboard 32 June ZADD leaderboard 381 Adam ZREVRANGEBYSCORE leaderboard +inf -inf 1) Adam 2) Sandra 3) Robert 4) June ZADD leaderboard 232 June ZREVRANGEBYSCORE leaderboard +inf -inf 1) Adam 2) June 3) Sandra 4) Robert

以下命令告诉 June 她在所有玩家中的排名。由于排名是从零开始的,因此 ZREVRANK 会为排名第二的 June 返回 1。

ZREVRANK leaderboard June 1

有关更多信息,请参阅有关排序集的 Redis 文档

消息发送 (Redis Pub/Sub)

当您发送电子邮件时,可将它发送给一个或多个指定收件人。在 pub/sub 范式中,您在不知道接收者 (如果有) 的情况下将消息发送到特定频道。获得消息的人是订阅该频道的人。例如,假设您订阅了 news.sports.golf 频道。您和所有其他订阅 news.sports.golf 频道的人会获得所有发布到 news.sports.golf 的消息。

Redis pub/sub 功能与任何密钥空间都没有关联。因此,它不会影响任何级别。在下图中,您可以找到 ElastiCache for Redis 消息的示意图。

图像:ElastiCache for Redis 消息图

订阅

要接收某个频道上的消息,请订阅该频道。您可以订阅单个频道、多个指定频道或者与某个模式匹配的所有频道。要取消订阅,请取消订阅您在订阅时指定的频道。或者,如果您使用模式匹配进行订阅,请使用之前使用的相同模式取消订阅。

例 - 订阅单个频道

要订阅单个频道,可以使用 SUBSCRIBE 命令并指定您要订阅的频道。在以下示例中,客户将订阅 news.sports.golf 频道。

SUBSCRIBE news.sports.golf

过段时间以后,客户使用 UNSUBSCRIBE 命令并指定要取消订阅的频道,来取消对该频道的订阅。

UNSUBSCRIBE news.sports.golf

例 - 订阅多个指定的频道

要订阅多个特定频道,请使用 SUBSCRIBE 命令列出频道。在以下示例中,客户将订阅 news.sports.golfnews.sports.soccernews.sports.skiing 频道。

SUBSCRIBE news.sports.golf news.sports.soccer news.sports.skiing

要取消对特定频道的订阅,请使用 UNSUBSCRIBE 命令并指定要取消订阅的频道。

UNSUBSCRIBE news.sports.golf

要取消对多个频道的订阅,请使用 UNSUBSCRIBE 命令并指定要取消订阅的频道。

UNSUBSCRIBE news.sports.golf news.sports.soccer

要取消所有订阅,请使用 UNSUBSCRIBE 并指定每个频道。或者使用 UNSUBSCRIBE 而不指定频道。

UNSUBSCRIBE news.sports.golf news.sports.soccer news.sports.skiing

或者

UNSUBSCRIBE

例 - 使用模式匹配进行订阅

客户可以使用 PSUBSCRIBE 命令订阅与某个模式匹配的所有频道。

在以下示例中,客户将订阅所有体育频道。您不必像使用 SUBSCRIBE 时那样单独列出所有体育频道,而是通过 PSUBSCRIBE 命令,使用模式匹配。

PSUBSCRIBE news.sports.*

例 取消订阅

要取消对这些频道的订阅,请使用 PUNSUBSCRIBE 命令。

PUNSUBSCRIBE news.sports.*

重要

发送到 [P]SUBSCRIBE 命令与 [P]UNSUBSCRIBE 命令的频道字符串必须匹配。您不能对 news.* 执行 PSUBSCRIBE 命令,而对 news.sports.* 执行 PUNSUBSCRIBE 命令或对 news.sports.golf 执行 UNSUBSCRIBE 命令。

发布

要向某个频道的所有订阅者发送消息,请使用 PUBLISH 命令,并指定频道和消息。以下示例将消息“It’s Saturday and sunny.I’m headed to the links.”发布到 news.sports.golf 频道。

PUBLISH news.sports.golf "It's Saturday and sunny. I'm headed to the links."

客户端无法发布到其订阅的频道。

有关更多信息,请参阅 Redis 文档中的 Pub/Sub

推荐数据(Redis 哈希)

在 Redis 中使用 INCR 或 DECR 简化了编译推荐。每当用户对产品“给予好评”时,您就会增加一个 item:productID:like 计数器。每当用户对产品“给予差评”时,您就会增加一个 item:productID:dislike 计数器。借助 Redis 哈希,您还可以维护一个已对产品给予好评或差评的人员的列表。下图说明 ElastiCache for Redis 实时分析存储。

图像:ElastiCache for Redis 实时分析存储

例 - 给予好评和给予差评

INCR item:38923:likes HSET item:38923:ratings Susan 1 INCR item:38923:dislikes HSET item:38923:ratings Tommy -1

其他 Redis 用法

Salvatore Sanfilippo 的博客文章 How to take advantage of Redis just adding it to your stack 讨论了许多常见的数据库问题以及如何使用 Redis 轻松解决这些问题。此方法从数据库中删除负载并提高性能。

ElastiCache 客户评价

要了解 Airbnb、PBS、Esri 等企业如何使用 Amazon ElastiCache 改善客户体验,从而拓展业务,请参阅其他人如何使用 Amazon ElastiCache

您还可以观看 ElastiCache 视频 以了解更多 ElastiCache 客户使用案例。