我需要将memcached复制到另一个键值系统(couchbase)。如何查询内存缓存服务器的内容以获取其中的列表,以便可以将其复制过来?
内存缓存> = 2.0.0
function getMemcacheKeys() {
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211)
or die ("Could not connect to memcache server");
$list = array();
$allSlabs = $memcache->getExtendedStats('slabs');
$items = $memcache->getExtendedStats('items');
foreach($allSlabs as $server => $slabs) {
foreach($slabs AS $slabId => $slabMeta) {
$cdump = $memcache->getExtendedStats('cachedump',(int)$slabId);
foreach($cdump AS $keys => $arrVal) {
if (!is_array($arrVal)) continue;
foreach($arrVal AS $k => $v) {
echo $k .'<br>';
}
}
}
}
}
所有这些用于Memcache的解决方案,因此这里是Memcached
function getMemcachedKeys($host = '127.0.0.1', $port = 11211)
{
$mem = @fsockopen($host, $port);
if ($mem === FALSE) return -1;
// retrieve distinct slab
$r = @fwrite($mem, 'stats items' . chr(10));
if ($r === FALSE) return -2;
$slab = array();
while (($l = @fgets($mem, 1024)) !== FALSE) {
// sortie ?
$l = trim($l);
if ($l == 'END') break;
$m = array();
// <STAT items:22:evicted_nonzero 0>
$r = preg_match('/^STAT\sitems\:(\d+)\:/', $l, $m);
if ($r != 1) return -3;
$a_slab = $m[1];
if (!array_key_exists($a_slab, $slab)) $slab[$a_slab] = array();
}
// recuperer les items
reset($slab);
foreach ($slab AS $a_slab_key => &$a_slab) {
$r = @fwrite($mem, 'stats cachedump ' . $a_slab_key . ' 100' . chr(10));
if ($r === FALSE) return -4;
while (($l = @fgets($mem, 1024)) !== FALSE) {
// sortie ?
$l = trim($l);
if ($l == 'END') break;
$m = array();
// ITEM 42 [118 b; 1354717302 s]
$r = preg_match('/^ITEM\s([^\s]+)\s/', $l, $m);
if ($r != 1) return -5;
$a_key = $m[1];
$a_slab[] = $a_key;
}
}
// close
@fclose($mem);
unset($mem);
// transform it;
$keys = array();
reset($slab);
foreach ($slab AS &$a_slab) {
reset($a_slab);
foreach ($a_slab AS &$a_key) $keys[] = $a_key;
}
unset($slab);
return $keys;
}
感谢示例代码
这里是如何删除一个或多个特定键的方法
我正在使用帮助器类来删除缓存,因此您必须为该函数提供对Memcache连接的引用
public static function removePriceCache(&$memcache, &$cacheAvailable) {
if ($cacheAvailable == true) {
$list = array();
$allSlabs = $memcache->getExtendedStats('slabs');
$items = $memcache->getExtendedStats('items');
foreach ($allSlabs as $server => $slabs) {
foreach ($slabs AS $slabId => $slabMeta) {
$cdump = $memcache->getExtendedStats('cachedump', (int) $slabId);
foreach ($cdump AS $keys => $arrVal) {
if (!is_array($arrVal))
continue;
foreach ($arrVal as $k => $v) {
//echo $k . '<br>';
if (stripos($k, "Price") !== false) {
$memcache->delete($k);
}
}
}
}
}
}
}
这将删除其中包含单词“ Price”的所有键。
根据文档:https://www.php.net/manual/en/memcached.getallkeys.php
PECL memcached> = 2.0.0
$memcached->getAllKeys();