0

キャッシュには Yii フレームワークと Memcached を使用しています。

次の問題があります。

  1. dbクエリqを作成します
  2. q がすでにキャッシュされている場合、memcache からデータを取得します
  3. それ以外の場合、yii は Mysql を照会します
  4. キャッシュ値を設定する
  5. memcache から結果が返されます

memcache キーが設定される前 (手順 4 の前) に同じクエリ q を再度リクエストすると、memcache キーが設定されていないため、db に対して再度クエリを実行します。

この動作を次のように変更したいと考えています。

  1. dbクエリqを作成します
  2. q のキーが memcache に存在し、値が null でない場合は戻り値
  3. それ以外の場合、キーが設定され、値が null の場合は、memcache キーを設定 => null
  4. キャッシュ値を設定する
  5. memcache から結果が返されます

これが何が起こるか、そして私たちが望むものの疑似コードです:

get(q):
    if q not in memcache:
        value = query_db(q)
        memcache[q] = value
        return memcache[q]
    else:
        return memcache[q]

getNew(q):
    if q not in memcache:
        memcache[q] = null
        value = query_db(q)
        memcache[q] = value
        return memcache[q]
    elif q in memcache and memcache[q] != null:
        return memcache[q]
    else:
        while True:
            if memcached[q] != null:
                return memcached[q]
            else:
               sleep(3)

つまり、結果を null にする前に memcache キーを設定し、同じクエリの他のリクエストで値が null かどうかを確認し、値が null でなくなるまで待機します (クエリが既に処理されていることを意味します)。 )。

yii フレームワークのどの部分を変更する必要があるか知っていますか?

4

1 に答える 1