【问题标题】:Memcached not listening to expiration timeMemcached 不监听过期时间
【发布时间】:2013-01-08 23:20:39
【问题描述】:

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

【问题讨论】:

    标签: php mysql codeigniter memcached


    【解决方案1】:

    来自 memcached 手册:

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

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

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

    【讨论】:

    • 到目前为止这很好,谢谢!我很肯定我正在使用 Memcached,因为我是通过 apt-get 自己安装它的。我可以远程登录到我的 VPS 上的 Memcached 并查看平板,我知道它正在工作并且数据正在存储到其中。你肯定对这个 local_cache 变量感兴趣。我现在要研究一下!
    • 经过进一步调查,这行$this->client_type = class_exists('Memcache') ? "Memcache" : (class_exists('Memcached') ? "Memcached" : FALSE);才是罪魁祸首。我安装了 Memcache 和 Memcached 库。它自动选择了 Memcache 库。 Memcache 的所有查询都包含一个压缩参数$this->m->add($this->key_name($key), $value, $this->config['config']['compression'], $expiration);,该行在配置文件中默认为“FALSE”,这意味着永不过期。要修复,我只是手动输入 $this->client_type = "Memcached"
    猜你喜欢
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多