对Redis的key模糊匹配的两种方法,keys和scan,各自的用法不一样

因为业务需要,要获取某些前缀开头的redis数据库内容,比如abc_xxx,有两种常用方法keys和scan。

#随便生成一些key,用abc_作为前缀

for ($i = 10000000; $i < 10000010; $i++) {
    $saveKey = 'abc_' . date('Ymd', strtotime('today')) . '_' . rand(1, 100);
    $user_id = $i;
    if (!$cache->sismember($saveKey, $user_id)) {
        $cache->sadd($saveKey, $user_id);
        $cache->expire($saveKey, strtotime("+15 days", strtotime("tomorrow")) - strtotime('today'));
    }
}
//方法1
$stime = microtime(true);
$keys = $cache->keys('abc_*');
$time1 = round(microtime(true) - $stime, 4);

//方法2
$stime = microtime(true);
$iterator = null;
$count = 10;//返回n条
$scan = $cache->scan($iterator, 'abc_*',$count);
$time2 = round(microtime(true) - $stime, 4);
print_r([
    'keys' => [
        'time' => $time1,
        'res' => $keys
    ],
    'scan' => [
        'time' => $time2,
        'res' => $scan,
    ]


适用理解:

keys会全部获取匹配到的key,而scan需要自定义获取的数量,相当于支持分页(默认返回10条,每次游标自动更新【引用入参】),有开始和返回大小。


所以,当对应的key数量较大时建议用scan扫描,如果key数量不太大直接用keys即可,具体还要看自己的业务。

评论/留言