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

使用案例以及 ElastiCache 如何帮助

无论是提供最新资讯、前 10 位的排行榜、产品目录还是销售活动的门票,速度都是关键。传输内容的速度对您的网站和业务的成功有很大的影响。《纽约时报》在 2012 年报道,“对于没有耐心的 Web 用户而言,一眨眼的功夫都显得太长,”用户会记下竞争网站之间的 250 毫秒(1/4 秒)的差异。他们将离开速度较慢的网站并转至速度较快的网站。Amazon 在 2007 年进行了一项测试 (引自网页加载时间与访客流失率的相关性),结果表明,加载时间每增加 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 客户使用案例。