Add ICacheDriver->getAllKeys method

This commit is contained in:
Hypolite Petovan 2018-09-25 22:52:32 -04:00
parent 640f76b05a
commit 71c08a044f
7 changed files with 86 additions and 0 deletions

View File

@ -46,6 +46,29 @@ class Cache extends \Friendica\BaseObject
return self::$driver;
}
/**
* @brief Returns all the cache keys sorted alphabetically
*
* @return array|null Null if the driver doesn't support this feature
*/
public static function getAllKeys()
{
$time = microtime(true);
$return = self::getDriver()->getAllKeys();
// Keys are prefixed with the node hostname, let's remove it
array_walk($return, function (&$value) {
$value = preg_replace('/^' . self::getApp()->get_hostname() . ':/', '', $value);
});
sort($return);
self::getApp()->save_timestamp($time, 'cache');
return $return;
}
/**
* @brief Fetch cached data according to the key
*

View File

@ -19,6 +19,14 @@ class ArrayCache extends AbstractCacheDriver implements IMemoryCacheDriver
/** @var array Array with the cached data */
protected $cachedData = array();
/**
* (@inheritdoc)
*/
public function getAllKeys()
{
return array_keys($this->cachedData);
}
/**
* (@inheritdoc)
*/

View File

@ -13,6 +13,16 @@ use Friendica\Util\DateTimeFormat;
*/
class DatabaseCacheDriver extends AbstractCacheDriver implements ICacheDriver
{
/**
* (@inheritdoc)
*/
public function getAllKeys()
{
$stmt = DBA::select('cache', ['k'], ['`expires` >= ?', DateTimeFormat::utcNow()]);
return DBA::toArray($stmt);
}
/**
* (@inheritdoc)
*/

View File

@ -11,6 +11,13 @@ use Friendica\Core\Cache;
*/
interface ICacheDriver
{
/**
* Lists all cache keys
*
* @return array|null Null if it isn't supported by the cache driver
*/
public function getAllKeys();
/**
* Fetches cached data according to the key
*

View File

@ -40,6 +40,28 @@ class MemcacheCacheDriver extends AbstractCacheDriver implements IMemoryCacheDri
}
}
/**
* (@inheritdoc)
*/
public function getAllKeys()
{
$list = [];
$allSlabs = $this->memcache->getExtendedStats('slabs');
foreach($allSlabs as $slabs) {
foreach(array_keys($slabs) as $slabId) {
$cachedump = $this->memcache->getExtendedStats('cachedump', (int)$slabId);
foreach($cachedump as $keys => $arrVal) {
if (!is_array($arrVal)) {
continue;
}
$list = array_merge($list, array_keys($arrVal));
}
}
}
return $list;
}
/**
* (@inheritdoc)
*/

View File

@ -53,6 +53,14 @@ class MemcachedCacheDriver extends AbstractCacheDriver implements IMemoryCacheDr
}
}
/**
* (@inheritdoc)
*/
public function getAllKeys()
{
return $this->memcached->getAllKeys();
}
/**
* (@inheritdoc)
*/

View File

@ -38,6 +38,14 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
}
}
/**
* (@inheritdoc)
*/
public function getAllKeys()
{
return null;
}
/**
* (@inheritdoc)
*/