Laravel:清除分页的缓存问题

wr98u20j  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(188)

我有laravel(7. x)应用程序。我最近添加该高速缓存功能以提高性能。在实现缓存功能后,我在以网格格式加载数据时遇到了分页问题,所以我在谷歌上搜索解决方案,找到了这个Pagination with cache in Laravel
虽然,它确实解决了我的问题。但是,情况是,我有大约100个页面,由于我找到的解决方案,每个页面都有自己的缓存。现在,如果我创建或更新任何记录,它不会反映在网格中,因为数据是该高速缓存加载的。

  • 邮件控制器.php:*
...

$arraySearch = request()->all();

# calculating selected tab
$cache = (!empty(request()->inactive)) ? 'inactive' : 'active';
$cacheKey = strtoupper("{$this->controller}-index-{$cache}-{$arraySearch['page']}");

# caching the fetch data
$arrayModels = cache()->remember($cacheKey, 1440, function() use ($arraySearch) {
    # models
    $Post = new Post();

    # returning
    return [
        'active'   => $Post->_index(1, 'active', $arraySearch),
        'inactive' => $Post->_index(0, 'inactive', $arraySearch),
    ];
});

...
  • 张贴.php:*
public function _index($status = 1, $page = null, $arraySearch = null)
{
    ...

    $Self = self::where('status', $status)
        ->orderBy('status', 'ASC')
        ->orderBy('title', 'ASC')
        ->paginate(10);

    ...

    return $Self;
}

如何清除所有缓存,以便将新创建或更新的记录与更新值一起显示到。

af7jpaap

af7jpaap1#

1.将所有页面存储在同一标记下:

如文档所示:https://laravel.com/docs/master/cache#storing-tagged-cache-items您可以使用标记对缓存的项目进行分组。

$cacheTag = strtoupper("{$this->controller}-index-{$cache}");
    $arrayModels = cache()->tags([$cacheTag])->remember($cacheKey, 1440, function() use ($arraySearch) {
        ...

2.在Post上设置事件监听器以清除标记

您可以在Post update()或create()事件上运行事件侦听器。https://laravel.com/docs/7.x/eloquent#events-using-closures
然后可以使用以下命令清除标记缓存

Cache::tags([$cacheTag])->flush();
qmelpv7a

qmelpv7a2#

我知道这不是正确的解决方案,但是,在我找到正确的方法之前,这是我唯一的选择。

  • 邮件控制器.php:*
public function index()
{
    ...

    $arraySearch = request()->all();

    # calculating selected tab
    $cache = (!empty(request()->inactive)) ? 'inactive' : 'active';
    $cacheKey = strtoupper("{$this->controller}-index-{$cache}-{$arraySearch['page']}");

    # caching the fetch data
    $arrayModels = cache()->remember($cacheKey, 1440, function() use ($arraySearch) {
        # models
        $Post = new Post();

        # returning
        return [
            'active'   => $Post->_index(1, 'active', $arraySearch),
            'inactive' => $Post->_index(0, 'inactive', $arraySearch),
        ];
    });

    ...
}

public function store()
{
    ...

    Artisan::call('cache:clear');

    ...
}

当我找到一个合适的解决方案时,我会发布。在那之前,我使用这个。

qgelzfjb

qgelzfjb3#

Laravel Model类中有一个名为booted的方法(不是boot,它有不同的用途),每次“保存”(包括“更新”)或“删除”某个东西时,这个方法都会运行。
我已经使用如下(在一个模型;或包含在模型中的特性):

protected static function booted(): void
{
    $item = resolve(self::class);
    static::saved(function () use ($item) {
        $item->updateCaches();
    });
    static::deleted(function () use ($item) {
        $item->updateCaches();
    });
}

“updateCaches”是Trait(或Model)中的一个方法,它可以包含更新该高速缓存的代码。

相关问题