redis 查看所有key(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Redis 的日常使用中,查看所有 key 是一项基础但至关重要的操作。无论是调试程序、清理缓存,还是分析数据分布,开发者都需要快速定位和管理 Redis 中存储的键值对。然而,对于编程初学者而言,Redis 的命令体系和性能特性可能显得复杂。本文将从零开始,通过通俗易懂的比喻、代码示例和实际案例,逐步讲解如何高效、安全地查看 Redis 中的所有 key,并深入探讨不同场景下的最佳实践。
主体
1. Redis 基础概念回顾
什么是 Redis 的 key?
Redis 是一个基于内存的高性能键值存储系统。每个数据项都由一个 key 和对应的 value 组成。key 是唯一的标识符,用于定位和操作数据。例如,存储用户信息时,可以将 user:1001:profile
作为 key,对应的 value 是用户的详细信息。
为什么需要查看所有 key?
- 调试:当程序出现异常时,检查 key 是否存在或是否符合预期。
- 清理缓存:定期删除过期或冗余数据,避免内存浪费。
- 监控:分析 key 的分布和生命周期,优化 Redis 配置。
2. 查看所有 key 的核心命令
方法一:使用 KEYS
命令
KEYS
是 Redis 最直观的命令,用于匹配所有符合模式的 key。其语法为:
KEYS pattern
示例:
在 Redis 命令行工具(redis-cli
)中执行:
127.0.0.1:6379> KEYS *
1) "user:1001:profile"
2) "product:book:price"
3) "session:temp_token"
注意:*
是通配符,表示匹配所有 key。
比喻:KEYS
就像“地毯式搜索”
如果把 Redis 的内存比作一个仓库,KEYS *
就是打开仓库大门,逐个扫描每个货架上的物品。虽然简单直接,但这种“地毯式搜索”在数据量较大时会显著拖慢系统性能。
方法二:使用 SCAN
命令
SCAN
是 Redis 推荐的替代方案,通过分批次“游标”遍历 key,避免阻塞服务器。其语法为:
SCAN cursor [MATCH pattern] [COUNT count]
cursor
:起始游标(初始值为0
)。MATCH
:可选参数,指定匹配模式(如user:*
)。COUNT
:建议每次返回的 key 数量(默认10
)。
示例:
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 2
1) "123"
2) 1) "user:1001:profile"
2) "user:1002:profile"
解释:
- 返回的第一个值
123
是下一个游标,需在下一次命令中继续使用。 - 第二个值是本次扫描的 key 列表。
比喻:SCAN
就像“分页翻书”
如果把所有 key 比作一本厚重的书,SCAN
会像翻页一样逐步读取内容,既保证了效率,又避免了一次性加载全部内容导致的卡顿。
3. KEYS
和 SCAN
的性能对比
命令 | 性能 | 适用场景 |
---|---|---|
KEYS | 阻塞 Redis 服务,数据量越大越明显 | 开发调试、小规模环境 |
SCAN | 非阻塞,性能稳定 | 生产环境、大数据量场景 |
关键区别:
KEYS
一次性返回所有匹配的 key,当数据量超过万级时,可能导致 Redis 响应延迟甚至崩溃。SCAN
通过游标分批次返回数据,每次操作仅消耗固定资源,适合高并发场景。
4. 实战案例:如何安全地查看所有 key
案例 1:开发环境快速排查问题
在开发阶段,假设需要检查某个用户是否缓存了 session 信息:
127.0.0.1:6379> KEYS session:*
1) "session:temp_token_001"
2) "session:temp_token_002"
此时使用 KEYS
是安全的,因为数据量小且不会影响性能。
案例 2:生产环境清理过期 key
在生产环境中,若需清理所有过期的临时 token,应避免使用 KEYS
。推荐结合 SCAN
和 DEL
命令:
127.0.0.1:6379> EVAL "local cursor = tonumber(ARGV[1]) local keys = {} repeat local result = redis.call('SCAN', cursor, 'MATCH', 'token:*') cursor = tonumber(result[1]) for _, key in ipairs(result[2]) do local ttl = redis.call('TTL', key) if ttl == -2 then -- key 不存在,或已过期 table.insert(keys, key) end end until cursor == 0 return keys" 0
解释:
- 通过 Lua 脚本实现原子操作,避免因多次
SCAN
导致的 key 重复或遗漏。 TTL
命令检查 key 的剩余生存时间,若返回-2
则表示 key 已过期。
5. 高级技巧与注意事项
技巧 1:结合 TYPE
和 EXISTS
命令
在查看 key 后,可通过 TYPE
确认其数据类型,或用 EXISTS
检查是否存在:
127.0.0.1:6379> TYPE user:1001:profile
"string"
127.0.0.1:6379> EXISTS product:book:price
(integer) 1
技巧 2:使用 FLUSHALL
或 FLUSHDB
清空数据
若需删除所有 key,可执行:
FLUSHDB
FLUSHALL
注意:此操作不可逆,务必谨慎使用!
6. 常见问题解答
Q1:为什么 Redis 不推荐在生产环境使用 KEYS
?
A:KEYS
会阻塞 Redis 的主线程,当数据量超过万级时,可能导致服务不可用。
Q2:如何高效遍历百万级 key?
A:使用 SCAN
命令,并通过 COUNT
参数调整每次返回的数据量。例如:
SCAN 0 MATCH * COUNT 1000
结论
Redis 查看所有 key 是开发者必须掌握的基础技能,但需根据场景选择合适的方法。KEYS
适合小规模调试,而 SCAN
则是生产环境的最优解。通过结合 MATCH
、COUNT
参数和 Lua 脚本,可以进一步提升操作的灵活性和安全性。
掌握这些技巧后,开发者不仅能高效管理 Redis 数据,还能避免因性能问题导致的服务中断。希望本文的案例和代码示例能帮助读者在实际项目中游刃有余地使用 Redis!