赞
踩
redis中keys和scan的对比 两者都是用来返回key的,但是使用场景和方法不同。 一、keys KEYS pattern 比如: keys * keys user_info:* 特点: 1、在选定的库中,一次性全部返回符合条件的key,如果数据量很大将会等待很久, 因此,只适合用在可控的量小的键查询,比如几百,几千。 2、返回的键精确,不会重复,可放心使用。 二、scan SCAN cursor [MATCH pattern] [COUNT count] cursor:查询游标,第一次0,后面就是使用返回数组中第一个值,当返回的值为0时则表示遍历完毕。 MATCH pattern:匹配一个表达式,同上,选填。 [COUNT count]:指定每次迭代返回元素的最大值的一种提示(默认值为 10),但是在大多数情况下, 这种提示都是有效的,因此,返回的个数在count左右。 示例: scan 0 MATCH user_info:* COUNT 10 返回: 1) "6" 2) 1) "user_info:85:1114850" 2) "user_info:88:1114880" 3) "user_info:16:1081160" 4) "user_info:84:1114840" 5) "user_info:77:1114770" 6) "user_info:83:1114830" 7) "user_info:79:1114790" 8) "user_info:74:1114740" 9) "user_info:72:1114720" 10) "user_info:69:1114690" 11) "user_info:86:1114860" 12) "user_info:78:1114780" 特点: 1、随机性较高,没有规律。 2、唯一能判断遍历结束的标志就是返回结果集的第一个元素,示例中的6,游标只是一个标识,不可比较, 下次返回的游标可能比现在大或者小,但是只要等于0就确定结束了。 3、返回的列表存在重复的情况,需要应用程序自己处理。 4、由于全部遍历完需要一点时间,如果过程中键被操作了,那么影响未知。 5、返回的数量没有确定的数量 在数量未知或者数量较大的情况下使用scan遍历来获取所有的key $cursor = 0; $keys_arr = []; while(true){ $re = $redis->scan($cursor, 'user_info:*', 10);// 仅表示示例 if($re && is_array($re)){ if($re[2] && is_array($re[2])){ // 加入$keys_arr } if($re[1] == 0){ break; // end }else{ $cursor = $re[1]; } }else{ break;// 报错 } } // 排重 $keys_arr = array_unique($keys_arr);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。