RedisNotes

第 04 章:第一批命令

zjc 于 2026-01-04 发布

这是《Redis 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 本章从连接与认证开始,掌握日常开发最常用的命令、调试工具和危险命令,并理解 redis-cli 输出。

4.1 连接与认证

redis-cli -h 127.0.0.1 -p 6379

带密码:

redis-cli -h host -p 6379 --user default -a your-password

更安全:

export REDISCLI_AUTH=your-password
redis-cli -h host -p 6379

交互模式:

AUTH your-password
PING
ECHO hello
SELECT 0
QUIT

4.2 第一个 key

SET user:1001 "Tom"
GET user:1001
STRLEN user:1001
APPEND user:1001 " Cat"
GET user:1001

带过期时间:

SET session:abc "user-1001" EX 1800
TTL session:abc
PTTL session:abc
EXPIRE session:abc 600
PERSIST session:abc
DEL session:abc

原子设置不存在才成功:

SET lock:order:1001 owner-1 NX PX 30000

4.3 key 检索:不要用 KEYS

危险命令:

KEYS *
KEYS user:*

它会遍历 key 空间并在返回前阻塞服务。生产必须使用 SCAN

SCAN 0 MATCH user:* COUNT 100

返回:

1) "17"
2) 1) "user:1001"
   2) "user:1002"

示例脚本:

cursor=0
while :; do
  reply=$(redis-cli SCAN "$cursor" MATCH 'user:*' COUNT 200)
  cursor=$(echo "$reply" | head -n 1)
  echo "$reply" | tail -n +2 | grep -v '^$'
  [ "$cursor" = "0" ] && break
done

4.4 判断、重命名与类型

EXISTS user:1001
TYPE user:1001
RENAME old-key new-key
RENAMENX old-key new-key
DEL user:1001
UNLINK user:1001
RANDOMKEY

DEL 同步释放内存,大 key 可能阻塞;UNLINK 异步释放 value,更适合生产删除。

4.5 批量操作

MSET a 1 b 2 c 3
MGET a b c

优点:减少网络往返。风险:一次打包过多 key 或超大 value,会占用带宽并放大延迟。建议每批控制在几十到几百个,并实测延迟。

4.6 查看信息与配置

INFO server
INFO clients
INFO memory
INFO stats
INFO replication
INFO persistence
INFO keyspace

查看当前配置:

CONFIG GET maxmemory
CONFIG GET maxmemory-policy

运行期修改:

CONFIG SET maxmemory 2gb
CONFIG SET slowlog-log-slower-than 10000
CONFIG REWRITE

CONFIG REWRITE 会把可持久化修改写回配置文件;前提是 Redis 对配置文件有写权限。

4.7 客户端连接

CLIENT LIST
CLIENT INFO
CLIENT ID
CLIENT SETNAME order-service
CLIENT GETNAME
CLIENT KILL ID 123
CLIENT NO-EVICT ON

CLIENT LIST 重点字段:

字段 含义
id 连接 ID
addr 客户端地址
name 连接名
age 连接存活秒数
idle 空闲秒数
db 当前 DB
cmd 最近命令
sub/psub 订阅数

生产服务建议设置连接名,方便定位流量来源。

4.8 慢查询与延迟诊断

SLOWLOG GET 10
SLOWLOG LEN
SLOWLOG RESET

返回包含:

内置延迟监测:

LATENCY HISTORY event
LATENCY DOCTOR
DEBUG SLEEP 0

DEBUG 命令可能造成阻塞或破坏状态,只能用于隔离的实验环境。

4.9 内存与大 key 诊断

MEMORY USAGE user:1001
MEMORY USAGE rank:activity SAMPLES 0
MEMORY DOCTOR
MEMORY STATS
DBSIZE

按类型统计:

INFO keyspace

输出示例:

db0:keys=100000,expires=90000,avg_ttl=1200000

注意 MEMORY USAGE 对大集合也要计算编码和采样,不要在高峰对大量 key 全量执行。

4.10 危险命令清单

命令 风险
KEYS * 阻塞主线程
FLUSHALL 清空所有数据
FLUSHDB 清空当前 DB
DEL bigkey 同步释放阻塞
HGETALL hugehash 大响应拖垮网络/客户端
SMEMBERS hugeset 同上
LRANGE key 0 -1 全量大列表
DEBUG/SHUTDOWN 运维危险操作

生产可通过 ACL 禁用或限制命令:

ACL SETUSER app -keys -flushall -flushdb -shutdown

4.11 常用命令速查

目的 命令
连接测试 PING
设置字符串 SET key value EX 60
读取 GET key
删除 UNLINK key
扫描 SCAN cursor MATCH pattern COUNT 100
查看类型 TYPE key
查看内存 MEMORY USAGE key
查看信息 INFO memory
慢查询 SLOWLOG GET 10
客户端 CLIENT LIST
配置 CONFIG GET/SET

本章小结

思考题

  1. SCAN COUNT 100 是否一定每次返回 100 个 key?为什么?
  2. DELUNLINK 的区别是什么?为什么大集合更适合 UNLINK
  3. 如果慢查询里出现大量 HGETALL,你会如何改造业务与数据结构?