删除Laravel中的缓存文件

时间:2020-05-23 22:42:58

标签: php laravel laravel-5 caching laravel-7

我是Laravel的初学者。

我在我的项目Laravel 7中使用了。

我的项目中有缓存系统。

我的项目中有键缓存:

  • 类别
  • category.id
  • category.subcategory.id
  • product.all

我需要删除缓存的功能。

我这样写:

private function deleteCache(string $keyToRemove)
{
    Cache::forget($keyToRemove);
}

是否可以删除通用缓存?

我需要一个将要使用的功能

  1. 删除所选键:

    deleteCache([''category.100','product.all','category.1'])

  2. 删除所有具有类别的缓存(例如:category.1,category.all,category,category.tree,category.subcategory.1等)。

    deleteCache(['category。*'])

我该怎么做?

1 个答案:

答案 0 :(得分:1)

TL:DR默认情况下无法满足您的需要,您需要定制的包装方法,这些方法需要有关所选缓存驱动程序(基础技术)的“ 技术”知识。

Laravel缓存支持多种技术(驱动程序),包括redisdatabasefilememcached等。所有这些驱动程序都实现相同的接口。

namespace Illuminate\Contracts\Cache;

interface Store
{
    /**
     * Retrieve an item from the cache by key.
     *
     * @param  string|array  $key
     * @return mixed
     */
    public function get($key);

    /**
     * Retrieve multiple items from the cache by key.
     *
     * Items not found in the cache will have a null value.
     *
     * @param  array  $keys
     * @return array
     */
    public function many(array $keys);

    /**
     * Store an item in the cache for a given number of minutes.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @param  float|int  $minutes
     * @return void
     */
    public function put($key, $value, $minutes);

    /**
     * Store multiple items in the cache for a given number of minutes.
     *
     * @param  array  $values
     * @param  float|int  $minutes
     * @return void
     */
    public function putMany(array $values, $minutes);

    /**
     * Increment the value of an item in the cache.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return int|bool
     */
    public function increment($key, $value = 1);

    /**
     * Decrement the value of an item in the cache.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return int|bool
     */
    public function decrement($key, $value = 1);

    /**
     * Store an item in the cache indefinitely.
     *
     * @param  string  $key
     * @param  mixed  $value
     * @return void
     */
    public function forever($key, $value);

    /**
     * Remove an item from the cache.
     *
     * @param  string  $key
     * @return bool
     */
    public function forget($key);

    /**
     * Remove all items from the cache.
     *
     * @return bool
     */
    public function flush();

    /**
     * Get the cache key prefix.
     *
     * @return string
     */
    public function getPrefix();
}

根据您选择的驱动程序-您需要定制的方法来实现所需的功能。

对于第一个问题,以下方法对于删除多个键很有用。

public function deleteCache(array $keys)
{
    foreach ($keys as $key) {
        Cache::forget($key);
    }
}

我熟悉redis,因此我将举一些例子。如果要使用redis作为缓存驱动程序-最好像这样修改该方法。由于redis的delete命令支持一次删除多个键。这个比前一个更有效。

public function deleteCache(array $keys)
{
    Redis::del($keys);
}

一个诀窍是要小心cache prefix。如果您使用的是缓存前缀(在缓存配置文件中定义),则需要在密钥之前添加这些前缀。

对于第二个问题(使用类别删除所有缓存),有几种方法可以解决,但是其中一些对性能/生产并不友好。在redis中,您可以执行一些命令,例如keysscan来遍历数据库,然后使用返回的结果调用先前定义的方法。

尤其是keys命令仅应在生产环境中使用时格外小心。

Redis仅是示例-如果您要使用database缓存驱动程序-那么您需要实现一些方法来满足您的情况。它将需要有关laravel如何通过数据库(表,查询等)实现它以及扩展方法将如何使用它(表,查询,列,索引等)的技术知识。