MemcachedをCodeIgniterで記述されたPHPWebアプリと組み合わせて使用しています。このMemcachedライブラリを利用しますhttps://github.com/tomschlick/memcached-libraryデータをキャッシュするとき、有効期限を7200、つまり2時間にします。
モデルクエリのスニペット:
$result = $this->memcached_library->get(md5($sql));
if (!$result) {
$cursor = $this->db->query($sql);
$result = $cursor->row();
$this->memcached_library->set(md5($sql), $result, 7200);
}
return $result;
かっこいい、これはデータをMemcachedに設定するために機能します。結果を見ることができます、すべてがうまくいっています。問題は、このデータをMemcachedに配置してから2時間後に発生します。
私の理解では、get関数を実行すると、Memcachedは、キャッシュされたデータが有効期限を過ぎたことを認識し、無効としてマークする必要があります(ただし、必ずしもメモリから削除する必要はありません)。PHPがデータを取得するために呼び出すと、falseが返されます。これにより、ifステートメントがtrueと評価され、データが再フェッチされ、Memcachedにデータが再度設定されます。
ただし、Memcachedがデータが無効であるとは決して言わず、2時間の有効期限が切れる前から同じ古いデータがそこにあるように見えます。Memcachedでflushを手動で呼び出す(キャッシュ内のすべてのデータを無効にする)と、データは再びMemcachedに適切に設定されますが、同じ2時間の有効期限制限の問題が再び発生します。