1. Redis命令体系概述
Redis作为当今最流行的内存数据库之一,其命令体系是开发者必须掌握的核心技能。与关系型数据库不同,Redis采用单线程模型处理命令,这意味着每个命令的执行都是原子性的。这种设计使得Redis在保持简单性的同时,能够处理高达10万级别的QPS。
Redis命令主要分为以下几大类:
- 键操作命令:管理键的生命周期和元数据
- 字符串命令:处理文本和二进制数据
- 哈希命令:操作字段-值映射表
- 列表命令:实现队列和栈结构
- 集合命令:处理无序唯一元素集合
- 有序集合命令:管理带分数的排序集合
- 地理空间命令:处理地理位置数据
- HyperLogLog命令:进行基数统计
- 流命令:实现消息队列功能
- 服务器命令:管理Redis实例
提示:Redis命令不区分大小写,但通常建议使用大写形式以增强可读性。键名则区分大小写,需要特别注意。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 键(Key)操作命令详解
2.1 基础键操作
DEL key [key ...]:删除一个或多个键,返回被删除键的数量。这是少数几个可以接受多个参数的Redis命令之一。
bash复制127.0.0.1:6379> SET key1 "Hello"
OK
127.0.0.1:6379> SET key2 "World"
OK
127.0.0.1:6379> DEL key1 key2
(integer) 2
EXISTS key:检查键是否存在,返回1表示存在,0表示不存在。在集群环境下,这个命令只能检查当前节点的键。
EXPIRE key seconds:设置键的过期时间,单位为秒。Redis的过期精度可以达到毫秒级,但实际过期检查是定期执行的。
2.2 高级键管理
KEYS pattern:查找所有符合给定模式的键。这个命令在生产环境要慎用,因为它会阻塞Redis的单线程,可能导致性能问题。
bash复制127.0.0.1:6379> MSET user:1:name John user:2:name Mary user:3:name Bob
OK
127.0.0.1:6379> KEYS user:*
1) "user:1:name"
2) "user:2:name"
3) "user:3:name"
SCAN cursor [MATCH pattern] [COUNT count]:渐进式遍历键空间,是KEYS的安全替代方案。它不会阻塞服务器,但可能会返回重复的键。
bash复制127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 1
1) "3"
2) 1) "user:1:name"
127.0.0.1:6379> SCAN 3 MATCH user:* COUNT 1
1) "0"
2) 1) "user:2:name"
2) "user:3:name"
3. 字符串(String)命令实战
3.1 基础字符串操作
SET key value [EX seconds] [PX milliseconds] [NX|XX]:设置键值对,支持多种选项:
- EX:设置过期时间(秒)
- PX:设置过期时间(毫秒)
- NX:仅当键不存在时设置
- XX:仅当键存在时设置
GET key:获取键对应的值。如果键不存在返回nil,如果键存储的不是字符串类型则返回错误。
bash复制127.0.0.1:6379> SET counter 100 EX 60 NX
OK
127.0.0.1:6379> GET counter
"100"
127.0.0.1:6379> TTL counter
(integer) 54
3.2 数值操作
INCR key:将键存储的整数值增加1。如果键不存在会先初始化为0再执行操作。这个操作是原子性的,非常适合计数器场景。
bash复制127.0.0.1:6379> SET views 100
OK
127.0.0.1:6379> INCR views
(integer) 101
127.0.0.1:6379> INCRBY views 10
(integer) 111
127.0.0.1:6379> DECR views
(integer) 110
INCRBYFLOAT key increment:增加浮点数值,这是Redis中少数几个处理浮点数的命令之一。
注意:Redis没有专门的浮点数类型,所有数值都以字符串形式存储,只是在操作时进行类型转换。
4. 哈希(Hash)命令深度解析
4.1 基础哈希操作
HSET key field value [field value ...]:设置哈希表中一个或多个字段的值。从Redis 4.0开始支持多个field-value对。
bash复制127.0.0.1:6379> HSET user:1000 username antirez birthyear 1977 verified 1
(integer) 3
127.0.0.1:6379> HGET user:1000 username
"antirez"
HGETALL key:获取哈希表中所有字段和值。在字段较多时要注意这个命令可能返回大量数据。
4.2 高级哈希特性
HINCRBY key field increment:增加哈希字段的整数值,这个操作同样是原子性的。
bash复制127.0.0.1:6379> HSET product:1000 stock 50
(integer) 1
127.0.0.1:6379> HINCRBY product:1000 stock -5
(integer) 45
HSCAN key cursor [MATCH pattern] [COUNT count]:渐进式遍历哈希字段,适用于大型哈希表。
哈希类型特别适合表示对象,相比将对象序列化为JSON字符串存储,哈希可以单独访问和修改对象的某个字段,更加高效。
5. 列表(List)命令应用场景
5.1 基础列表操作
LPUSH key element [element ...]:将一个或多个值插入到列表头部。Redis列表的最大长度为2^32-1个元素。
bash复制127.0.0.1:6379> LPUSH tasks "write code"
(integer) 1
127.0.0.1:6379> LPUSH tasks "debug"
(integer) 2
127.0.0.1:6379> LRANGE tasks 0 -1
1) "debug"
2) "write code"
BRPOP key [key ...] timeout:阻塞式弹出列表尾部的元素,如果列表为空会阻塞连接直到超时或有元素可弹出。
5.2 列表作为队列和栈
列表可以用作:
- 栈:LPUSH + LPOP
- 队列:LPUSH + RPOP
- 有限集合:LTRIM
bash复制# 实现最近浏览记录
127.0.0.1:6379> LPUSH recent:user1 item123
(integer) 1
127.0.0.1:6379> LPUSH recent:user1 item456
(integer) 2
127.0.0.1:6379> LTRIM recent:user1 0 9 # 保留最近10条
OK
提示:Redis 5.0引入了Stream类型作为更专业的消息队列解决方案,但对于简单场景,列表仍然是不错的选择。
6. 集合(Set)命令使用技巧
6.1 基础集合操作
SADD key member [member ...]:向集合添加一个或多个成员。集合会自动去重。
bash复制127.0.0.1:6379> SADD tags redis database nosql
(integer) 3
127.0.0.1:6379> SADD tags redis
(integer) 0 # 重复元素不会被添加
SINTER key [key ...]:返回多个集合的交集。这个操作的时间复杂度是O(N*M),对于大集合要谨慎使用。
6.2 集合运算应用
集合非常适合实现:
- 标签系统
- 好友关系
- 唯一计数器
bash复制# 实现共同好友功能
127.0.0.1:6379> SADD user:1000:friends 1001 1002 1003
(integer) 3
127.0.0.1:6379> SADD user:1001:friends 1002 1003 1004
(integer) 3
127.0.0.1:6379> SINTER user:1000:friends user:1001:friends
1) "1002"
2) "1003"
SSCAN key cursor [MATCH pattern] [COUNT count]:渐进式遍历集合元素,避免SMEMBERS可能导致的阻塞问题。
7. 有序集合(Sorted Set)命令精讲
7.1 基础操作
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]:向有序集合添加一个或多个成员,或更新已有成员的分数。
bash复制127.0.0.1:6379> ZADD leaderboard 1000 "player1" 800 "player2" 1200 "player3"
(integer) 3
127.0.0.1:6379> ZRANGE leaderboard 0 -1 WITHSCORES
1) "player2"
2) "800"
3) "player1"
4) "1000"
5) "player3"
6) "1200"
ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集合的成员。加上WITHSCORES选项可以同时返回分数。
7.2 排名与范围查询
ZREVRANGE key start stop [WITHSCORES]:返回有序集中指定区间内的成员,通过分数从高到低排序。
bash复制# 实现排行榜
127.0.0.1:6379> ZREVRANGE leaderboard 0 2 WITHSCORES
1) "player3"
2) "1200"
3) "player1"
4) "1000"
5) "player2"
6) "800"
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:返回分数在min和max之间的成员。
有序集合是Redis最强大的数据结构之一,常用于:
- 排行榜系统
- 优先级队列
- 时间线存储
- 范围查询
8. 事务与管道命令
8.1 事务操作
MULTI:标记事务块的开始。Redis的事务不是严格意义上的ACID事务,而是将多个命令排队顺序执行。
EXEC:执行所有事务块内的命令。如果在WATCH之后键被修改,EXEC会失败。
bash复制127.0.0.1:6379> WATCH balance
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> DECRBY balance 50
QUEUED
127.0.0.1:6379> INCRBY debt 50
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 50
2) (integer) 50
8.2 管道优化
Redis管道(Pipeline)可以将多个命令一次性发送到服务器,减少网络往返时间(RTT)。
bash复制# 不使用管道
for i in {1..1000}; do
redis-cli INCR counter > /dev/null
done
# 使用管道
(
for i in {1..1000}; do
echo "INCR counter"
done
) | redis-cli --pipe
管道可以将性能提升5-10倍,特别是在高延迟网络中效果更明显。但要注意单个管道中的命令数量不宜过多,一般建议控制在1万个以内。
9. Lua脚本与性能优化
9.1 EVAL命令
EVAL script numkeys key [key ...] arg [arg ...]:执行Lua脚本。脚本在Redis中原子性执行,是复杂操作的最佳选择。
lua复制-- 实现原子性的条件设置
local current = redis.call('GET', KEYS[1])
if current == ARGV[1] then
return redis.call('SET', KEYS[1], ARGV[2])
else
return nil
end
bash复制127.0.0.1:6379> EVAL "return {KEYS[1],ARGV[1]}" 1 key1 arg1
1) "key1"
2) "arg1"
9.2 脚本缓存
SCRIPT LOAD script:将脚本加载到服务器缓存,返回SHA1摘要。之后可以使用EVALSHA执行缓存的脚本。
bash复制127.0.0.1:6379> SCRIPT LOAD "return 'hello'"
"1b936e3fe509bcbc9cd0664897bbe8fd0cac101b"
127.0.0.1:6379> EVALSHA 1b936e3fe509bcbc9cd0664897bbe8fd0cac101b 0
"hello"
Lua脚本可以访问所有的Redis命令,是实现复杂业务逻辑的强大工具。但要注意:
- 脚本不应过长
- 避免执行耗时操作
- 确保脚本是幂等的
10. 服务器管理与监控命令
10.1 服务器状态
INFO [section]:获取Redis服务器的各种信息和统计数值。可以指定section获取特定信息,如memory、clients、stats等。
bash复制127.0.0.1:6379> INFO memory
# Memory
used_memory:1007280
used_memory_human:983.67K
...
CONFIG GET parameter:获取服务器的配置参数。使用*可以获取所有参数。
10.2 性能监控
MONITOR:实时打印服务器接收到的所有命令。这个命令会严重影响性能,仅用于调试。
SLOWLOG GET [n]:查看慢查询日志。Redis会记录执行时间超过指定阈值的命令。
bash复制127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 10000
OK
127.0.0.1:6379> SLOWLOG GET 1
1) 1) (integer) 14
2) (integer) 1630000000
3) (integer) 15000
4) 1) "KEYS"
2) "*"
Redis的监控命令对于性能调优和故障排查非常有用。在生产环境中,建议定期收集INFO输出进行分析,并设置适当的慢查询阈值。
