当前位置:首页 > 问答 > 正文

redis里怎么快速查所有key,keyRedis用法分享和技巧讲解

在Redis里,当我们需要查看当前数据库里存了哪些key时,最先想到的命令可能就是 KEYS,这个命令的用法很简单(来源:Redis官方文档对KEYS命令的描述),你只需要在命令行里输入 KEYS pattern 就可以了,这个 pattern 是一个模式匹配符,比如你想查找所有以"user:"开头的key,就可以用 KEYS user:*,如果你想知道数据库里所有的key,直接使用 KEYS * 命令。

这里有一个非常重要的警告:在生产环境中,也就是正在对外提供服务的正式Redis服务器上,*绝对要谨慎使用 `KEYS 命令**,为什么呢?因为Redis是单线程的(来源:基于Redis核心设计原理的普遍认知),这意味着Redis在同一时间只能处理一个命令,当你执行KEYS 时,如果数据库里的key数量非常庞大,比如有几百万甚至上千万个,这个命令会一次性把所有key都列出来,这个过程可能会需要好几秒钟甚至更长时间,在这段时间里,Redis服务器会被这个KEYS ` 命令完全霸占,无法处理其他的任何读写请求,导致服务像卡住了一样,严重的话可能引起服务超时甚至崩溃,这个命令通常只被建议用在测试环境或者可以确认key数量很少的开发环境中。

在生产环境下,我们有没有更安全、不影响服务的方法来查看key呢?答案是有的,那就是 SCAN 命令(来源:Redis官方文档推荐的用于生产环境的迭代扫描命令)。SCAN 命令的设计初衷就是为了解决 KEYS 命令的阻塞问题,它不会一次性返回所有结果,而是采用了一种叫“游标迭代”的方式,分批少量地返回key。

redis里怎么快速查所有key,keyRedis用法分享和技巧讲解

使用 SCAN 命令时,你需要给它一个游标值,最开始是0,命令执行后,它会返回两个东西:一个是下一次迭代需要用的新游标值,另一个是本次扫描到的少量key的列表,你只需要不断地用返回的新游标作为下一次 SCAN 的起点,直到返回的游标再次变成0,就表示整个数据库已经遍历完毕,这个过程就像翻书一样,一页一页地看,而不是把整本书一下子全部摊开,虽然总的时间可能比 KEYS * 还要长一点,但每次操作都只占用很短的时间片,完全不会阻塞其他请求,对服务的影响微乎其微,它的基本用法是 SCAN cursor [MATCH pattern] [COUNT count],你也可以用它来匹配特定的模式,SCAN 0 MATCH cache:*

除了查看key,日常工作中我们经常需要判断某个key是否存在,或者管理key的生命周期,这时候就有几个非常常用的命令:

redis里怎么快速查所有key,keyRedis用法分享和技巧讲解

  • EXISTS key:这个命令用来检查一个或多个key是否存在(来源:Redis官方文档对EXISTS命令的描述)。EXISTS mykey,如果key存在就返回1,不存在就返回0,这是一个非常快速的操作。
  • TYPE key:当你知道一个key存在,但不确定它是什么数据类型(比如是字符串还是哈希还是列表)时,可以用这个命令来查看它的类型。
  • TTL key:Redis一个强大的功能就是可以为key设置过期时间,这个命令用来查询一个key还剩下多少秒的存活时间,如果返回-2,表示key已经不存在了;返回-1,表示key存在但没有设置过期时间。
  • DEL key:这个很简单,就是删除一个或多个指定的key。
  • EXPIRE key seconds:这是给一个已经存在的key设置过期时间的命令,单位是秒。EXPIRE session_id 3600 就是让这个session_id在3600秒(1小时)后自动被Redis删除。

关于key的使用,还有一些小技巧可以分享,给key起个好名字很重要,建议使用一种清晰的命名规范,比如用冒号分隔的层级结构:业务名:对象名:唯一标识,举个例子,用户信息的key可以叫 app:user:1001,用户1001的订单列表可以叫 app:orders:1001,这种命名方式非常清晰,也便于用 SCANKEYS 进行模式匹配查询。

要善用过期时间,对于缓存数据、临时会话(session)这类有时效性的信息,一定要设置过期时间(TTL),这可以避免无用的数据长期堆积,占用内存,也是一种数据清理的自动化手段,Redis会自动淘汰过期的key,帮你管理内存空间。

要意识到Redis虽然快,但它的内存资源是宝贵的,避免存储过大的key,比如一个key对应的value是一个巨大的JSON字符串,有几百KB甚至几MB,这会在网络传输和处理时带来压力,也要避免使用那些时间复杂度很高的命令,比如在不清楚集合大小的情况下对一个大集合进行SMEMBERS操作(获取集合所有成员),这同样可能引起延迟,对于大数据集,可以考虑使用 SSCAN 这样的迭代命令来代替。

快速查所有key,在测试环境可以用 KEYS *,但在生产环境务必使用非阻塞的 SCAN 命令,熟练掌握 EXISTSTTLEXPIREDEL 这些key管理命令,并遵循良好的key命名和过期时间设置习惯,能让你更高效、更安全地使用Redis。