Redis 命令速查
数据结构 / 命令 / 集群 · 点击复制
数据结构 / 命令 / 集群 · 点击复制
排查慢查询时,最怕记混 SCAN 游标与 KEYS 阻塞的区别。输入任意 Redis 命令,它立即展示语法、时间复杂度、返回值结构,并标注集群环境下该命令是否支持跨 slot 执行。所有解析规则内置在浏览器中,命令不离开本地——适合压测前快速确认参数、排查线上问题时对照文档边界。
下午三点线上告警:缓存穿透导致数据库被打满。运维翻出三个月前同事写的脚本,发现 SET 命令的 key 是 'user:123:profile',但另一个模块读的是 'user:123:info'。本工具输入任意两个 key 模式,立即比对它们在 Redis 数据结构中的实际存储路径,高亮冲突点,避免手动翻代码逐行核对。
凌晨两点扩容,要把 500 个哈希槽从 node1 迁到 node4。CLUSTER SETSLOT 敲下去后,业务方问「我那个订单 key 到底在哪个节点」—— 本工具输入 key 和集群节点列表,直接算出它落在哪个槽、当前槽归属节点、迁移状态(迁移中/已完成/未开始),比 redis-cli --cluster check 少打三行参数。
用户反馈「购物车商品半小时后还在」,怀疑 TTL 没设对。开发用 TTL 命令查 key 返回 -1(无过期时间),但代码里明明写了 expire 1800。本工具输入 key 后列出它的创建时间、最近一次修改时间、当前 TTL 值、以及它所在数据库的过期淘汰策略(volatile-lru/allkeys-lru 等),帮开发判断是 SET 覆盖了过期时间,还是策略本身不驱逐该 key。
凌晨流量高峰,Redis 主从同步延迟飙到 30 秒。用 MEMORY USAGE 扫一遍发现一个 zset 存了 200 万条用户积分记录,单个 key 占 1.2GB。本工具输入 key 后显示它的编码方式(ziplist/skiplist)、元素数量、平均元素大小、以及建议拆分维度(按时间/按用户 ID 哈希),并给出拆分后每个子 key 的预估内存,避免拍脑袋切分后反而更慢。
业务方投诉「排行榜接口响应 8 秒」,SLOWLOG GET 拉出来一堆 ZREVRANGEBYSCORE 耗时 1200ms。本工具输入慢查询 ID,直接解析出该命令的完整参数(key 名、起始分数、偏移量、limit)、当时 key 的大小、以及该命令的时间复杂度(O(logN+M)),并对比同类型命令(ZRANGEBYSCORE vs ZREVRANGEBYSCORE)的耗时差异,帮开发判断是该加索引还是该分库。
| 输入 | 输出 | 说明 |
|---|---|---|
| SET key value | OK | 常规:最基础的字符串写入命令,验证工具能识别并返回标准响应 |
| GET key | "value" | 常规:配合上一条验证读写一致性,输出带引号表示字符串类型 |
| EXPIRE key 0 | (integer) 1 | 边界:设置过期时间为0秒,实际会立即删除key,返回1表示成功设置过期 |
| LPUSH list a b c | (integer) 3 | 边界:批量插入多个元素到列表头部,验证多参数处理和返回长度 |
| SADD set 1 2 3 1 | (integer) 3 | 易错:集合添加重复元素,返回实际新增数量(3),不是参数数量(4),暴露集合去重特性 |
| ZADD zset 1 a 2 b 3 c | (integer) 3 | 常规:有序集合添加成员,验证分数和成员的成对输入格式 |
| CLUSTER INFO | cluster_state:fail cluster_slots_assigned:0 ... | 边界:未配置集群时返回错误状态信息,暴露工具对集群命令的响应处理 |
| FLUSHALL | OK | 易错:危险命令,虽然返回OK但实际清空所有数据库,提示用户谨慎使用 |
1.FLUSHALL 在线上环境误执行
FLUSHALLFLUSHALL ASYNCFLUSHALL 同步删除所有键,阻塞主线程。线上应加 ASYNC 参数异步删除,或先用 INFO keyspace 确认实例角色。
2.KEYS 命令阻塞生产实例
KEYS user:*SCAN 0 MATCH user:* COUNT 100KEYS 遍历全库键,O(N) 复杂度,阻塞 Redis 主线程。SCAN 是游标迭代,分步返回,不阻塞。
3.SET 过期时间单位误用秒为毫秒
SET token abc123 EX 5000SET token abc123 EX 5EX 参数单位是秒,5000 秒 ≈ 83 分钟。要设 5 秒过期,应写 EX 5。毫秒用 PX 参数。
4.ZADD 重复添加相同 member 覆盖分数
ZADD leaderboard 100 user1ZINCRBY leaderboard 100 user1ZADD 对已存在 member 会覆盖 score,不是累加。要累加分数用 ZINCRBY。
5.HGETALL 读取大哈希导致 O(N) 阻塞
HGETALL user:123HSCAN user:123 0 COUNT 100HGETALL 返回哈希所有字段,O(N) 且 N 大时阻塞。HSCAN 分批迭代,适合大哈希。
6.SORT 命令未指定排序方向默认升序
SORT mylistSORT mylist DESCSORT 默认升序(ASC)。要降序需显式加 DESC,否则结果顺序可能不符合预期。
7.SUBSCRIBE 后误用 GET 获取消息
SUBSCRIBE channel1
GET channel1SUBSCRIBE channel1
(等待 PUBLISH 推送)SUBSCRIBE 进入发布/订阅模式,阻塞当前连接。不能混用 GET 命令,消息由 Redis 主动推送。
8.EVAL 脚本中未处理空返回值
local val = redis.call('GET', KEYS[1]); return val[1]local val = redis.call('GET', KEYS[1]); if val then return val else return nil endGET 返回 nil 时,val[1] 报错。Lua 脚本必须显式检查 nil,否则脚本异常退出。
CRC16(key) % 16384
keyRedis 键名,字符串CRC16循环冗余校验,生成 16 位哈希16384Redis 集群固定哈希槽总数键名 'user:1001' 的 CRC16 值为 0x3A44(十进制 14916),14916 % 16384 = 14916,该键被分配到槽 14916,由负责该槽范围的集群节点处理。
能。在输入框里输入 `TYPE key_name` 命令,工具会返回 `string`、`list`、`set`、`zset`、`hash` 或 `none` 这几种结果。注意这里只查 key 的类型,不查 value 的具体内容;如果要看 value,得用对应的 GET / LRANGE / SMEMBERS 等命令。另外,如果 key 不存在,返回的是 `none` 而不是报错。
`KEYS *` 在生产环境的 Redis 实例上很容易卡住,因为它会遍历整个 keyspace,数据量一大(比如百万级 key)就会阻塞 Redis 单线程,导致其他命令排队超时。这个工具虽然只在本机执行,但如果你连的是远程 Redis 且数据量大,一样会等很久。建议换成 `SCAN 0 COUNT 100` 分批扫描,不阻塞,每次返回游标和一小批 key,再根据游标继续。
主要区别是:1) 纯浏览器端(WASM 实现),所有命令在本机执行,不会经过任何后端,适合测试环境或学习 Redis 语法;2) 不支持 `MONITOR`、`SUBSCRIBE` 这类长连接命令,因为浏览器无法维持持久 TCP 连接;3) 不支持 `CLUSTER` 相关命令(如 `CLUSTER NODES`),因为模拟不了集群拓扑;4) 性能上限比原生 redis-cli 低,不适合跑百万级数据基准测试。日常调试单条命令完全够用。
这一般是 key 或 value 里混了不可见字符。检查一下:1) `SET` 命令的 key 和 value 是否有多余空格或引号,比如 `SET foo bar` 和 `SET foo bar`(bar 后面多了空格)是两个不同的 key;2) 如果 value 本身包含空格,必须用双引号括起来,比如 `SET foo "hello world"`;3) 也可能是之前用 `EXPIRE` 设置了过期时间,key 已经自动删除了。可以用 `TTL foo` 查看剩余秒数,-2 表示 key 不存在或已过期。
Redis 的 `INCR` 命令返回结果在协议层面确实是整数,但本工具在浏览器端解析结果时,为了统一显示格式,把所有返回值都转成了字符串输出。实际数值计算没有问题,你可以把它当数字用——比如 `INCR counter` 返回 `"1"`,再执行一次返回 `"2"`,逻辑正确。如果需要纯数字格式,可以手动用 `parseInt()` 处理,或者用 `INCRBYFLOAT` 返回带小数的结果。
不会。这个工具所有命令都在浏览器本地模拟的 Redis 环境里执行,不连任何远程服务器。`FLUSHALL` 只会清空你当前会话里临时创建的数据,刷新页面或关闭标签页就没了。如果想测试危险命令又怕误操作,这个工具是安全的沙箱环境。但注意:如果你自己配置了连接远程 Redis 的代理(比如通过 WebSocket 转发),那命令会直接打到远程,务必先确认连接目标。
`EXPIRE` 设置的是以秒为单位的 TTL(生存时间),但本工具的时间精度和浏览器的事件循环有关,不是实时物理时间。如果浏览器标签页处于后台或 CPU 繁忙,定时器可能被延迟几秒甚至几十秒,导致 key 过期时间不准。建议:1) 用 `TTL key` 查看剩余秒数,如果返回 -1 说明没设置过期;2) 需要精确毫秒级过期用 `PEXPIRE`(毫秒单位);3) 不要依赖这个工具测试高精度过期场景,那是 Redis 服务器的事。
不是。`INFO` 命令在本工具里返回的是模拟环境的默认值,不是真实 Redis 实例的统计数据。比如 `connected_clients` 永远是 0,因为浏览器端没有实际客户端连接;`used_memory_human` 也是固定值,因为没分配真实内存。这个命令在本工具里主要用来查看支持的功能模块(如 `#Server`、`#Keyspace` 等段落的字段列表),想了解真实运行状态还是得连到实际 Redis 实例上执行。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。