我使用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年前的)。谁能给我解释一下可能发生的事吗?
我在PHP5.6上使用memcached 1.4.21和memcache (PECL) 3.0.8
发布于 2016-07-28 15:25:26
这一问题源于以下内容的使用:
$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中的键/值)
这个功能的问题在于,它显然会导致memcached变成只读的。虽然对函数的后续调用提供的值被更新(我认为它们是从本地内存中检索的),但memcached服务中的值不是。
这种行为影响到memcached的最新版本--这种破坏行为是在memcache (2.2.x)中引入的。
如果有人想调查这种行为,我会保持赏金公开
发布于 2016-07-21 13:12:16
一种非常适合我的方法是,使用相同的密钥再次设置缓存,但将过期时间放在几秒钟之前。这使得该密钥在您的缓存中过期。c#代码如下所示:
memcachedCache.Set(objectName, yourvalue, DateTime.Now.AddSeconds(-10)); https://stackoverflow.com/questions/38271978
复制相似问题