1. Redis命令基础与核心概念Redis作为高性能的键值存储系统其命令体系是开发者必须掌握的核心技能。我使用Redis已有7年时间从简单的缓存场景到复杂的分布式系统都有实践今天系统梳理下Redis命令的完整知识体系。1.1 Redis命令的基本结构所有Redis命令都遵循统一的调用格式COMMAND key_name [arguments]这种设计保持了极简主义哲学比如SET命令SET user:1001 {name:张三,age:28} EX 60这里EX 60表示60秒后自动过期这种将参数直接附加在命令后的设计使得Redis协议非常紧凑。注意Redis命令是大小写不敏感的但约定俗成使用全大写形式。键名则建议使用小写和冒号分隔的命名空间如order:20230815:items1.2 连接Redis服务本地连接直接使用redis-cli$ redis-cli 127.0.0.1:6379 PING PONG远程连接需要指定认证参数redis-cli -h 192.168.1.100 -p 6380 -a yourpassword --tls生产环境强烈建议启用TLS加密避免密码明文传输。中文乱码问题可以通过--raw参数解决redis-cli --raw这个参数会让redis-cli直接输出原始字节而不是尝试解码。2. 数据类型与对应命令详解2.1 字符串(String)类型字符串是Redis最基础的数据类型支持最大512MB的内容。除了基本的GET/SET还有这些实用命令批量操作MSET key1 hello key2 world MGET key1 key2MSET的原子性保证所有键要么全部设置成功要么全部失败。数值运算INCR counter # 原子1 INCRBY counter 5 DECR counter这些操作是原子性的非常适合计数器场景。位操作SETBIT login:20230815 10086 1 GETBIT login:20230815 10086 BITCOUNT login:20230815可以用极小的空间实现用户签到等场景。2.2 哈希(Hash)类型哈希适合存储对象比如用户信息HSET user:1001 name 李四 age 28 email lisiexample.com HGET user:1001 name HGETALL user:1001哈希的字段值也是字符串类型不支持嵌套数据结构。实战技巧HGETALL在生产环境慎用当字段很多时会阻塞Redis。建议用HSCAN迭代获取或者只获取需要的字段。2.3 列表(List)类型列表实现有序的元素集合常用作消息队列LPUSH orders order1 RPUSH orders order2 LRANGE orders 0 -1关键特性左右两端插入/弹出都是O(1)复杂度按索引访问是O(N)复杂度最大长度2^32-1个元素阻塞版本命令特别适合任务队列BRPOP task_queue 30 # 阻塞30秒等待元素2.4 集合(Set)类型集合提供无序的唯一元素存储适合标签系统SADD article:1001 tags python database redis SISMEMBER article:1001 tags redis集合运算非常高效SINTER set1 set2 # 交集 SUNION set1 set2 # 并集 SDIFF set1 set2 # 差集2.5 有序集合(Sorted Set)在集合基础上增加分数(score)排序ZADD leaderboard 100 player1 200 player2 ZRANGE leaderboard 0 -1 WITHSCORES典型应用场景排行榜延迟队列(用时间戳作score)带权重的元素存储3. 高级命令与系统管理3.1 事务与Lua脚本Redis事务用MULTI/EXEC实现MULTI INCR counter INCR counter EXEC注意这不同于关系型数据库的事务没有回滚机制命令执行时才会检查错误其他客户端命令不会阻塞对于复杂逻辑建议使用Lua脚本local current redis.call(GET, KEYS[1]) if current then return redis.call(INCRBY, KEYS[1], ARGV[1]) else return redis.call(SET, KEYS[1], ARGV[1]) end脚本优势原子性执行减少网络往返复杂逻辑封装3.2 持久化相关命令Redis提供两种持久化方式RDB快照SAVE # 阻塞主线程保存 BGSAVE # 后台保存AOF日志CONFIG SET appendonly yes BGREWRITEAOF生产环境建议同时开启RDB和AOF配置示例save 900 1 # 900秒内至少1个键变化 save 300 10 # 300秒内至少10个键变化 appendonly yes appendfsync everysec3.3 发布订阅模式消息发布与订阅SUBSCRIBE news PUBLISH news Redis 7.0 released!实际应用中更推荐使用Stream类型它支持消息持久化消费者组消息确认4. 性能优化与问题排查4.1 慢查询分析Redis慢查询日志配置CONFIG SET slowlog-log-slower-than 10000 # 10毫秒 CONFIG SET slowlog-max-len 128 SLOWLOG GET 5 # 获取最近5条慢查询常见慢查询原因大键操作(如百万元素的集合)KEYS命令(用SCAN替代)复杂Lua脚本4.2 内存优化技巧使用适当的数据类型小哈希用ziplist编码短字符串用embstr编码内存回收策略CONFIG SET maxmemory-policy allkeys-lru可选策略volatile-lru只对过期键LRUallkeys-lru所有键LRUvolatile-ttl优先回收剩余时间短的键大键拆分# 原始大集合 SADD bigset item1 item2 ... item1000000 # 拆分为多个小集合 SADD bigset:part1 item1 ... item10000 SADD bigset:part2 item10001 ... item200004.3 集群管理命令Redis Cluster相关命令CLUSTER NODES # 查看节点信息 CLUSTER KEYSLOT key # 计算键的槽位 CLUSTER FAILOVER # 手动故障转移跨槽位命令需要使用哈希标签# 保证这两个键在同一个槽位 SET {user1000}.profile value SET {user1000}.account value5. 实战经验与避坑指南5.1 生产环境常见问题连接池耗尽检查连接泄漏适当增大连接池大小使用连接池的testOnBorrow配置缓存雪崩过期时间加随机值使用永不过期的基准数据实现多级缓存热点Key问题本地缓存热点数据使用Redis集群分散压力对Key进行哈希分片5.2 监控与告警关键指标监控内存使用率连接数每秒操作数(QPS)慢查询数量键过期速率推荐使用Redis的INFO命令获取监控数据redis-cli INFO | grep -E (used_memory|connected_clients|instantaneous_ops)5.3 客户端使用建议连接管理使用连接池而非短连接设置合理的超时时间配置自动重连序列化选择优先使用二进制协议避免Java原生序列化考虑MsgPack或Protocol Buffers管道化(Pipeline)pipe redis.pipeline() for i in range(1000): pipe.set(fkey:{i}, i) pipe.execute()这能减少网络往返时间提升吞吐量5-10倍。