Memcached没有听到过期时间

时间:2013-01-08 23:20:39

标签: php mysql codeigniter memcached

我将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小时到期限制问题。

1 个答案:

答案 0 :(得分:1)

来自memcached手册:

  

到期时间:   如果它不为零(Unix时间或偏移量,以秒为单位)   当前时间),保证客户无法做到   在到期时间到来之后检索此项目(通过测量   服务器时间)。

所以在到期时间之后应该为NULL。如果它发生,否则你在Memcached或这个库中发现了一个错误。你确定你使用的是“Memcached”而不是“Memcache”。从您链接的lib的来源:

$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请求。