3

我将 Memcached 与我用 CodeIgniter 编写的 PHP Web 应用程序结合使用。我利用这个 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

From memcached manual:

EXPIRATION TIME: If it's non-zero (either Unix time or offset in seconds from current time), it is guaranteed that clients will not be able to retrieve this item after the expiration time arrives (measured by server time).

So this should be NULL after expiration time. If it happens otherwise you have found a bug in Memcached or this library. Are you sure you are using "Memcached" and not "Memcache". From sources of the lib you linked:

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

Also i see this library is using local cache that is ignoring the expiry date:

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

So if your php script is running as daemon for a long period of time no actual Memcached request will be sent.

于 2013-01-09T11:48:35.553 回答