Amazon ElastiCache
用户指南 (API Version 2015-02-02)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

ElastiCache 使用案例

无论是提供最新资讯、前 10 位的排行榜、产品目录还是销售活动的门票,速度都是关键。传输内容的速度对您的网站和业务的成功有很大的影响。《纽约时报》在 2012 年所做的调查表明,“对于没有耐心的 Web 用户而言,一眨眼的功夫都显得太长,”用户会记下竞争网站之间的 250 毫秒(1/4 秒)的差异,他们将离开速度较慢的网站并转至速度较快的网站。Amazon 在 2007 年进行了一项测试(引自网页加载时间与访客流失率的相关性),结果表明,加载时间每增加 100 毫秒(1/10 秒),销售额就会减少 1%。当某人需要数据(无论是网页数据还是推动业务决策的报告数据)时,如果该数据已缓存,您便能更快地传输数据。您的公司是否能在不缓存网页的情况下以可能最短的延迟传输网页?

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

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

内存中数据缓存

内存中密钥值存储的主要目的是,提供对数据副本的超快(毫秒级延迟)的、低成本的访问。大部分数据存储具有经常访问但很少更新的数据区域。此外,查询数据库将始终比在密钥值对缓存中查找密钥更慢且成本更高。有一些数据库查询的执行成本非常高,例如,涉及跨多个表联接的查询或使用密集型计算的查询。通过对此类查询结果进行缓存,您只需为查询支付一次费用,便能快速地检索数据多次,而无需重新执行查询。

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

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

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

数据和访问模式 - 确定要缓存的数据还需要了解数据本身及其访问模式。例如,对快速变化或很少访问的数据进行缓存是没有意义的。为了使缓存更有意义,数据应相对静态且被频繁访问,例如社交媒体站点上的个人资料。相反,如果对数据进行缓存不会提供速度或成本优势,那么您将无需缓存数据。例如,对返回搜索结果的网页进行缓存是没有意义的,因为此类查询与结果几乎始终是唯一的。

过时 - 根据定义,缓存的数据是过时的数据,即使数据在特定环境中是未过时的,也应将其视为过时数据。在确定数据是否为要缓存的候选项时,您需要确定应用程序对过时数据的容忍性。您的应用程序也许能够在一种环境中容忍过时数据,但不能在另一种环境中容忍过时数据。例如,在网站上提供公开交易的股票价格时,过时性可能是完全可以接受的,并且将提供有关价格更新可能出现最多 n 分钟延迟的免责声明。但是,在向经纪人提供同一只股票的价格时,您需要实时数据来进行交易。

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

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

  • 访问数据的频率较高。

  • 数据是相对静态的,或者在数据快速变化的情况下,过时性不是重要问题。

有关更多信息,请参阅 缓存策略

游戏排行榜 (Redis 排序列表)

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

排行榜(例如,游戏的排名前 10 位的分数)的计算量比较大,尤其是在有大量并发玩家和不断变化的分数的情况下。Redis 排序集可确保唯一性和元素排序。通过使用 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 功能与任何密钥空间都没有关联。因此,它不会影响任何级别。

订阅

要接收某个频道上的消息,您必须订阅该频道。您可以订阅单个频道、多个指定频道或者与某个模式匹配的所有频道。要取消订阅,您可以取消订阅在订阅时指定的频道;如果您是使用模式匹配来订阅的,则可以使用相同的模式取消订阅。

例 - 订阅单个频道

要订阅单个频道,可以使用 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 计数器与哈希简化了编译推荐。每当用户对产品“给予好评”时,您就会增加一个 item:productID:like 计数器。每当用户对产品“给予差评”时,您就会增加一个 item:productID:dislike 计数器。借助 Redis 哈希,您还可以维护一个已对产品给予好评或差评的人员的列表。

例 - 给予好评和给予差评

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

其他 Redis 用法

在 Salvatore Sanfilippo 撰写的文章如何通过将 Redis 添加到堆栈中来利用它中,讨论了大量常见数据库用法以及如何使用 Redis 轻松解决数据库,从而减少数据库的负载并提高性能。

客户评价

转至客户评价以了解像 Airbnb、PBS、Esri 这样的企业和其他企业如何通过 Amazon ElastiCache 改善其客户体验,从而拓展业务。