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

Redis里怎么快速查所有键和值,管理起来方便点的方法分享

最重要的一点是,*在生产环境中,绝对不要使用 `KEYS ` 命令来查找所有键**,这个命令是阻塞式的,它会扫描整个数据库,如果你的数据库里有几百万甚至上亿个键,这个命令会让Redis服务器卡住一段时间,无法处理其他任何请求,很可能导致线上服务瘫痪,这是一个必须牢记的底线。

有哪些更安全、更高效的方法呢?我们来分几个方面说。

安全地查找所有键

既然 KEYS * 不能用,我们用什么?

  1. 使用 SCAN 命令:这是官方推荐的、用于替代 KEYS 命令的非阻塞式迭代器,它的原理不是一次性返回所有结果,而是每次只返回一小部分键和一个游标(cursor),你下次带着这个游标再执行 SCAN,它就会从上次结束的地方继续扫描,这样就把一次性的巨大压力分摊成了多次微小的操作,对服务器的影响降到最低。

    • 怎么用:你第一次执行 SCAN 0(0代表从头开始),它会返回两部分:一个是下一次迭代要用的新游标(比如是123),另一个是本次扫描到的键的列表,然后你再执行 SCAN 123,如此反复,直到返回的游标再次变成0,就意味着整个数据库都遍历完了。
    • 优点:非阻塞,安全,可以用于生产环境。
    • 小技巧SCAN 命令也支持模式匹配,SCAN 0 MATCH user:* 来查找所有以 user: 开头的键。

查看键对应的值

找到了键,我们自然想看它的值,但值可能有不同的类型(字符串、哈希、列表等),查看方法也不同。

  1. 对于字符串(String)类型:直接用 GET keyname 命令。
  2. 对于哈希(Hash)类型:用 HGETALL keyname 命令,它会把这个哈希的所有字段和值都列出来。
  3. 对于列表(List)类型:用 LRANGE keyname 0 -1 命令,-1 代表列表的最后一个元素,这样就能看全了。
  4. 对于集合(Set)类型:用 SMEMBERS keyname 命令。
  5. 对于有序集合(Sorted Set)类型:用 ZRANGE keyname 0 -1 WITHSCORES 命令,可以把成员和对应的分值都显示出来。

这里又有一个坑:如果一个键对应的值非常大(比如一个哈希里存了几十万个字段,或者一个字符串值有几百MB),直接用 HGETALLGET 命令同样可能会拖慢Redis,因为网络传输和客户端渲染需要时间。

更稳妥的做法是

  • 先用 TYPE keyname 命令看看这个键是什么类型。
  • 再用 LLEN(列表长度)、HLEN(哈希字段数)、STRLEN(字符串长度)等命令判断一下值的大小,如果发现体积巨大,就要小心处理,可以考虑只查看一部分,比如用 HSCAN(针对哈希的扫描)来分批获取字段,或者用 LRANGE keyname 0 99 只看列表的前100个元素。

使用图形化工具进行可视化管理

对于日常管理和排查问题来说,在命令行里一个个敲命令效率太低,而且不直观。使用图形化的管理工具是最高效、最方便的方法,这些工具底层也是调用我们上面说的那些安全命令(如 SCAN),但把它们包装成了非常友好的界面。

  1. RedisInsight:这是Redis官方推出的免费可视化工具,非常强大和推荐,它的主要好处包括:

    • 树状视图浏览:可以用文件夹树的形式展示你的键,特别是如果你的键名有层次结构(user:1000:profile, user:1000:orders),它会自动归类,查找起来一目了然。
    • 安全执行命令:它内置了一个CLI,让你可以像在终端里一样执行命令,但更安全方便。
    • 内存分析:它有一个很棒的功能,可以分析你的数据库,告诉你哪种类型的键最多,哪个键占的内存最大,对于优化和清理非常有用。
    • 实时监控:可以实时看到服务器的CPU、内存、命令统计等监控信息。
  2. Another Redis Desktop Manager:这是一个在开发者中非常流行的开源桌面客户端,它界面简洁,响应速度快,基本功能齐全,支持Windows、macOS和Linux,它也能以树状结构展示键,方便地查看和编辑各种数据类型的值。

  3. redis-commander:这是一个基于Web的Redis管理工具,你可以在服务器上部署它,然后通过浏览器来访问和管理Redis,这对于管理远程服务器或Docker环境中的Redis特别方便。

一些管理上的小建议

除了工具,一些好的习惯也能让管理变得更轻松:

  • 键名规范化:使用统一的命名规范,比如用冒号分隔层次,业务:模块:IDorder:payment:20231027),这样无论是用 SCAN 命令匹配,还是在图形化工具里浏览,都会非常清晰。
  • 设置TTL(过期时间):对于缓存类数据,一定要设置合理的过期时间,可以使用 TTL keyname 查看剩余时间,用 EXPIRE keyname seconds 来设置,这样可以避免无用数据无限期地占用内存。
  • 定期清理:利用图形化工具的内存分析功能,定期检查是否有已经过期但还未被删除的大Key,或者一些不再使用的僵尸Key,并手动清理掉。

总结一下:核心就是*放弃危险的 `KEYS 命令,拥抱安全的SCAN` 系列命令,而对于日常管理,强烈建议使用像 RedisInsight 这样的图形化工具**,它能将安全命令的强大能力和可视化操作的便捷性完美结合,让你管理Redis的效率大大提升,真正做到既快速又方便。

Redis里怎么快速查所有键和值,管理起来方便点的方法分享