📚 Redis 核心语法笔记(精华版)

一句话心法:String 存万物,Hash 存对象,List 存队列/流,Set 存标签/去重,ZSet 存排序/排行。

一、全局通用命令(适用于所有类型)

命令 用法 说明(必记点)
KEYS KEYS user:* ❌ 生产禁用,会阻塞服务。
SCAN SCAN 0 MATCH user:* COUNT 100 ✅ 推荐代替,游标迭代,不阻塞。
EXISTS EXISTS key 检查 key 是否存在(返回 1/0)。
DEL DEL key1 key2 同步删除(大 key 会卡顿)。
UNLINK UNLINK big_key 异步删除(推荐删大 key)。
EXPIRE EXPIRE key 60 设置过期时间(秒)。
TTL TTL key 查看剩余时间(-1永久,-2不存在)。
TYPE TYPE key 查看数据类型(string/hash/list…)。

二、五大数据类型命令速查(含易混淆点)

1. String(字符串)—— 缓存之王

场景:缓存 JSON、Session、计数器。

操作 命令 示例 注意点
增/改 SET SET name "Tom" EX 10 EX 秒,PX 毫秒,NX 不存在才设。
GET GET name 返回 nil 表示不存在。
批量增 MSET MSET a 1 b 2 原子操作。 Multiple SET
批量查 MGET MGET a b 减少网络请求。
自增/减 INCR / INCRBY INCR age 原子操作,适合秒杀计数。

2. Hash(哈希)—— 对象容器

场景:存用户信息、购物车商品。

操作 命令 示例 注意点
增/改 HSET HSET user:1 name "Jack" age 20 既是新增也是修改(覆盖写)。
查单个 HGET HGET user:1 name 返回指定字段。
查全部 HGETALL HGETALL user:1 慎用,字段太多会慢。
删字段 HDEL HDEL user:1 age 删除指定字段。
计数自增 HINCRBY HINCRBY user:1 age 1 字段值加 1。

3. List(列表)—— 双向链表

场景:最新消息、消息队列(阻塞队列)。

操作 命令 示例 注意点(⭐重点)
左/右入 LPUSH / RPUSH LPUSH list A B LPUSH 新元素在最左边(头)。
左/右出 LPOP / RPOP LPOP list 移除并返回头部元素。
查范围 LRANGE LRANGE list 0 2 0头部第一个-1 是尾部。
修剪(保留) LTRIM LTRIM list 0 2 ⭐保留 0-2,其他全删(不是删除这段!)。
阻塞弹出 BLPOP BLPOP queue 5 没有元素时阻塞 5 秒。

⭐黄金组合(固定大小滑动窗口)LPUSH + LTRIM 0 N-1


4. Set(集合)—— 去重标签

场景:抽奖去重、共同好友、用户标签。

操作 命令 示例 注意点
添加 SADD SADD tags "tech" 重复添加返回 0(去重)。
查看全部 SMEMBERS SMEMBERS tags 无序,返回顺序随机。
成员判断 SISMEMBER SISMEMBER tags "tech" 返回 1 存在,0 不存在。
移除 SREM SREM tags "tech" 删除指定成员。
交集(共同) SINTER SINTER set1 set2 ⭐社交核心功能(共同好友)。
随机弹出 SPOP SPOP pool 1 随机移除并返回(抽奖开奖)。

5. Sorted Set(有序集合)—— 自动排序

场景:游戏排行榜、延迟消息队列(时间戳当 Score)。

操作 命令 示例 注意点(⭐重点)
增/改 ZADD ZADD rank 100 "p1" 先写分数,后写成员
倒序查 Top N ZREVRANGE ZREVRANGE rank 0 2 WITHSCORES 0最高分(冠军)
正序查(升序) ZRANGE ZRANGE rank 0 -1 分数从小到大,0 是最低分。
查看排名 ZREVRANK ZREVRANK rank "p1" 返回从 0 开始的排名(0 是第 1 名)。
累加分数 ZINCRBY ZINCRBY rank 50 "p1" 给 p1 加 50 分,自动重排。
删除成员 ZREM ZREM rank "p1" 删除指定成员。

三、易混淆知识点排雷(必看!)

混淆点 正确结论
LTRIM 0 2 删了哪些? 保留索引 0-2,删除 3 及以后的。(记住:只保留这段!)
LRANGE 0 2 的 0 是哪边? 对于 LPUSH(左推入)来说,0列表最左边(最新数据)
HSET 是新增还是修改? 都是。字段不存在就新增,存在就覆盖修改(记住:幂等操作)。
KEYSSCAN 用哪个? 绝对用 SCAN,生产环境用 KEYS 等于自杀(阻塞)。
Set 和 List 区别? List 允许重复(聊天记录),Set 绝对去重(点赞用户)。
ZREVRANGE 的 0 是谁? 最高分(第 1 名)。想拿前三名就用 ZREVRANGE key 0 2

四、数据类型的“身材管理”建议

类型 内存占用 最大元素数 大 Key 警告
String 512 MB(值) 别存超大 JSON(用 Hash 拆开)。
Hash 2^32-1 字段 一个 Hash 别超过 1 万个字段,否则 HGETALL 会卡。
List 2^32-1 元素 别当日志存几十万条(用 LTRIM 限制长度)。
Set 2^32-1 成员 大集合做交集运算时 CPU 飙升,注意控制。
Sorted Set 高(吃内存) 2^32-1 成员 底层是跳表+哈希,非常吃内存,只存 ID 别存长文本。