Redis 语法速查
常用 Redis 命令速查表,含使用场景、常见错误,支持搜索和复制
学习指引
前置知识
- 了解键值存储的基本概念
- 已完成 Redis 本地安装
推荐学习顺序
- 先学习【键值操作】分组,掌握基本键值存取
- 再学习【数据类型操作】分组,掌握哈希、列表、集合等数据类型
键值操作
Redis 最基础的操作。本组命令用于管理键值对的增删改查,是使用 Redis 的起点。设置键值对
SET user:name "张三" EX 3600输出: OK
场景: 设置键值对并可选地指定过期时间。EX 参数设置过期秒数,PX 设置过期毫秒数,NX 仅在键不存在时设置。
常见错误
- 错误:
SET user:name 张三(值未加引号)-- 解决: 字符串值应使用双引号包裹:SET user:name "张三" - 错误:
SET user:name "张三" NX EX 3600(键已存在时使用 NX)-- 解决: NX 仅在键不存在时设置成功,如需覆盖请去掉 NX 或使用 XX(仅键存在时设置)
进阶: SET 命令的 NX 选项可实现分布式锁的基础功能。生产环境建议使用 Redlock 算法或 Redisson 等成熟方案。
获取键值
GET user:name输出: "张三"
场景: 根据键获取对应的值。如果键不存在则返回 nil。GET 只能用于字符串类型的键。
常见错误
- 错误:
GET mylist(对列表类型的键使用 GET)-- 解决: GET 只能用于字符串类型,列表应使用 LRANGE,哈希应使用 HGET - 错误:
GET nonexistent_key-- 解决: 键不存在时返回 nil,业务代码需判断 nil 值以区分空字符串和键不存在
进阶: MGET key1 key2 key3 可批量获取多个键的值,减少网络往返次数,提升性能。
删除键
DEL user:name输出: (integer) 1
场景: 删除一个或多个键。返回被成功删除的键的数量。对不存在的键执行 DEL 返回 0。
常见错误
- 错误:
DEL user:*(期望通配符删除)-- 解决: DEL 不支持通配符,需先用 KEYS 查找再删除,或使用 UNLINK 异步删除大键
进阶: UNLINK 是 DEL 的异步版本,不会阻塞主线程,适合删除大键(如包含大量元素的集合)。
查找匹配的键
KEYS user:*输出: 1) "user:name"
2) "user:age"
3) "user:email"
场景: 查找匹配指定模式的所有键。支持通配符:* 匹配任意字符,? 匹配单个字符,[abc] 匹配指定字符。
常见错误
- 错误:
KEYS *(在生产环境大数据量下执行)-- 解决: 生产环境禁止使用 KEYS,应使用 SCAN 命令渐进式遍历
进阶: SCAN 命令以游标方式渐进遍历,不会阻塞服务器:SCAN 0 MATCH user:* COUNT 100。适合生产环境使用。
检查键是否存在
EXISTS user:name输出: (integer) 1
场景: 检查一个或多个键是否存在。返回存在的键的数量。1 表示存在,0 表示不存在。可同时检查多个键。
常见错误
- 错误:
EXISTS user:name user:age(期望返回布尔值)-- 解决: EXISTS 返回整数,大于 0 表示至少一个键存在,等于 0 表示都不存在
进阶: EXISTS key1 key2 key3 可同时检查多个键,返回存在的键的总数。结合 TTL 命令可检查键的剩余过期时间。
数据类型操作
Redis 的核心优势在于丰富的数据类型。本组命令涵盖哈希、列表、集合和有序集合的常用操作。哈希操作
HSET user:1 name "张三" age 25
HGET user:1 name
HGETALL user:1输出: (integer) 2
"张三"
1) "name"
2) "张三"
3) "age"
4) "25"
场景: 哈希适合存储对象。HSET 设置字段值,HGET 获取单个字段,HGETALL 获取所有字段和值。类似关系型数据库中的一行记录。
常见错误
- 错误:
HSET user:1 name "张三" name "李四"(同一命令中重复字段)-- 解决: 同一 HSET 命令中不要重复设置同一字段,如需更新直接使用新值即可 - 错误:
GET user:1(对哈希键使用 GET)-- 解决: 哈希类型必须使用 HGET/HGETALL,不能用 GET
进阶: HMSET 已被废弃,HSET 现在支持多字段设置。HMGET 可批量获取多个字段的值。
列表操作
LPUSH tasks "任务A" "任务B"
LRANGE tasks 0 -1
RPOP tasks输出: (integer) 2
1) "任务B"
2) "任务A"
"任务A"
场景: 列表是有序的字符串集合,支持从两端推入和弹出。LPUSH 从左端推入,RPOP 从右端弹出,可实现队列(FIFO)或栈(LIFO)。
常见错误
- 错误:
LRANGE tasks 0 0(期望获取第一个元素)-- 解决: 获取全部元素使用 LRANGE key 0 -1,-1 表示最后一个元素 - 错误:
RPOP empty_list-- 解决: 弹出前用 LLEN 检查列表长度,或业务代码判断 nil 值
进阶: BRPOP/BLPOP 是阻塞式弹出,当列表为空时阻塞等待,常用于消息队列场景。支持超时参数。
集合操作
SADD tags "Python" "Java" "Go"
SMEMBERS tags
SISMEMBER tags "Python"输出: (integer) 3
1) "Go"
2) "Java"
3) "Python"
(integer) 1
场景: 集合是无序且不重复的字符串集合。SADD 添加元素,SMEMBERS 获取所有元素,SISMEMBER 判断元素是否存在。适合标签、去重等场景。
常见错误
- 错误:
SADD tags "Python" "Python"(添加重复元素)-- 解决: 集合自动去重,重复添加不会报错但只保留一个 - 错误:
SMEMBERS big_set(对大集合执行)-- 解决: 大集合使用 SSCAN 渐进遍历,或使用 SCARD 获取元素数量
进阶: SINTER 求交集,SUNION 求并集,SDIFF 求差集。适合实现共同好友、推荐系统等功能。
有序集合操作
ZADD leaderboard 100 "张三" 85 "李四" 92 "王五"
ZRANGE leaderboard 0 -1 WITHSCORES
ZREVRANGE leaderboard 0 2 WITHSCORES输出: (integer) 3
1) "李四"
2) "85"
3) "王五"
4) "92"
5) "张三"
6) "100"
1) "张三"
2) "100"
3) "王五"
4) "92"
5) "李四"
6) "85"
场景: 有序集合的每个元素关联一个分数,按分数排序。ZRANGE 按分数升序返回,ZREVRANGE 按分数降序返回。适合排行榜、评分等场景。
常见错误
- 错误:
ZRANGE leaderboard 0 2(期望返回分数最高的前 3 名)-- 解决: 获取分数最高的前 N 名使用 ZREVRANGE leaderboard 0 N-1 - 错误:
ZADD leaderboard 100 "张三" 100 "李四"(分数相同)-- 解决: 如需精确控制排名,可在分数中加入微小偏移或使用时间戳作为辅助排序
进阶: ZRANGEBYSCORE leaderboard 80 100 可按分数范围查询,ZINCRBY leaderboard 5 "张三" 可给指定成员加分。