キャッシュには Yii フレームワークと Memcached を使用しています。
次の問題があります。
- dbクエリqを作成します
- q がすでにキャッシュされている場合、memcache からデータを取得します
- それ以外の場合、yii は Mysql を照会します
- キャッシュ値を設定する
- memcache から結果が返されます
memcache キーが設定される前 (手順 4 の前) に同じクエリ q を再度リクエストすると、memcache キーが設定されていないため、db に対して再度クエリを実行します。
この動作を次のように変更したいと考えています。
- dbクエリqを作成します
- q のキーが memcache に存在し、値が null でない場合は戻り値
- それ以外の場合、キーが設定され、値が null の場合は、memcache キーを設定 => null
- キャッシュ値を設定する
- 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 フレームワークのどの部分を変更する必要があるか知っていますか?