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

Laravel中如何删除Redis内除指定前缀外的所有键

Laravel 实现删除Redis所有非cars-前缀键的方案

前置说明

确保你已在config/database.php中完成Redis配置,且使用前引入Redis门面:

use Illuminate\Support\Facades\Redis;

方案1:小数据量场景(开发/测试环境)

适合Redis键数量较少的场景,实现简单:

// 获取当前数据库所有键
$allKeys = Redis::keys('*');
// 过滤出所有非cars-前缀的待删除键
$keysToDelete = array_filter($allKeys, function ($key) {
    // 若Laravel配置了全局Redis前缀,需先去除前缀再判断,示例如下:
    // $pureKey = str_replace(Redis::connection()->getPrefix(), '', $key);
    // return !str_starts_with($pureKey, 'cars-');
    return !str_starts_with($key, 'cars-');
});

// 批量删除
if (!empty($keysToDelete)) {
    Redis::del($keysToDelete);
}

注意:KEYS命令会全量遍历Redis库,大数据量下会导致Redis阻塞,禁止在生产环境使用。


方案2:生产环境安全实现

基于Redis的SCAN命令迭代遍历键,不会阻塞服务,适合生产环境大数据量场景:

$cursor = 0;
// 读取Laravel配置的全局Redis前缀
$globalPrefix = Redis::connection()->getPrefix();
// 要保留的键前缀
$reservedPrefix = 'cars-';

do {
    // 每次扫描1000个键,可根据实际场景调整扫描数量
    $scanResult = Redis::scan($cursor, 'MATCH', '*', 'COUNT', 1000);
    if ($scanResult === false) break;

    [$cursor, $keys] = $scanResult;
    foreach ($keys as $key) {
        // 去除全局前缀后判断是否需要删除
        $pureKey = str_replace($globalPrefix, '', $key);
        if (!str_starts_with($pureKey, $reservedPrefix)) {
            Redis::del($key);
        }
    }
} while ($cursor > 0);

额外注意项

  • 若你需要操作指定Redis库,执行前先切换库:Redis::select(你的库序号);
  • 首次执行前建议先打印待删除的键列表校验,确认无误后再执行删除逻辑
  • Laravel版本低于8.0没有str_starts_with方法时,可替换为substr($pureKey, 0, 5) !== 'cars-'

内容的提问来源于stack exchange,提问作者Rickin Rathatha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 13:24:07