这是《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"
- 第一项是下一次游标;
- 返回
0表示一轮完成; COUNT是提示值,不是精确每批数量;SCAN只保证完整轮次内不遗漏,不保证实时一致。
示例脚本:
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
返回包含:
- 唯一 ID;
- 发生时间戳; – 执行微秒数;
- 完整命令与参数;
- 客户端地址与名称。
内置延迟监测:
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 |
本章小结
redis-cli是开发与排障第一工具,连接名与认证要规范化;- 生产禁用
KEYS,扫描使用SCAN; - 大 key 删除用
UNLINK,读取避免全量命令; INFO、SLOWLOG、CLIENT、MEMORY是四大诊断入口;- 批量操作能减少 RTT,但必须控制批次大小。
思考题
SCAN COUNT 100是否一定每次返回 100 个 key?为什么?DEL与UNLINK的区别是什么?为什么大集合更适合UNLINK?- 如果慢查询里出现大量
HGETALL,你会如何改造业务与数据结构?