批量删除 Redis 中的 keys 代码显示成功了,但是查看 Redis 中 key 依然存在

第一次代码结构 (遇到的问题)

代码如下:

$keys = app('redis')->keys(config('env.REDIS_PREFIX') . '*');
    /*
    $keys输出如下:
    array:3 [▼ `0 => "m_branch_a:ea675b6b0bc6af7b00e25d4279d0447345e1eccd"
      1 => "m_branch_a:permissions"
      2 => "m_branch_a:globalConfig"` ]
    */
$status = app('redis')->del($keys);
    /*
    $status 输出值是:3
    */

以上代码正常执行,没有任何错误日志,但是查看Redis发现数据依然存在,请教一下大家,谢谢指点!!!

第二次修改代码结构(发现了"异常规律")

我测试找到了一个规律,具体代码如下:
规律一
使用dd()输出,Redis中的相关keys删除成功了。

规律二:
使用return redirect()->back();Redis中相关keys就删除不了,但是日志记录已经删除成功了,而且删除的状态也是>1的。

$keys = app('redis')->keys(config('env.REDIS_PREFIX') . '*');
            if (empty($keys) || !is_array($keys)) {
                Session::flash('tipWarning', '1');
                Session::flash('tipMsg', '(Redis中)暂无缓存数据.');

                return redirect()->back();
            }
            app('redis')->del($keys);
            //使用下面代码,直接使用dd() Redis中就正常删除了相关keys;
            dd('缓存清除成功,请手动刷新页面');
            //使用下面代码,Redis中就没有删除成功相关keys;
            //return redirect()->back();

我觉得很奇怪,不知道什么原因,请各位指点,谢谢了!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 10

删除你传一个 array?

4年前 评论

@Rekkles 对,是array

4年前 评论

:joy: 我脚得不是一个库

4年前 评论
use Illuminate\Support\Facades\Redis;

//狀態更新,delete cache
$redisKey = sprintf(config('redis-keys.users.balance'), $this->user_id, '*');
// $redisKey = " USER::BALANCE::1::* "
$keys = Redis::keys(config('cache.prefix').':'.$redisKey);
/*
$keys = [
    0 => 'USER::BALANCE::1::test1',
    1 => 'USER::BALANCE::1::test2',
    2 => 'USER::BALANCE::1::test3'
]
*/
if ($keys) {
    Redis::del($keys);
}

這樣可行

default redis connection ?

4年前 评论

@Rekkles laravel 中的 redis 删除传入的参数是数组


app('redis')->del(array $keys);
4年前 评论

我测试找到了一个规律,具体代码如下:

规律一:

使用dd()输出,Redis中的相关keys删除成功了。

规律二:

使用return redirect()->back();Redis中相关keys就删除不了,但是日志记录已经删除成功了,而且删除的状态也是>1的。

$keys = app('redis')->keys(config('env.REDIS_PREFIX') . '*');
            if (empty($keys) || !is_array($keys)) {
                Session::flash('tipWarning', '1');
                Session::flash('tipMsg', '(Redis中)暂无缓存数据.');

                return redirect()->back();
            }
            app('redis')->del($keys);
            //使用下面代码,直接使用dd() Redis中就正常删除了相关keys;
            dd('缓存清除成功,请手动刷新页面');
            //使用下面代码,Redis中就没有删除成功相关keys;
            //return redirect()->back();

我觉得很奇怪,不知道什么原因,请各位指点,谢谢了!

4年前 评论

不知道这个算不算是Laravel的bug?还是我解锁的方式有问题啊,貌似没有解决方案

4年前 评论

试试专门开一个api接口删除redis缓存,原接口请求删除redis缓存接口成功后,再使用return redirect ()->back ();

4年前 评论

我觉得这个应该就是bug,呵呵....至今没有发现解决方案

4年前 评论

我觉得应该不是bug, 我在laravel5.8版本测试了一下, 你是不是用了predis这个包啊,它是有自动加上前缀的

 $redis =app('redis');

 $redis->set('a', 1);
 $redis->set('b', 1);

 $keys=$redis->keys('*');
 VarDumper::dump($keys);

//删除时传入带前缀的key  删除失败
 $status = $redis->del($keys);
 VarDumper::dump($status);

//删除时传入不带前缀的key  删除成功
 $status = $redis->del(['a','b']);
  VarDumper::dump($status);
array:2 [▼
  0 => "laravel_database_b"
  1 => "laravel_database_a"
]
0
2

在后面我测试了return redirect()->back();并没有出现删除不了的情况。

4年前 评论

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