前言
还在用keys命令模糊匹配删除数据吗?这就是一颗随时爆炸的炸弹!
Redis中没有批量删除特定前缀key的指令,但我们往往需要根据前缀来删除,那么究竟该怎么做呢?可能你一通搜索后会得到下边的答案
redis-cli --raw keys "ops-coffee-*" | xargs redis-cli del
直接在linux下通过redis的keys命令匹配到所有的key,然后调用系统命令xargs来删除,看似非常完美,实则风险巨大
因为Redis的单线程服务模式,命令keys会阻塞正常的业务请求,如果你一次keys匹配的数量过多或者在del的时候遇到大key,都会直接导致业务的不可用,甚至造成redis宕机的风险
所以我们在生产环境中应当避免使用上边的方法,那有什么优雅的方法来解决呢?SCAN!
SCAN介绍及使用
Redis从2.8版本开始支持scan命令,SCAN命令的基本用法如下:
SCAN cursor [MATCH pattern] [COUNT count]
cursor: 游标,SCAN命令是一个基于游标的迭代器,SCAN命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程,直到服务器向用户返回值为0的游标时,一次完整的遍历过程就结束了
MATCH: 匹配规则,例如遍历以ops-coffee-开头的所有key可以写成ops-coffee-*,中间包含-coffee-的可以写成*-coffee-*</