1. Redis通用命令概述
Redis作为当前最流行的内存数据库之一,其命令体系是每个开发者必须掌握的核心技能。通用命令(Generic Commands)是指那些不局限于特定数据类型,可以在所有Redis键上执行的基础操作。这些命令构成了Redis日常使用的基石,无论是字符串、哈希、列表还是集合操作,都建立在通用命令的基础之上。
我在实际项目中发现,很多团队虽然频繁使用Redis,但对通用命令的理解往往停留在表面。比如DEL命令看似简单,但在处理百万级键值删除时,直接使用可能导致服务阻塞;又比如EXISTS命令在集群环境下的表现与单机模式完全不同。本文将结合我多年Redis运维经验,从实战角度剖析这些"熟悉又陌生"的通用命令。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 键空间操作命令详解
2.1 键管理基础命令
DEL命令是最常用的删除操作,但需要注意:
bash复制# 删除单个键
DEL user:1001
# 批量删除(原子性操作)
DEL user:1001 user:1002 session:abc
警告:生产环境避免直接执行
DEL *,这会导致Redis阻塞。对于大批量删除,建议使用SCAN+DEL组合或设置过期时间让Redis自动清理。
EXISTS命令的返回值在集群模式下需要注意:
bash复制# 单机模式下返回存在的键数量
EXISTS key1 key2
# 集群模式下如果键不在同一节点,可能返回不准确结果
2.2 键过期控制
TTL/PTTL命令用于检查键的剩余生存时间:
bash复制# 设置带过期时间的键
SETEX cache:item 3600 "value"
# 获取剩余秒数(-2表示键不存在,-1表示永不过期)
TTL cache:item
# 获取毫秒级精度
PTTL cache:item
EXPIRE/PEXPIRE命令的精度差异:
bash复制# 秒级过期
EXPIRE lock:order 30
# 毫秒级过期(适合高精度控制)
PEXPIRE lock:order 30000
3. 键信息查询与维护
3.1 键信息获取
TYPE命令返回键的数据类型:
bash复制TYPE user:profile # 可能返回string, hash, list等
OBJECT命令可获取内部编码信息:
bash复制OBJECT ENCODING user:list # 可能返回ziplist, linkedlist等
3.2 键遍历策略
SCAN命令是生产环境唯一推荐的遍历方式:
bash复制# 安全遍历所有键(避免KEYS *导致的阻塞)
SCAN 0 MATCH "user:*" COUNT 100
经验:COUNT参数需要根据实际数据量调整,通常设置在100-1000之间。过小会导致多次网络往返,过大可能引起单次请求延迟。
4. 高级操作与性能优化
4.1 原子性操作
RENAME/RENAMENX命令的原子性特性:
bash复制# 原子性重命名
RENAME old_key new_key
# 仅当new_key不存在时执行
RENAMENX old_key new_key
4.2 持久化相关命令
DUMP/RESTORE实现键的序列化迁移:
bash复制# 序列化键值
DUMP user:1001 > user.dump
# 反序列化恢复(可指定TTL)
RESTORE user:1001 0 "\x00\x05value"
5. 生产环境实战技巧
5.1 大键识别与处理
通过以下命令组合识别大键:
bash复制redis-cli --bigkeys
# 或使用SCAN+DEBUG OBJECT组合
DEBUG OBJECT user:large_data
处理方案:
- 拆分大哈希为多个小键
- 对大列表使用分片存储
- 对集合考虑使用IntSet编码优化
5.2 内存优化配置
在redis.conf中调整这些参数:
code复制hash-max-ziplist-entries 512
list-max-ziplist-size -2
set-max-intset-entries 512
6. 集群模式特殊考量
6.1 跨节点命令限制
以下命令在集群中受限:
- MOVE(只能在单机使用)
- RENAME(要求键在同一slot)
- SCAN(需要每个节点单独执行)
6.2 批量操作优化
使用Hash Tag确保键在同一节点:
bash复制# 使用{}定义hash tag
MSET {user}.1001.name "Alice" {user}.1001.age 30
7. 监控与调试命令
7.1 实时监控
MONITOR命令的谨慎使用:
bash复制# 临时调试使用(会产生性能开销)
MONITOR
7.2 慢查询分析
配置慢查询阈值:
code复制slowlog-log-slower-than 10000 # 10毫秒
slowlog-max-len 128
查询慢日志:
bash复制SLOWLOG GET 10
8. 安全相关命令
8.1 密码验证
bash复制AUTH password
8.2 命令禁用
在redis.conf中禁用危险命令:
code复制rename-command FLUSHALL ""
rename-command CONFIG ""
9. 性能测试工具
redis-benchmark基本用法:
bash复制redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
关键参数说明:
- -c 并发连接数
- -n 总请求数
- -q 简化输出
- -t 只测试指定命令
10. 客户端连接管理
10.1 连接信息查询
bash复制CLIENT LIST # 查看所有连接
CLIENT GETNAME # 获取当前连接名称
10.2 连接控制
bash复制CLIENT SETNAME "worker-1" # 设置连接名称
CLIENT PAUSE 5000 # 暂停客户端5秒(用于主从切换)
11. 服务器信息统计
INFO命令的关键字段解读:
bash复制INFO memory # 内存使用情况
INFO stats # 命令统计
INFO replication # 主从复制状态
12. 配置动态调整
CONFIG命令的注意事项:
bash复制# 获取配置
CONFIG GET maxmemory
# 动态修改(重启会失效)
CONFIG SET maxmemory 2gb
重要:生产环境修改配置建议同时更新redis.conf文件,避免重启后配置丢失。
13. 数据备份与恢复
13.1 RDB快照
bash复制SAVE # 同步保存(阻塞)
BGSAVE # 后台保存
13.2 AOF重写
bash复制BGREWRITEAOF # 手动触发AOF重写
14. 发布订阅模式
基本发布订阅命令:
bash复制SUBSCRIBE news
PUBLISH news "hello world"
15. Lua脚本执行
bash复制EVAL "return redis.call('GET', KEYS[1])" 1 user:1001
16. 事务处理
MULTI/EXEC基本用法:
bash复制MULTI
SET user:1001:name "Alice"
EXPIRE user:1001:name 3600
EXEC
17. 管道技术优化
通过减少网络往返提升性能:
bash复制(echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
18. 连接池配置建议
Java客户端示例(Jedis):
java复制JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(128);
config.setMaxIdle(32);
config.setMinIdle(8);
19. 常见问题排查
19.1 连接数暴涨
检查方向:
- 连接泄漏(未正确close)
- 客户端连接池配置不当
- 慢查询导致连接堆积
19.2 内存异常增长
排查步骤:
- 检查大键(--bigkeys)
- 查看内存碎片率(INFO memory)
- 确认是否有未设置TTL的缓存
20. 性能优化 checklist
- [ ] 合理设置maxmemory和淘汰策略
- [ ] 对大集合使用分片存储
- [ ] 避免使用KEYS、FLUSHALL等危险命令
- [ ] 对热点数据考虑本地缓存
- [ ] 使用Pipeline减少网络往返
- [ ] 监控慢查询和内存使用情况
