Memcache の使用方法

このページでは、Google Cloud コンソールを使用してアプリケーションの Memcache サービスを構成、モニタリングする方法について説明します。また、App Engine の Memcache Python API を使用して、キャッシュに保存された値の設定や取得をする方法、同じ Memcache キーに対する同時書き込みリクエストをコンペア アンド セット機能を使用して処理する方法についても説明します。Memcache については、Memcache の概要をご覧ください。

Memcache を構成する

  1. Google Cloud Console の [Memcache] ページに移動します。
    [Memcache] ページに移動
  2. 使用する Memcache サービスレベルを選択します。

    • 共有(デフォルト) - 無料で、ベスト エフォート ベースでキャッシュ容量を提供します。
    • 専用 - キャッシュ サイズ使用量の GB 時間で請求され、アプリケーションに対して固定キャッシュ容量が独占的に割り当てられます。

    使用可能なサービスクラスについては、Memcache の概要をご覧ください。

値のキャッシュへの保存と取得

値をキャッシュに保存する

キーの値がまだ存在しない場合にのみ、add() を使用して追加します。有効期限を設定することもできます。

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

たとえば、値 raining をキー weather_USA_98105 に追加し、値の書き込み時点から 1 時間の有効期限を設定します。

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 Console で Memcache をモニタリングする

  1. Google Cloud Console の [Memcache] ページに移動します。
    [Memcache] ページに移動
  2. 次のレポートを調べます。
    • Memcache サービスレベル: アプリケーションが共有または専用のどちらのサービスレベルを使用しているかを示します。プロジェクトのオーナーの場合は、2 つのサービスレベルを切り替えることができます。詳細については、サービスレベルをご覧ください。
    • ヒット率: キャッシュから提供されたデータ リクエストのパーセンテージと、そのデータ リクエストの実数が表示されます。
    • キャッシュ内のアイテム
    • 最も古いアイテムの経過期間: 最も古いキャッシュされたアイテムの経過期間。アイテムの経過時間は使用(読み取りまたは書き込み)されるたびにリセットされます。
    • 総キャッシュ サイズ
  3. 次の操作を行うことができます。

    • 新しいキー: 新しいキーをキャッシュに追加します。
    • キーを検索: 既存のキーを取得します。
    • キャッシュをフラッシュ: キャッシュからすべてのキーと値のペアを削除します。
  4. (専用 Memcache のみ)ホットキーのリストを参照します。

    • 「ホットキー」は Memcache 内の 100 クエリ/秒(QPS)以上を受信するキーです。
    • このリストには QPS の高い順で並べ替えられた最大 100 個のホットキーが含まれます。

同時書き込みの処理

複数のリクエストによる同じ Memcache キーへの書き込みをコンペア アンド セット機能を使用して処理するには:

  1. Memcache Client オブジェクトをインスタンス化します。
  2. 再試行ループを使用します(再試行回数を制限して指数バックオフを使用することをおすすめします)。
    1. 再試行ループ内で、gets() または get_multi() を使用して、for_cas パラメータを True に設定してキーを取得します。
    2. 再試行ループ内で、cas() または cas_multi() を使用してキーの値を更新します。

次のスニペットは、コンペア アンド セット機能を使用する方法の 1 つを示したものです。

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() を使用する場合)に動作保証します。2 つ以上の異なるクライアント インスタンスが競合状態に陥っている場合は、cas() オペレーションを実行する 1 番目のみが成功し(戻り値 True)、2 番目以降は失敗します(戻り値 False)。

このサンプルコードにさらに改良を加えるとすれば、同じカウンタで多数の競合が生じるような最悪のシナリオで無限ループを回避できるように、再試行回数の上限を設定することが考えられます。このような競合は、カウンタの更新を試行するリクエストの数が Memcache サービスがリアルタイムで処理できる数を超えた場合などに発生する可能性があります。

コンペア アンド セットの詳細については、Memcache の概要をご覧ください。

次のステップ