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