Memcache - 从memcache中删除的值重新出现

时间:2016-07-08 16:57:35

标签: php memcached

我使用memcache存储Zend_Config(和其他值) - 我按如下方式设置值:

$memcache = new Memcache();
...

if (!$config = $memcache->get($memcache->unique_key.APPLICATION_DOMAIN."#config"))
{
    ...
    $memcache->set($memcache->unique_key.APPLICATION_DOMAIN."#config", $config);
}

我按如下方式删除值:

$memcache->delete($key);

删除memcache中的值后,它会在与删除相同的连接中正确显示 - 正确调用$memcache->get($key)会给我NULL。但是,当我刷新脚本(并与memcache建立新连接)时,数据会弹回,就好像memcache状态没有更新一样。我尝试使用replace代替(具有某些特定值),效果相同 - 值不会更新。

调用$memcache->flush()有效,并从memcache中删除所有内容,但我想删除特定的密钥。

在手册页上,5年前发生了一条关于PECL版本与memcached之间不兼容的神秘信息(但是5年前的情况)。有人可以向我解释可能会发生什么吗?

我在PHP 5.6上使用memcached 1.4.21和memcache(PECL)3.0.8

2 个答案:

答案 0 :(得分:7)

问题源于使用此问题:

$list = array();
$allSlabs = $memcache->getExtendedStats('slabs');

foreach ($allSlabs as $server => $slabs)
    foreach ($slabs as $slabId => $slabMeta)
        foreach ($memcache->getExtendedStats('cachedump', (int) $slabId) as $entries)
            if (!empty($entries))
                foreach ($entries as $key => $entry)
                    if (strpos($key, $memcache->unique_key) === 0)
                    {
                        $value = $memcache->get($key);
                        $list[$key] = is_string($value) && unserialize($value) ? unserialize($value) : $value;
                    }

(您注意到它未包含在原始查询中,因为它不会执行任何内容,但会列出存储在memcached中的键/值)< / p>

这个功能的问题在于它显然是静默地导致memcached成为只读的。虽然更新函数的后续调用所提供的值(因为,我认为,它们是从本地内存中检索的),但memcached服务中的值不是

此行为会影响当前最新版本的memcached - 在memcache(2.2.x)中引入了中断行为

如果有人想调查这种行为,我会保持开放状态

答案 1 :(得分:0)

对我来说非常有效的一种方法是使用相同的密钥再次设置缓存,但在Now之前将到期时间设置为几秒。这使得该密钥在缓存中到期。 c#代码是这样的:

memcachedCache.Set(objectName, yourvalue, DateTime.Now.AddSeconds(-10));