1. Redis基础命令概览
Redis作为当今最流行的内存数据库之一,其命令行接口是开发者日常操作的核心工具。不同于传统关系型数据库,Redis的命令集设计体现了键值存储的简洁哲学。我初次接触Redis时,最惊讶的是其命令的语义化程度——大多数操作都能通过命令名直观理解,比如SET、GET、DEL这种类自然语言的表达方式。
Redis命令的响应速度通常以微秒计,这得益于其单线程架构和内存操作特性。但要注意,某些命令如KEYS在生产环境可能引发性能问题,后面我们会详细讨论替代方案。所有命令都遵循"动词-键名-参数"的基础结构,例如EXPIRE user:1000 60表示为用户1000的数据设置60秒过期时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据操作核心命令解析
2.1 字符串类型操作
字符串是Redis最基础的数据类型,其操作命令看似简单却隐藏着许多实用技巧:
bash复制# 基础SET/GET
SET username "john_doe" # 设置键值
GET username # 获取值
# 带条件的设置
SETNX new_key "value" # 仅当键不存在时设置(实现分布式锁的基础)
# 批量操作
MSET key1 "v1" key2 "v2" # 一次设置多个键
MGET key1 key2 # 一次获取多个值
# 数值运算
INCR counter # 原子性+1
INCRBY counter 5 # 原子性+5
实际项目中,我经常用SETEX命令实现带自动过期的缓存:
bash复制SETEX api_cache 300 "{'data':[...]}" # 300秒后自动删除
2.2 哈希类型操作
哈希适合存储对象类型数据,相比字符串的JSON序列化方案更节省内存:
bash复制# 用户对象存储示例
HSET user:1000 name "John" age 30 email "john@example.com"
HGET user:1000 name # 获取单个字段
HGETALL user:1000 # 获取所有字段
# 字段操作
HINCRBY user:1000 age 1 # 年龄+1
HEXISTS user:1000 email # 检查字段是否存在
在电商系统中,我用哈希存储商品详情时发现:当字段数超过500时,HGETALL会明显变慢,此时应改用HSCAN进行分批获取。
2.3 列表与集合操作
列表(Lists)实现队列/栈结构,集合(Sets)提供去重特性:
bash复制# 列表操作
LPUSH tasks "task1" # 左端插入
RPOP tasks # 右端弹出
LRANGE tasks 0 -1 # 获取全部元素
# 集合操作
SADD tags "redis" "database" # 添加元素
SISMEMBER tags "redis" # 检查存在
SINTER set1 set2 # 求交集
一个实际案例:用LPUSH+BRPOP实现任务队列时,要注意BRPOP的空闲连接超时设置,避免长期阻塞消耗资源。
3. 系统管理关键命令
3.1 持久化相关命令
虽然持久化通常由配置文件控制,但手动触发在某些场景很有用:
bash复制BGSAVE # 后台保存RDB快照
LASTSAVE # 获取最后一次成功保存的时间戳
SAVE # 同步保存(会阻塞,生产环境慎用)
# AOF相关
BGREWRITEAOF # 重写AOF文件
在数据迁移时,我会先用BGSAVE生成RDB文件,然后配合LASTSAVE确认数据完整性。注意SAVE命令会完全阻塞Redis,在数据量大的情况下可能导致服务不可用。
3.2 性能监控命令
bash复制INFO # 获取全部系统信息
INFO memory # 查看内存详情
INFO stats # 查看操作统计
# 慢查询日志
SLOWLOG GET # 获取慢查询记录
CONFIG SET slowlog-log-slower-than 10000 # 设置10毫秒阈值
通过INFO memory发现内存碎片率(mem_fragmentation_ratio)大于1.5时,应考虑重启实例或使用MEMORY PURGE(Redis 4.0+)清理碎片。
4. 生产环境实践技巧
4.1 危险命令替代方案
bash复制# 避免使用KEYS *
SCAN 0 MATCH user:* COUNT 100 # 分批迭代键
# 替代FLUSHALL/FLUSHDB
RENAME yourdb yourdb_backup # 重命名当前数据库
CONFIG SET dir /new/path # 修改持久化目录
曾有一次误操作FLUSHDB导致数据丢失后,我现在执行危险命令前都会先CONFIG SET rename-command FLUSHDB ""禁用命令。
4.2 内存优化命令
bash复制MEMORY USAGE key # 查看键的内存占用
MEMORY STATS # 详细内存分析(Redis 4.0+)
# 淘汰策略设置
CONFIG SET maxmemory-policy allkeys-lru
对于大Hash,可以用HSCAN+HDEL分批删除字段,避免单次大Key操作阻塞服务。
4.3 Lua脚本使用
bash复制EVAL "return redis.call('GET', KEYS[1])" 1 mykey
在实现复杂原子操作时,Lua脚本比事务(MULTI/EXEC)更灵活。但要注意:
- 脚本应尽量简短
- 避免在脚本中使用
KEYS命令 - 设置适当的
lua-time-limit
5. 集群与分布式相关命令
5.1 主从复制命令
bash复制REPLICAOF 127.0.0.1 6379 # 设置主节点(Redis 5.0+)
ROLE # 查看节点角色
配置主从时,我通常会先用INFO replication确认连接状态,再通过CONFIG REWRITE持久化配置。
5.2 Redis Cluster管理
bash复制CLUSTER NODES # 查看集群节点
CLUSTER KEYSLOT key # 计算键的槽位
CLUSTER MEET ip port # 添加节点
处理集群迁移时,CLUSTER SETSLOT系列命令需要特别小心,错误的槽位分配可能导致数据丢失。
6. 客户端连接管理
6.1 连接控制命令
bash复制CLIENT LIST # 查看所有连接
CLIENT KILL ip:port # 断开指定连接
CLIENT SETNAME myconn # 为当前连接命名
排查连接泄漏问题时,CLIENT LIST的输出中要特别关注idle(空闲时间)和cmd(最后执行的命令)。
6.2 配置热更新
bash复制CONFIG GET maxclients # 获取当前配置
CONFIG SET maxclients 10000 # 动态修改
CONFIG REWRITE # 持久化到配置文件
动态调整配置后,一定要确认CONFIG REWRITE成功执行,否则重启后配置会丢失。我曾因此导致生产环境连接数被重置,引发事故。
7. 高级特性命令
7.1 流(Stream)操作
bash复制XADD mystream * sensor_id 1234 temp 19.8
XRANGE mystream - + COUNT 10
XGROUP CREATE mystream mygroup $
用Stream实现消息队列时,消费者组的XREADGROUP要注意设置合理的BLOCK时间,避免频繁空轮询。
7.2 地理空间命令
bash复制GEOADD cities 116.405285 39.904989 "Beijing"
GEORADIUS cities 116.40 39.90 100 km
地理位置查询的性能与数据量成正比,超过百万个点位时应考虑按地理哈希分片存储。
8. 调试与问题排查
8.1 键空间分析
bash复制OBJECT ENCODING key # 查看内部编码
DEBUG OBJECT key # 详细对象信息
TTL key # 查看剩余生存时间
发现内存异常增长时,通过OBJECT ENCODING可以识别是否因数据量增长导致编码升级(如ziplist转hash)。
8.2 监控命令统计
bash复制COMMAND INFO GET SET # 查看命令元信息
COMMAND COUNT # 总命令数
COMMAND STATS # 命令调用统计(Redis 7.0+)
在性能调优时,COMMAND STATS可以帮助识别热点命令,我曾借此发现一个隐蔽的HGETALL滥用问题。
9. 安全相关命令
9.1 访问控制
bash复制AUTH password # 密码认证
ACL LIST # 查看ACL规则(Redis 6.0+)
ACL SETUSER alice on >pass123 ~cached:* +get
生产环境一定要配置ACL,我见过因使用弱密码导致Redis被入侵挖矿的案例。建议遵循最小权限原则分配命令权限。
10. 实用技巧与经验分享
-
管道(Pipeline)优化:批量命令使用管道可提升10-100倍吞吐量
bash复制(echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379 -
事务(MULTI)陷阱:Redis事务不支持回滚,错误命令会继续执行
bash复制MULTI SET a 1 INCR a b c # 语法错误 EXEC # a仍会被设置 -
大Key处理:超过10KB的Key应考虑拆分
bash复制# 拆分大Hash HSCAN bigkey 0 COUNT 100 -
连接池配置:根据
INFO clients调整maxclients和连接池大小 -
内存报警:设置
maxmemory并监控used_memory,建议预留30%缓冲
在多年的Redis使用中,最大的教训是:永远不要在生产环境直接执行不熟悉的命令。我习惯先在测试环境用--intrinsic-latency检查命令性能,再用MONITOR观察实际效果。对于危险命令,最好通过rename-command进行别名或禁用。
