
1. Redis命令概述与基础架构Redis作为内存数据结构存储系统其命令体系构成了整个系统的操作接口。与关系型数据库的SQL语句不同Redis命令采用动词-键-参数的简单结构这种设计使得单个命令的执行时间通常保持在微秒级别。命令通过TCP协议传输默认使用6379端口每个命令以\r\nCRLF作为分隔符。Redis的单线程架构决定了其命令执行的原子性特性。当我们在CLI客户端输入SET foo bar时这个字符串会被转换为*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n$3\r\nbar\r\n\n的协议格式通过套接字传输到服务端后由I/O多路复用模块接收并放入队列最终由主线程顺序执行。关键特性所有Redis命令都是原子操作这意味着在单命令执行过程中不会被其他命令打断。但需要注意多个命令的组合操作非事务模式下不保证原子性。2. 核心数据类型与对应命令2.1 字符串(String)操作命令字符串是Redis最基础的数据类型其相关命令占全部命令的30%以上。SET命令支持多种参数组合SET key value [EX seconds] [PX milliseconds] [NX|XX]EX/PX参数实现自动过期功能NX表示键不存在时才设置XX表示键存在时才设置实际工程中我们常用SETNX实现分布式锁的基础版本# 获取锁 lock_acquired redis.setnx(resource:lock, client_id) if lock_acquired: redis.expire(resource:lock, 30) # 防止死锁踩坑提醒早期版本SETNXEXPIRE非原子操作可能导致死锁Redis 2.6.12后应直接使用带EX参数的SET命令。2.2 哈希(Hash)操作命令哈希适合存储对象类型数据其底层有两种编码方式ziplist元素数量512且值大小64字节hashtable不满足上述条件时典型操作命令对比命令时间复杂度使用场景HSETO(1)设置单个字段HMSETO(N)设置多个字段已弃用HGETALLO(N)获取全部字段2.3 列表(List)操作命令Redis列表基于链表实现使其LPUSH/RPOP操作都是O(1)时间复杂度。消息队列实现示例# 生产者 LPUSH task:queue payload1 # 消费者 while true; do task BRPOP task:queue 30 process(task) done注意BLPOP/BRPOP的阻塞特性与超时参数设置在Java客户端中需要正确处理连接中断场景。3. 高级命令与运维管理3.1 事务与流水线Redis事务通过MULTI、EXEC命令实现但与传统数据库事务有本质区别MULTI INCR counter INCR counter EXEC重要特性Redis事务是全体成功或全体不执行而非全体成功或全体回滚。当事务中的命令出现语法错误时全部不执行运行时错误则不影响其他命令。流水线(pipeline)技术可显著提升批量操作性能with redis.pipeline() as pipe: for i in range(1000): pipe.set(fkey:{i}, i) pipe.execute() # 单次网络往返3.2 Lua脚本执行EVAL命令支持执行Lua脚本实现复杂原子操作-- 限流器实现 local key KEYS[1] local limit tonumber(ARGV[1]) local current tonumber(redis.call(GET, key) or 0) if current 1 limit then return 0 else redis.call(INCR, key) return 1 end脚本执行期间整个Redis实例会被阻塞因此必须控制脚本复杂度。4. 性能优化与问题排查4.1 慢查询日志通过配置slowlog-log-slower-than和slowlog-max-len记录慢查询SLOWLOG GET 5 # 获取最近5条慢查询典型输出字段说明唯一ID时间戳执行耗时(微秒)命令数组4.2 内存优化命令MEMORY USAGE key命令可分析键的内存占用情况结合OBJECT ENCODING key查看编码方式。当发现大量使用hashtable编码的hash时可考虑调整以下参数hash-max-ziplist-entries 512 hash-max-ziplist-value 644.3 持久化相关命令BGSAVE和LASTSAVE命令用于管理RDB持久化redis-cli --rdb dump.rdb # 导出RDB文件AOF重写命令BGREWRITEAOF # 后台重写AOF文件5. 集群与分布式命令5.1 Redis Cluster管理集群状态检查命令CLUSTER NODES # 查看节点拓扑 CLUSTER INFO # 查看集群状态数据迁移示例MIGRATE 192.168.1.34 6379 0 5000 KEYS key1 key25.2 分布式锁优化方案Redlock算法实现要点获取当前毫秒级时间戳按顺序在N个节点执行获取锁命令计算获取锁总耗时当在多数节点获取成功且耗时小于锁有效期时认为获取成功def acquire_lock(redis_nodes, resource, ttl): start_time time.time() successes 0 for node in redis_nodes: if node.set(resource, random_value, nxTrue, pxttl): successes 1 elapsed time.time() - start_time return successes len(redis_nodes)/2 and elapsed ttl6. 命令安全与监控6.1 危险命令防护生产环境应禁用以下命令rename-command FLUSHDB rename-command CONFIG 通过ACL控制访问权限ACL SETUSER admin on password ~* all6.2 监控命令集合实时监控关键指标INFO memory # 内存使用情况 INFO stats # 命令统计 CLIENT LIST # 客户端连接Prometheus监控配置示例scrape_configs: - job_name: redis static_configs: - targets: [redis:9121]我在实际运维中发现定期分析INFO commandstats输出能有效识别异常命令模式。某次性能问题排查中就曾发现大量未使用流水线的HGETALL操作通过批量改为HMGET后性能提升显著。