使用 Memcache

本页面介绍如何使用 Google Cloud 控制台为您的应用配置和监控 Memcache 服务,本页面还介绍了如何使用 App Engine Memcache Python API 来设置和检索缓存值,以及如何使用“比较和设置”功能来处理对同一个 Memcache 键的并发写入请求。要详细了解 Memcache,请参阅 Memcache 概览

配置 memcache

  1. 转到 Google Cloud 控制台中的 Memcache 页面。
    转到 Memcache 页面
  2. 选择要使用的 Memcache 服务等级:

    • 共享(默认值)- 免费,尽力提供缓存容量。
    • 专用 - 按照缓存大小以 GB 小时计费,提供专门为您的应用分配的固定缓存容量。

    如需详细了解可用的服务等级,请参阅 Memcache 概览

缓存值和检索值

缓存值

当且仅当键没有赋值时,使用 add() 为其添加一个值,到期时间为可选项:

memcache.add(key="[KEY]", value="[VALUE]", time=[EXPIRATION_TIME])

例如,如需为 weather_USA_98105 键添加 raining 值,并将到期时间设置为写入值后的一小时,请使用以下命令:

memcache.add(key="weather_USA_98105", value="raining", time=3600)

如需详细了解 add() 和其他设置值的方法,请参阅 Memcache Python API 文档

访问 Memcache 示例,查看缓存值的其他示例。

查找缓存值

使用 get() 查找单个键的值:

memcache.get(key="[KEY]")

例如,如需获取键 weather_USA_98105 的值,请运行以下命令:

memcache.get(key="weather_USA_98105")

如需详细了解 get() 和其他查找值的方法,请参阅 Memcache Python API 文档

在 Google Cloud 控制台中监控 Memcache

  1. 转到 Google Cloud 控制台中的 Memcache 页面。
    转到 Memcache 页面
  2. 查看以下报告:
    • Memcache 服务等级:显示您的应用使用的服务等级为“共享”还是“专用”。如果您是项目的所有者,则可以在两者之间切换。详细了解服务等级
    • 命中率:显示从缓存处理的数据请求的百分比,以及从缓存处理的数据请求的原始数量。
    • 缓存中的内容
    • 最早的内容的存续时间:最早缓存的内容的存续时间。请注意,每次使用内容时(无论是读取还是写入)都会重置其存续时间。
    • 总缓存大小
  3. 您可以执行以下任何操作:

    • 新建键:向缓存添加新键。
    • 查找键:检索现有键。
    • 清空缓存:移除缓存中的所有键值对。
  4. (仅限专用 Memcache 使用)查看热键列表。

    • “热键”是 Memcache 中收到的每秒查询次数 (QPS) 超过 100 的键。
    • 该列表包含最多 100 个热键,按 QPS 的多少降序排列。

处理并发写入

如需使用“比较和设置”功能处理对同一个 Memcache 键的多条写入请求,请执行以下操作:

  1. 实例化 Memcache Client 对象。
  2. 使用重试循环(最好设置重试次数上限并使用指数退避算法)
    1. 在重试循环内,使用 gets()get_multi() 获取键,并将 for_cas 参数设置为 True
    2. 在重试循环内,使用 cas()cas_multi() 更新键值。

以下代码段展示了使用“比较和设置”功能的一种方法:

def bump_counter(key):
   client = memcache.Client()
   while True: # Retry loop
     counter = client.gets(key)
     if counter is None: raise KeyError('Uninitialized counter')
     if client.cas(key, counter+1):
        break

如果不使用重试循环,上述代码将不会避免竞争条件,而只是对其进行检测,因此,有必要添加重试循环。Memcache 服务会确保应用于上述模式时(即使用 gets()cas()),如果两个(或更多)不同的客户端实例恰好参与竞争条件,则只有执行 cas() 操作的第一个实例能成功运行(返回 True),而第二个(以及后续的)实例将失败(返回 False)。

此外,您还应该设置重试次数上限来对示例代码进行优化,以避免在发生大量争用同一计数器的最糟糕情况下陷入无限循环。如果更新计数器的请求数量超过了 memcache 服务可以实时处理的上限,便可能发生此类争用。

如需详细了解“比较和设置”功能,请参阅 Memcache 概述

后续步骤