日常工作当中经常会遇到删除Redis key的问题,如果是删除某个key,使用 DEL keyname 或者 EXPIRE keyname ttl 都可以实现。但如果想要一次性删除多个key应该怎么处理呢?Redis本身并不支持批量删除key的操作,下面我们就来看看如何巧妙地处理这类问题。
场景一:删除所有的key
如果需要执行初始化的操作,清理掉数据库所有的键,可以使用 FLUSHDB 或者 FLUSHALL 命令操作。
FLUSHDB
清空当前数据库中的所有key
FLUSHALL
清空整个 Redis 服务器的数据(删除所有数据库的所有key)
场景二:删除所有满足匹配条件的key(key数量较少或者测试环境)
可以在命令行环境下使用 redis-cli 命令在外部执行 KEYS “pattern” 命令,拿到结果以后通过 xargs 命令传递给 DEL 作为输入参数,进而删除匹配的key。具体命令如下:
redis-cli -h hostname -p port -a password -n database --raw keys "pattern" | xargs -I -r -n1 {
} redis-cli -h hostname -p port -a password -n database DEL "{}"
说明:
(error) CROSSSLOT Keys in request don’t hash to the same slot
但是这种操作是有限制的,主要受限于KEYS命令。因为 Redis 6 版本以下都是采用单线程处理请求,如果在 key 数量较大的情况下使用 KEYS 命令,会阻塞线程,导致其他客户端无法正常访问,这在生产环境是不可接受的(基于此原因,很多公司生产环境 KEYS 都是禁用的)。这就是接下来要说的第三种场景。
场景三:删除所有满足匹配条件的key(key数量较多或者生产环境)
为了解决场景二中的 KEYS 命令造成的线程阻塞问题,我们可以使用 SCAN 命令来解决。
让我们先来了解一下 SCAN 命令的使用。
SCAN 用于迭代当前数据库中的数据库键。用法:SCAN cursor [MATCH pattern] [COUNT count]
简单概括一下: SCAN 命令就是通过游标的方式分步从数据库获取数据,每次以游标方式进行遍历(游标从上一次遍历结果中返回,初始游标为0),结果会返回一个新游标和匹配的键集合(键的数量不不确定,与 COUNT 正相关),如果返回游标为0则视为遍历结束(不以遍历结果为空作为结束标识)。可以使用 MATCH 匹配模式,COUNT 限制返回的键的个数。
与 KEYS 命令相比,SCAN 命令虽然复杂度也是 O(n),但是它是通过游标分步进行的,不会阻塞线程。同时