在使用Redis时,您经常会发现自己需要检索遵循特定模式的键。也许您已经存储了用户会话,键名如session:user123、session:user456等——现在您想要找到所有以session:开头的键。
Redis提供了几个命令来帮助实现这个功能:KEYS和SCAN。它们乍看起来可能很相似,但行为却非常不同,了解何时以及如何使用每个命令很重要。
1. Redis中的通配符模式匹配
KEYS和SCAN都支持glob风格的模式,使用特殊的通配符字符来匹配多个键:
模式匹配...*任意数量的字符?恰好一个字符[abc]a、b或c中的一个字符[a-z]a到z之间的任意字符
例如:
- KEYS user:* 将匹配 user:1、user:100 和 user:abc。
- KEYS session:? 将匹配像 session:a、session:1 这样的键,但不匹配 session:ab。
2. KEYS命令:强大,但在生产环境中危险
KEYS命令简单直接:
127.0.0.1:6379> KEYS user:*
它返回所有匹配给定模式的键,并且这是一个阻塞操作。这是主要问题——Redis在收集所有结果时会暂停,这在具有大量键的生产环境中可能是有风险的。
何时使用KEYS
- 用于调试或开发。
- 当键的总数很小时。
- 当您确定性能不会受到影响时。
3. SCAN命令:安全和基于游标
为了安全地扫描大型键空间,Redis提供了SCAN命令。它是一个基于游标的迭代器,意味着它不会一次性返回所有匹配的键。相反,它给您一个小的子集键和一个游标来继续。
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 10
- 0 是初始游标位置。
- MATCH 是模式过滤器。
- COUNT 是返回多少键的提示(不保证)。
您使用前一个响应中返回的游标重复命令,直到游标返回到0,这表示扫描结束。
示例输出
1) "23" # 下一个游标
2) 1) "user:1"
2) "user:2"
然后您调用 SCAN 23 MATCH user:* COUNT 10 来继续。
何时使用SCAN
- 在生产系统中。
- 当处理大量键时。
- 当您需要非阻塞访问时。
4. 最佳实践
- 在生产环境中避免使用KEYS。
- 始终使用SCAN进行可扩展、安全的键迭代。
- 考虑为您的键命名空间(例如,user:、order:等),使模式匹配更容易。
- 不要依赖COUNT返回确切的数字——这只是对Redis的建议。
总结
基于模式的键检索是Redis中的一个强大功能,但像所有强大的工具一样,应该谨慎使用。对于开发中的快速查找,KEYS很方便。对于可扩展和生产安全的迭代,SCAN是您的最佳选择。
如果您是一个喜欢探索不同技术和技巧的软件开发者,请查看LiveAPI。这是一个超级方便的工具,可以让您立即生成交互式API文档。
LiveAPI帮助您轻松发现、理解和使用大型技术基础设施中的API!
所以,如果您正在处理缺乏文档的代码库,只需使用LiveAPI来生成它并节省时间!