laravel cache 貌似没有根据key的前缀批量删除的方法

貌似无法根据key的前缀批量删除缓存

laravel版本 8.5
php版本7.4

示例代码

for ($i=0;$i<=1000;$i++){
    $mobile = rand(10000,99999);
    $key = 'mobile_day_'.$mobile;
    $key2 = 'mobile:moth:'.$mobile;
    \Cache::put($key , 1 ,100000);
    \Cache::put($key2 ,1, 100000);
}

dd(\Cache::get('mobile:day:333221') , \Cache::forget('mobile_day_*') , \Cache::forget('mobile:moth:*'));

输出结果

laravel cache 貌似没有根据key的前缀批量删除的方法

虽然我知道可以使用标签来做类似的效果..但是大量的旧代码都没有用到标签

所以问问大家是不是有其他办法

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
游离不2
最佳答案

自己扩展一个

if (!Cache::hasMacro('forgetByPrefix')) {
    Cache::macro('forgetByPrefix', function($prefix) {
        // 大概代码
        $keys = Redis::keys($prefix . '*');
        foreach ($keys as $key) {
            // Cache::forget($key);
        }
    });
}
2年前 评论
lc_name (楼主) 2年前
lc_name (楼主) 2年前
讨论数量: 10

前缀不知道,但是你的需求应该可以用标签实现

    Cache::tags('foo')->set('bar1', 'value');
    Cache::tags('foo')->set('bar2', 'value');

    $data = Cache::tags('foo')->get('bar1');
    //value
    dump($data);
    $data = Cache::tags('foo')->get('bar2');
    //value
    dump($data);

    Cache::tags('foo')->flush();

    $data = Cache::tags('foo')->get('bar1');
    //null
    dump($data);
    $data = Cache::tags('foo')->get('bar2');
    //null
    dump($data);
2年前 评论
游离不2 2年前
MArtian 2年前
游离不2

自己扩展一个

if (!Cache::hasMacro('forgetByPrefix')) {
    Cache::macro('forgetByPrefix', function($prefix) {
        // 大概代码
        $keys = Redis::keys($prefix . '*');
        foreach ($keys as $key) {
            // Cache::forget($key);
        }
    });
}
2年前 评论
lc_name (楼主) 2年前
lc_name (楼主) 2年前

时间复杂度O(n+1) 既然用redis好像也可以这样

if (!Cache::hasMacro('forgetByPrefix')) {
   Cache::macro('forgetByPrefix', function($prefix) {
       // 大概代码
       $keys = Redis::keys($prefix . '*');
       Redis::del($key,...$keys);
   });
}

时间复杂度O(2)

2年前 评论
66

楼上正解

2年前 评论

目前项目中的解决方案,是使用 match 来扫描 key,因为使用 keys 在 key 量大的时候会导致阻塞。

match 后再遍历 key,使用 unlink 删除 key,每个 unlink 使用 usleep 一定时间 ,避免雪崩。

2年前 评论

如果使用的是类似Redis的驱动,可以根据前缀来删除。 如果使用文件(缓存会Hash),只能通过缓存Tag类似的扩展来吧。

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!