ElastiCache 的常见使用案例以及 ElastiCache 能够如何帮助您
无论是提供最新资讯、前 10 位的排行榜、产品目录还是销售活动的门票,速度都是关键。传输内容的速度对您的网站和业务的成功有很大的影响。
《纽约时报》曾报道:“对于没有耐心的 Web 用户而言,一眨眼的功夫都显得太长
如果有人需要数据,在该数据已缓存的情况下,您可以更快地传输该数据。无论是网页还是推动业务决策的报告,都是如此。您的公司是否能在不缓存网页的情况下以可能最短的延迟传输网页?
直观上显著的一点是,您需要缓存请求次数最多的项目。但您为何不缓存请求次数极少的项目? 甚至最优化的数据库查询或远程 API 调用的速度也比从内存中的缓存检索平面密钥的速度慢得多。显著变慢是导致客户流失的原因。
下面的示例演示了使用 ElastiCache 提高应用程序的总体性能的一些方式。
内存中的数据存储
内存中密钥值存储的主要目的是,提供对数据副本的超快 (毫秒级延迟) 的、低成本的访问。大部分数据存储具有经常访问但很少更新的数据区域。此外,查询数据库将始终比在密钥值对缓存中查找密钥更慢且成本更高。某些数据库查询的执行成本特别高。例如,涉及跨多个表连接的查询或含有密集型计算的查询。通过缓存此类查询结果,您只需为查询支付一次费用。然后,您可以快速地多次检索数据,而无需重新执行查询。
我应对哪些数据进行缓存?
在决定要缓存的数据时,请考虑这些因素:
速度和费用 – 与从缓存中获取数据相比,从数据库中获取数据始终更慢且费用更高。一些数据库查询原本就比其他查询更慢且费用更高。例如,在多个表上执行连接的查询要比简单的单表查询更慢且费用更高。如果要使用速度慢且费用高的查询来获取所需数据,则这种情况适合使用缓存。如果要使用相对快速且简单的查询来获取数据,则这种情况可能也适合使用缓存,但具体取决于其他因素。
数据和访问模式 – 确定要缓存的数据还需要了解数据本身及其访问模式。例如,对快速变化或很少访问的数据进行缓存是没有意义的。为了使缓存具有真实的益处,数据应相对静态且被频繁访问。例如,社交媒体网站上的个人资料。另一方面,如果对数据进行缓存不会带来速度或成本优势,那么您将无需缓存数据。例如,对返回搜索结果的网页进行缓存是没有意义的,因为这些查询与结果通常是唯一的。
过时性– 根据定义,缓存的数据是过时的数据。即使在某些情况下它不是过时的,它也应该始终被认为是过时的并按过时数据处理。在判断数据是否适合使用缓存时,请确定应用程序对过时数据的容忍性。
您的应用程序也许能够在一种环境中容忍过时数据,但不能在另一种环境中容忍过时数据。例如,假设您的站点提供公开交易的股票价格。您的客户可能会接受一些过时性,并且免责声明价格可能存在 n 分钟延迟。但是,在向卖出或买入股票的经纪人提供股票的价格时,您需要实时数据。
在以下情况下,需要考虑对数据进行缓存:
与缓存检索相比,获取数据的速度更慢且费用更高。
用户经常访问您的数据。
您的数据保持相对相同,或者如果数据迅速发生变化,过时性不是一个大问题。
有关更多信息,请参阅 Memcached 缓存策略。
游戏排行榜
使用 Valkey 或 Redis OSS 排序集,您可以将排行榜的计算复杂性从应用程序转移到集群。
排行榜(例如,游戏的排名前 10 位的分数)的计算量比较大。当有大量并发玩家和不断变化的分数时,这一点尤其如此。Valkey 或 Redis OSS 排序集可确保唯一性和元素排序。对于排序集,每次有新元素加入排序集时,它都会实时重新排序。然后以正确的数字顺序添加到集合内。
在下图中,您可以看到 ElastiCache 游戏排行榜是如何运作的。
例 Valkey 或 Redis OSS 排行榜
在本示例中,使用 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
有关更多信息,请参阅有关排序集的 Valkey 文档
消息发送(Pub/Sub)
当您发送电子邮件时,可将它发送给一个或多个指定收件人。在 Valkey 和 Redis OSS pub/sub 范式中,您在不知道接收者(如果有)的情况下将消息发送到特定频道。消息的接收者是订阅该频道的人。例如,假设您订阅了 news.sports.golf 频道。您和所有其他订阅 news.sports.golf 频道的人会收到所有发布到 news.sports.golf 的消息。
Pub/sub 功能与任何键空间都没有关联。因此,它不会影响任何级别。下图展示了 ElastiCache 与 Valkey 和 Redis OSS 的消息收发。
订阅
要接收某个频道的消息,请订阅该频道。您可以订阅单个频道、多个指定频道或者与某个模式匹配的所有频道。要取消订阅,您可以取消订阅在订阅时指定的频道。或者,如果您使用模式匹配订阅,则可以使用之前使用的相同模式取消订阅。
例 - 订阅单个频道
要订阅单个频道,可以使用 SUBSCRIBE 命令并指定您要订阅的频道。在以下示例中,客户将订阅 news.sports.golf 频道。
SUBSCRIBE news.sports.golf
过段时间以后,客户使用 UNSUBSCRIBE 命令并指定要取消订阅的频道,来取消对该频道的订阅。
UNSUBSCRIBE news.sports.golf
例 - 订阅多个指定的频道
要订阅多个特定频道,请使用 SUBSCRIBE 命令列出频道。在以下示例中,客户将订阅 news.sports.golf、news.sports.soccer 和 news.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 命令的频道字符串必须匹配。您不能
PSUBSCRIBE到 new.* 和从 news.sports*PUNSUBSCRIBE或从 news.sports.golfUNSUBSCRIBE。PSUBSCRIBE和PUNSUBSCRIBE不适用于 ElastiCache 无服务器。
发布
要向某个频道的所有订阅者发送消息,请使用 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."
客户无法向其订阅的频道发布消息。
有关更多信息,请参阅 Valkey 文档中的 Pub/Sub
推荐数据(哈希)
在 Valkey 或 Redis OSS 中使用 INCR 或 DECR 简化了编译推荐。每当用户对产品“给予好评”时,您就会增加一个 item:productID:like 计数器。每当用户对产品“给予差评”时,您就会增加一个 item:productID:dislike 计数器。借助哈希,您还可以维护一个已对产品给予好评或差评的人员的列表。
例 - 给予好评和给予差评
INCR item:38923:likes HSET item:38923:ratings Susan 1 INCR item:38923:dislikes HSET item:38923:ratings Tommy -1
生成式人工智能应用程序的语义缓存
向大语言模型(LLM)发起推理调用所产生的成本和延迟,大规模运行生成式人工智能应用程序可能很有挑战性。您可以在生成式人工智能应用程序中使用 ElastiCache 进行语义缓存,从而降低 LLM 推理调用的成本和延迟。借助语义缓存,您可以通过基于向量的匹配来查找当前提示与先前提示之间的相似性,从而返回缓存的响应。如果用户的提示在语义上与先前的提示相似,则系统将返回缓存的响应,而不是发起新的 LLM 推理调用,从而降低生成式人工智能应用程序的成本,并提供更快的响应速度以改善用户体验。您可以通过为提示配置相似度阈值并应用标签或数值元数据筛选条件,来控制将哪些查询路由到缓存。
ElastiCache 的向量搜索提供内联实时索引更新,可帮助确保缓存随着用户提示和 LLM 响应流入而持续更新。这种实时索引对于维持缓存结果的新鲜度和缓存命中率至关重要,对于高峰流量尤其如此。此外,ElastiCache 还通过成熟的缓存基元(例如按密钥 TTL、可配置的驱逐策略、原子操作以及丰富的数据结构和脚本支持)简化了语义缓存的操作。
用于生成式人工智能助手和座席的内存
您可以使用 ElastiCache 实施记忆机制,将跨会话对话历史记录呈现给 LLM,从而提供更加个性化、更具上下文感知的响应。对话记忆让生成式人工智能助手和座席能够保留和使用过去的互动,从而提供个性化响应并提升相关性。但是,简单地将之前的所有互动汇总到提示中是无效的,因为无关的额外令牌会增加成本,降低响应质量,并有可能超出 LLM 的上下文窗口。相反,您可以使用向量搜索,在每次调用 LLM 时,仅检索并提供上下文中最相关的数据。
ElastiCache for Valkey 支持与开源内存层集成,从而提供内置连接器,用于存储和检索 LLM 应用程序和座席内存。ElastiCache 的向量搜索可提供快速的索引更新,确保内存保持最新,并使新存储的内容立即可供搜索。低延迟向量搜索支持快速查找内存,使其能够在每个请求的在线路径中实施,而不仅限于后台任务。除了向量搜索外,ElastiCache for Valkey 还提供用于会话状态、用户首选项和功能标记的缓存基元,通过单一服务将短期会话状态与长期“记忆”存储在同一数据存储中。
检索增强生成(RAG)
RAG 指的是通过在提示中为 LLM 提供最新信息来提升响应相关性的过程。RAG 通过将输出与现实世界的数据来源关联来减少幻觉并提高事实准确性。RAG 应用程序利用向量搜索,从知识库中检索语义相关的内容。ElastiCache 可提供低延迟向量搜索,因此适合在具有数百万个及以上向量的大型数据集的工作负载中实现 RAG。此外,ElastiCache 还支持在线向量索引更新,非常适合在需要确保上传的所有数据立即可供搜索的上传工作流程中用作助手。代理式人工智能系统中的 RAG 可确保代理获得最新信息,以便准确执行操作。低延迟向量搜索对代理式人工智能系统中的 RAG 也至关重要,在这些系统中,单个查询可以触发多个 LLM 调用,并累积底层向量搜索产生的延迟。
下图展示了一个示例架构,该架构使用 ElastiCache 实现语义缓存、内存机制和 RAG,以增强生产环境中的生成式人工智能应用程序。
语义搜索
向量搜索根据语义或特征的相似度,检索最相关的文本、语音、图像或视频数据。该功能支持依赖于跨不同数据模式进行相似度搜索的机器学习应用程序,包括推荐引擎、异常检测、个性化和知识管理系统。推荐系统采用向量表示来捕捉用户行为和项目特征中的复杂模式,从而能够推荐最相关的内容。ElastiCache 的向量搜索非常适合这些应用程序,因为它具有近乎实时的更新和低延迟,可以进行相似度比较,从而根据实时用户互动即时提供高度相关的推荐。
ElastiCache 客户评价
要了解像 Airbnb、PBS、Esri 这样的企业和其他使用 Amazon ElastiCache 的企业如何改善客户体验,从而拓展业务,请参阅其他人如何使用 Amazon ElastiCache