3

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時間の有効期限制限の問題が再び発生します。

4

1 に答える 1

1

memcachedマニュアルから:

有効期限:ゼロ以外(Unix時間または現在の時刻からの秒単位のオフセット)の場合、有効期限が到来した後(サーバー時間で測定)、クライアントはこのアイテムを取得できないことが保証されます。

したがって、これは有効期限後にNULLになるはずです。それ以外の場合は、Memcachedまたはこのライブラリにバグが見つかりました。「Memcache」ではなく「Memcached」を使用していますか?リンクしたライブラリのソースから:

$this->client_type = class_exists('Memcache') ? "Memcache" : (class_exists('Memcached') ? "Memcached" : FALSE);
// ...
log_message('debug', "Memcached Library: $this->client_type Class Loaded");

また、このライブラリは有効期限を無視しているローカルキャッシュを使用していることがわかります。

if(isset($this->local_cache[$this->key_name($key)]))
{
    return $this->local_cache[$this->key_name($key)];
}

したがって、phpスクリプトがデーモンとして長期間実行されている場合、実際のMemcachedリクエストは送信されません。

于 2013-01-09T11:48:35.553 に答える