Как получить список всех кэшированных элементов по ключу в Laravel 5?

класс кэша в laravel имеет такие методы, как get('itemKey') для извлечения элементов из кэша и запоминания('itemKey', ['myData1', 'myData2']) для сохранения элементов в кэше.

существует также метод проверки наличия элемента в кэше: Cache::has ('myKey');

есть ли способ (при использовании файлового драйвера кэша) получить список всех элементов в кэше?

например, что-то, что может быть названо чем-то вроде " Cache:: all()" что бы вернуть:

[
    'itemKey' => [
        'myData1',
        'myData2'
   ],
   'myKey' => 'foo'
]

единственный способ, которым я могу думать об этом, - это перебрать все возможные имена ключей, используя метод Cache::has (). т. е. aaa, aab, aac, aad... но, конечно, это не решение.

Я не вижу ничего в документации или API, который описывает такую функцию, но я не думаю, что неразумно полагать, что она должна существовать.

3 ответов


нет способа сделать это с помощью кэш фасад. Его интерфейс представляет функциональность, которая все базовые хранилища предлагают, и некоторые из магазинов не позволяют перечислять все ключи.

Если вы используете FileCache, вы можете попытаться достичь этого, взаимодействуя с базовым хранилищем напрямую. Он не предлагает метод, который вам нужен, поэтому вам нужно будет выполнить итерацию по каталогу кэша. Это не будет слишком эффективно из-за много дисковых ввода-вывода, которые могут потребоваться.

чтобы получить доступ к хранилищу, вам нужно сделать

$storage = Cache::getStore(); // will return instance of FileStore
$filesystem = $storage->getFilesystem(); // will return instance of Filesystem

$keys = [];
foreach ($filesystem->allFiles('') as $file1) {
  foreach ($filesystem->allFiles($file1) as $file2) {
    $keys = array_merge($keys, $filesystem->allFiles($file1 . '/' . $file2));
  }
}

^Это выше не работает в LV 5.2

попробуйте это решение:

    $storage = \Cache::getStore(); // will return instance of FileStore
    $filesystem = $storage->getFilesystem(); // will return instance of Filesystem
    $dir = (\Cache::getDirectory());
    $keys = [];
    foreach ($filesystem->allFiles($dir) as $file1) {

        if (is_dir($file1->getPath())) {

            foreach ($filesystem->allFiles($file1->getPath()) as $file2) {
                $keys = array_merge($keys, [$file2->getRealpath() => unserialize(substr(\File::get($file2->getRealpath()), 10))]);
            }
        }
        else {

        }
    }

на 'yourKeyGoesHere' вы можете вставить строку, используемую так же, как like С * или вставить непосредственно точно ключ.

 $redis = Cache::getRedis();
 $a_keys = $redis->keys("*yourKeyGoesHere*");
 foreach ($a_keys as $key){
    //Your Action ...
    //For example forget key
    $redis->del($key);
 }