You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中Redis连接del($key)删除失败,executeRaw可用问题求助

问题原因与解决办法

核心原因

Laravel的PhpRedisConnection类的del方法会自动为传入的key添加配置的Redis前缀,但你通过scan获取到的$key已经是带完整前缀的完整键名(比如laravel_cache_solar_cache:v1/verticals-menu:userId:4:xxx)。这时候调用$connection->del($key)会给这个key再叠加一遍前缀,最终Redis收到的命令是DEL laravel_cache_solar_cache:laravel_cache_solar_cache:v1/verticals-menu:userId:4:xxx,自然找不到对应的键,删除失败。

而executeRaw(['DEL', $key])是直接发送原生Redis命令,不会对key做任何前缀处理,所以能正确匹配到已存在的键,删除成功。

解决办法

办法1:剥离前缀后调用del方法

先获取当前Redis连接的前缀,从scan得到的完整key中剥离前缀,再传给del方法:

foreach ($matches as $key) {
    // 获取当前连接的前缀
    $prefix = $connection->getPrefix();
    // 从完整key中移除前缀
    $cleanKey = substr($key, strlen($prefix));
    // 调用del方法删除
    $connection->del($cleanKey);
}

办法2:继续使用executeRaw(推荐)

既然executeRaw能直接工作,且适合处理已拿到完整键名的场景,继续使用即可。如果要优化性能,还可以批量删除,减少Redis请求次数:

if (!empty($matches)) {
    // 批量执行DEL命令
    $connection->executeRaw(array_merge(['DEL'], $matches));
}

办法3:利用RedisStore的delete方法(集群场景需注意)

如果你的集群配置支持,也可以通过RedisStore的delete方法,但要注意:如果是跨集群的情况,需要确保每个store对应正确的集群节点:

$store->delete($cleanKey); // 同样需要先剥离前缀,因为delete方法也会自动加前缀

内容的提问来源于stack exchange,提问作者Jasen Angelov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:43:13