【Redis运维】Redis scan命令使用教程
一、Redis scan命令作用
在Redis运维中经常会有这样一种场景,就是需要对符合条件的一部分数据进行操作,比如删除test_开头的key。但是如果使用keys命令结合通配符去获取这些数据的话,由于keys命令没有limit功能,只能一次性获取所有符合条件的key,这样终端会出现大量的输出,不能快速定位所需数据。另外keys命令是遍历算法,时间复杂度是O(N),会让单线程工作的Redis发生阻塞。为了避免这种情况,从Redis 2.8以后支持scan命令,通过scan命令可以分批多次遍历数据,不会导致主线程阻塞,并且支持limit控制返回的数据量。不过scan命令也并不是完美的,它返回的结果有可能存在重复,需要客户端进行去重
二、Redis scan命令语法
# scan 开始序号 [match 模式] [count number] # SCAN cursor MATCH pattern COUNT count scan 0 match user* count 1000
cursor:SCAN命令基于游标cursor,游标从0开始,每次调用后返回一个游标用于下一次迭代。直到游标返回0时迭代结束
MATCH:匹配规则,如遍历以linuxe开头的key可以写为linuxe*
COUNT:每次迭代应该从数据集⾥返回的元素量,默认为10。但是仅仅是一种提示而并不代表真正返回的数量,如COUNT设置为2也有可能会返回3个元素,但返回的元素数据会与COUNT相关
三、Redis scan命令示例(假设10000个key)
1):下一次scan时的游标,如果显示为0代表已经遍历完毕
2):取到的数据,虽然设置count为1000,但Redis每次返回的数值只有10个左右
127.0.0.1:6379> scan 0 match key24* count 1000 1) "1688" #下一次从1688开始 2) 1) "key2411" 2) "key2475" 3) "key2494" 4) "key2406" 5) "key2478" 127.0.0.1:6379> scan 1688 match key24* count 1000 1) "2444" 2) 1) "key2458" 2) "key249" 3) "key2407" 4) "key2434" 5) "key241" 6) "key2497" 7) "key2435" 8) "key2413" 9) "key2421" 10) "key248" 127.0.0.1:6379> scan 2444 match key24* count 1000 1) "818" 2) 1) "key2459" 2) "key2462" 3) "key2409" 4) "key2454" 5) "key2431" 6) "key2423" 7) "key2476" 8) "key2428" 9) "key2493" 10) "key2420" 127.0.0.1:6379> scan 818 match key24* count 1000 1) "9190" 2) 1) "key2402" 2) "key2415" 3) "key2429" 4) "key2424" 5) "key2425" 6) "key2400" 7) "key2472" 8) "key2479" 9) "key2448" 10) "key245" 11) "key2487" 12) "key2430" 13) "key2405" 127.0.0.1:6379> scan 9190 match key24* count 1000 1) "12161" 2) 1) "key2488" 2) "key2437" 3) "key2404" 4) "key2440" 5) "key2461" 6) "key2416" 7) "key2436" 8) "key2403" 9) "key2460" 10) "key2452" 11) "key2449" 12) "key2482" 127.0.0.1:6379> scan 12161 match key24* count 1000 1) "11993" 2) 1) "key2483" 2) "key2491" 3) "key242" 4) "key2466" 5) "key2446" 6) "key2465" 7) "key243" 8) "key2438" 9) "key2457" 10) "key246" 11) "key2422" 12) "key2418" 127.0.0.1:6379> scan 11993 match key24* count 1000 1) "7853" 2) 1) "key2498" 2) "key2451" 3) "key2439" 4) "key2495" 5) "key2408" 6) "key2410" 127.0.0.1:6379> scan 7853 match key24* count 1000 1) "5875" 2) 1) "key2486" 2) "key2490" 3) "key244" 4) "key2401" 5) "key2463" 6) "key2481" 7) "key2477" 8) "key2468" 9) "key2433" 10) "key2489" 11) "key2455" 12) "key2426" 13) "key24" 14) "key2450" 15) "key2414" 16) "key2442" 17) "key2473" 18) "key2467" 19) "key2469" 20) "key2456" 127.0.0.1:6379> scan 5875 match key24* count 1000 1) "14311" 2) 1) "key2453" 2) "key2492" 3) "key2480" 4) "key2427" 5) "key2443" 6) "key2417" 7) "key2432" 8) "key240" 9) "key2445" 10) "key2484" 11) "key2444" 12) "key247" 13) "key2485" 127.0.0.1:6379> scan 14311 match key24* count 1000 1) "16383" 2) 1) "key2441" 2) "key2474" 3) "key2447" 4) "key2471" 5) "key2470" 6) "key2464" 7) "key2412" 8) "key2419" 9) "key2499" 10) "key2496" 127.0.0.1:6379> scan 16383 match key24* count 1000 1) "0" 2) (empty list or set)
四、Redis scan命令批量删除数据的实际运用
redis-cli命令也有--scan选项可以实现同样的作用
redis-cli --scan --pattern "linuxe*" | xargs -L 2000 redis-cli del #xargs -L表⽰xargs⼀次读取的⾏数,也就是每次删除的key数量,⼀次读取太多xargs会报错
版权声明:本文章版权归数据库运维网(www.ywdba.cn)所有。如需引用本站内容,请注明来源及作者。
评论