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
相关产品推荐
相关产品推荐

