因为业务需要,要获取某些前缀开头的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即可,具体还要看自己的业务。