我使用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
答案 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));