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