开发者工具 · 数据库

Redis 命令大全

数据结构/命令/集群

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 56 次使用

Redis 命令速查

数据结构 / 命令 / 集群 · 点击复制

第一节

关于本工具

About

排查慢查询时,最怕记混 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。

大 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)的耗时差异,帮开发判断是该加索引还是该分库。

第二节

使用指南

Getting Started

使用步骤

  1. 1在左侧输入框键入 Redis 命令(如 `SET key value`),右侧实时解析命令结构并高亮参数占位符
  2. 2点击「数据结构」标签页,查看当前命令操作的数据类型(如字符串/列表/哈希)及对应操作示例
  3. 3展开「集群模式」说明区域,查看该命令在 Redis 集群环境下的兼容性与重定向行为
  4. 4点击「复制命令」按钮,将当前命令及其参数模板复制到剪贴板,供终端或代码中直接粘贴使用

输入输出示例

输入输出说明
SET key valueOK常规:最基础的字符串写入命令,验证工具能识别并返回标准响应
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 INFOcluster_state:fail cluster_slots_assigned:0 ...边界:未配置集群时返回错误状态信息,暴露工具对集群命令的响应处理
FLUSHALLOK易错:危险命令,虽然返回OK但实际清空所有数据库,提示用户谨慎使用

常见错误对照

1.FLUSHALL 在线上环境误执行

✗ 错误FLUSHALL
✓ 修复FLUSHALL ASYNC

FLUSHALL 同步删除所有键,阻塞主线程。线上应加 ASYNC 参数异步删除,或先用 INFO keyspace 确认实例角色。

2.KEYS 命令阻塞生产实例

✗ 错误KEYS user:*
✓ 修复SCAN 0 MATCH user:* COUNT 100

KEYS 遍历全库键,O(N) 复杂度,阻塞 Redis 主线程。SCAN 是游标迭代,分步返回,不阻塞。

3.SET 过期时间单位误用秒为毫秒

✗ 错误SET token abc123 EX 5000
✓ 修复SET token abc123 EX 5

EX 参数单位是秒,5000 秒 ≈ 83 分钟。要设 5 秒过期,应写 EX 5。毫秒用 PX 参数。

4.ZADD 重复添加相同 member 覆盖分数

✗ 错误ZADD leaderboard 100 user1
✓ 修复ZINCRBY leaderboard 100 user1

ZADD 对已存在 member 会覆盖 score,不是累加。要累加分数用 ZINCRBY。

5.HGETALL 读取大哈希导致 O(N) 阻塞

✗ 错误HGETALL user:123
✓ 修复HSCAN user:123 0 COUNT 100

HGETALL 返回哈希所有字段,O(N) 且 N 大时阻塞。HSCAN 分批迭代,适合大哈希。

6.SORT 命令未指定排序方向默认升序

✗ 错误SORT mylist
✓ 修复SORT mylist DESC

SORT 默认升序(ASC)。要降序需显式加 DESC,否则结果顺序可能不符合预期。

7.SUBSCRIBE 后误用 GET 获取消息

✗ 错误SUBSCRIBE channel1 GET channel1
✓ 修复SUBSCRIBE 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 end

GET 返回 nil 时,val[1] 报错。Lua 脚本必须显式检查 nil,否则脚本异常退出。

第三节

工作原理

How It Works

核心公式

CRC16(key) % 16384

变量说明

  • keyRedis 键名,字符串
  • CRC16循环冗余校验,生成 16 位哈希
  • 16384Redis 集群固定哈希槽总数

示例

键名 'user:1001' 的 CRC16 值为 0x3A44(十进制 14916),14916 % 16384 = 14916,该键被分配到槽 14916,由负责该槽范围的集群节点处理。

输入命令如 SET / GET / KEYS解析命令结构拆分命令+参数查表匹配校验参数合法性输出结果语法/示例/说明
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
我想查 Redis 某个 key 的类型,这个工具能直接告诉我吗?

能。在输入框里输入 `TYPE key_name` 命令,工具会返回 `string`、`list`、`set`、`zset`、`hash` 或 `none` 这几种结果。注意这里只查 key 的类型,不查 value 的具体内容;如果要看 value,得用对应的 GET / LRANGE / SMEMBERS 等命令。另外,如果 key 不存在,返回的是 `none` 而不是报错。

为什么我执行 `KEYS *` 后半天没反应?

`KEYS *` 在生产环境的 Redis 实例上很容易卡住,因为它会遍历整个 keyspace,数据量一大(比如百万级 key)就会阻塞 Redis 单线程,导致其他命令排队超时。这个工具虽然只在本机执行,但如果你连的是远程 Redis 且数据量大,一样会等很久。建议换成 `SCAN 0 COUNT 100` 分批扫描,不阻塞,每次返回游标和一小批 key,再根据游标继续。

这个工具和 redis-cli 比,除了不用装客户端还有什么区别?

主要区别是:1) 纯浏览器端(WASM 实现),所有命令在本机执行,不会经过任何后端,适合测试环境或学习 Redis 语法;2) 不支持 `MONITOR`、`SUBSCRIBE` 这类长连接命令,因为浏览器无法维持持久 TCP 连接;3) 不支持 `CLUSTER` 相关命令(如 `CLUSTER NODES`),因为模拟不了集群拓扑;4) 性能上限比原生 redis-cli 低,不适合跑百万级数据基准测试。日常调试单条命令完全够用。

我输入 `SET foo bar` 返回 OK,但 `GET foo` 却显示 (nil),怎么回事?

这一般是 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 不存在或已过期。

为什么 `INCR` 命令返回的是字符串而不是数字?

Redis 的 `INCR` 命令返回结果在协议层面确实是整数,但本工具在浏览器端解析结果时,为了统一显示格式,把所有返回值都转成了字符串输出。实际数值计算没有问题,你可以把它当数字用——比如 `INCR counter` 返回 `"1"`,再执行一次返回 `"2"`,逻辑正确。如果需要纯数字格式,可以手动用 `parseInt()` 处理,或者用 `INCRBYFLOAT` 返回带小数的结果。

我执行 `FLUSHALL` 会不会把远程服务器的数据也清掉?

不会。这个工具所有命令都在浏览器本地模拟的 Redis 环境里执行,不连任何远程服务器。`FLUSHALL` 只会清空你当前会话里临时创建的数据,刷新页面或关闭标签页就没了。如果想测试危险命令又怕误操作,这个工具是安全的沙箱环境。但注意:如果你自己配置了连接远程 Redis 的代理(比如通过 WebSocket 转发),那命令会直接打到远程,务必先确认连接目标。

为什么 `EXPIRE key 10` 之后 10 秒 key 还在?

`EXPIRE` 设置的是以秒为单位的 TTL(生存时间),但本工具的时间精度和浏览器的事件循环有关,不是实时物理时间。如果浏览器标签页处于后台或 CPU 繁忙,定时器可能被延迟几秒甚至几十秒,导致 key 过期时间不准。建议:1) 用 `TTL key` 查看剩余秒数,如果返回 -1 说明没设置过期;2) 需要精确毫秒级过期用 `PEXPIRE`(毫秒单位);3) 不要依赖这个工具测试高精度过期场景,那是 Redis 服务器的事。

我查 `INFO` 命令返回的信息全是 0,是不是工具没跑起来?

不是。`INFO` 命令在本工具里返回的是模拟环境的默认值,不是真实 Redis 实例的统计数据。比如 `connected_clients` 永远是 0,因为浏览器端没有实际客户端连接;`used_memory_human` 也是固定值,因为没分配真实内存。这个命令在本工具里主要用来查看支持的功能模块(如 `#Server`、`#Keyspace` 等段落的字段列表),想了解真实运行状态还是得连到实际 Redis 实例上执行。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭