Redis 基本命令大全:从入门到敲到手软
掌握这些命令,你就掌握了 Redis 的半壁江山
嗨,欢迎回来!
上一期我们聊了 Redis 的"世界观",今天咱们来点实在的------Redis 基本命令。毕竟,光说不练假把式,真正让你爱上 Redis 的,一定是那行云流水般的命令行操作。
我会按数据类型分类讲解,配合实际场景,让你不仅知道"怎么敲",更知道"什么时候敲"。
前提准备 :确保你已安装 Redis,终端输入
redis-cli进入命令行界面。看到127.0.0.1:6379>提示符,咱们就开始了。
一、 通用命令:所有类型的起手式
这些命令不管存什么类型的数据都能用。
| 命令 | 示例 | 说明 | 场景 |
|---|---|---|---|
PING |
PING |
测试连接是否正常,返回 PONG |
健康检查 |
KEYS pattern |
KEYS user:* |
查找所有符合模式的键(生产环境慎用,会阻塞) | 调试用 |
SCAN cursor |
SCAN 0 MATCH user:* COUNT 100 |
游标迭代,不阻塞 | 生产环境遍历键 |
EXISTS key |
EXISTS user:1 |
检查键是否存在,返回 1/0 | 判断数据是否已缓存 |
DEL key |
DEL user:1 |
删除键 | 缓存失效 |
EXPIRE key seconds |
EXPIRE user:1 60 |
设置过期时间(秒) | 限时优惠、验证码 |
TTL key |
TTL user:1 |
查看剩余生存时间(-1 永不过期,-2 已过期) | 调试缓存策略 |
TYPE key |
TYPE user:1 |
查看键的数据类型 | 排查结构混乱 |
小贴士 :生产环境禁止使用 KEYS *!一次扫描千万级键,Redis 会卡死。用 SCAN 代替。
二、 String(字符串):最常用,最简单
String 是 Redis 的"瑞士军刀",二进制安全,可以存图片序列化后的字符串、JSON、数字。
基础命令
bash
# 设置值
SET name "张三"
# 设置值并指定过期时间(秒)
SETEX session:123 3600 "user_data"
# 设置值,仅当键不存在时成功(分布式锁基础)
SET lock:order 12345 NX
# 设置值,仅当键已存在时成功
SET user:1 "data" XX
# 获取值
GET name # 返回 "张三"
# 删除
DEL name
# 批量操作(减少网络开销)
MSET a 1 b 2 c 3
MGET a b c # 返回 ["1","2","3"]
数字操作(原子性!)
bash
SET counter 100
# 自增1,返回新值
INCR counter # 101
# 自减1
DECR counter # 100
# 自增指定步长
INCRBY counter 50 # 150
INCRBYFLOAT price 0.99 # 浮点数增加
# 自减指定步长
DECRBY counter 30 # 120
场景示例:
bash
# 文章浏览量 +1
INCR article:view:123
# 库存扣减(秒杀场景)
DECR product:stock:1001
# 分布式锁(SETNX + 过期)
SET lock:order:1001 1 NX EX 10
其他实用命令
bash
# 字符串追加,返回新长度
APPEND message " World" # "Hello" -> "Hello World"
# 获取子串(闭区间,从0开始)
GETRANGE message 0 4 # 取前5个字符
# 覆盖子串,返回新长度
SETRANGE message 6 5 "Redis" # 从索引6开始覆盖
String 总结:缓存任何能序列化的数据、计数器、分布式锁、Session 共享。
三、 Hash(哈希):存储对象的神器
可以把 Hash 理解为一个小型的"子 Redis",在一个 Key 下面存储多个字段(field-value)。
bash
# 存储用户对象
HSET user:1 name "张三" age 25 city "北京"
# 返回 (integer) 3,表示成功设置了3个字段
# 获取单个字段
HGET user:1 name # 返回 "张三"
# 获取所有字段和值
HGETALL user:1 # 1) "name" 2) "张三" 3) "age" 4) "25" 5) "city" 6) "北京"
# 获取多个字段
HMGET user:1 name city # 返回 ["张三","北京"]
# 批量设置
HMSET user:2 name "李四" age 30 city "上海"
更优雅的操作
bash
# 字段自增(原子操作)
HINCRBY user:1 age 1 # 年龄 +1
# 判断字段是否存在
HEXISTS user:1 name # 返回 1(存在)
# 删除字段
HDEL user:1 city
# 只获取所有字段名
HKEYS user:1 # 返回 ["name","age"]
# 只获取所有值
HVALS user:1 # 返回 ["张三","25"]
# 获取字段数量
HLEN user:1 # 返回 2
场景示例:
bash
# 购物车(user:cart:1001 作为键,product_id 作为字段,数量作为值)
HSET user:cart:1001 2001 2 # 商品2001,数量2
HSET user:cart:1001 2002 1 # 商品2002,数量1
HINCRBY user:cart:1001 2001 1 # 数量 +1
# 商品浏览量统计(每个商品一个字段)
HINCRBY product:views 1001 1 # 商品1001浏览量+1
Hash vs String 存对象 :如果经常修改某个字段(比如只改年龄),Hash 的 HSET 比 String 的 GET 整个 JSON 再 SET 回去高效得多。
四、 List(列表):消息队列、最新消息
List 是双向链表,左边(头)和右边(尾)都可以操作。
常用命令
bash
# 从左边(头部)推入
LPUSH messages "msg1" "msg2" # 返回列表长度
# 从右边(尾部)推入
RPUSH messages "msg3"
# 查看列表(索引区间,0开始,-1表示最后一个)
LRANGE messages 0 -1 # 返回所有 ["msg2","msg1","msg3"]
# 从左边弹出(移除并返回)
LPOP messages # 返回 "msg2"
# 从右边弹出
RPOP messages # 返回 "msg3"
# 获取列表长度
LLEN messages # 返回 1(只剩 "msg1")
# 阻塞弹出(队列为空时等待,超时5秒)
BLPOP queue:task 5 # 如果有数据立即返回,否则阻塞5秒
其他操作
bash
# 根据索引获取元素
LINDEX messages 0
# 根据索引设置元素
LSET messages 0 "new_msg"
# 删除指定数量的指定值
LREM queue 2 "task1" # 删除2个值为"task1"的元素
# 修剪列表(只保留指定区间)
LTRIM logs 0 99 # 只保留最新100条日志
场景示例:
bash
# 最新评论列表(保持最新的100条)
LPUSH comments:article:1001 "{user:'张三',content:'好文'}"
LTRIM comments:article:1001 0 99
# 简单消息队列(生产者-消费者)
# 生产者:RPUSH task_queue "send_email"
# 消费者:LPOP task_queue(或阻塞版 BLPOP)
# 粉丝列表/关注列表(分页用 LRANGE)
RPUSH user:1:follower "user2" "user3" "user4"
LRANGE user:1:follower 0 10 # 第一页
注意:List 适合做"栈"(LPUSH/LPOP)或"队列"(RPUSH/LPOP)。如果频繁中间插入,请改用其他结构。
五、 Set(集合):去重、随机、交并差
Set 的元素无序且唯一,支持集合运算。
基础命令
bash
# 添加元素(自动去重)
SADD tags "Redis" "Database" "Cache" "Redis" # 第二个"Redis"被忽略,返回1(新增数)
# 获取所有元素
SMEMBERS tags # 返回 ["Cache","Database","Redis"]
# 判断元素是否存在
SISMEMBER tags "Redis" # 返回 1
# 获取集合大小
SCARD tags # 返回 3
# 随机获取一个元素(不删除)
SRANDMEMBER tags
# 随机弹出元素(删除并返回)
SPOP tags # 抽奖用
# 删除元素
SREM tags "Cache"
# 移动元素到另一个集合
SMOVE tags "new_tags" "Redis"
集合运算
bash
# 准备数据
SADD user:1:follow "user2" "user3" "user4"
SADD user:2:follow "user3" "user5" "user6"
# 交集(共同关注)
SINTER user:1:follow user:2:follow # 返回 ["user3"]
SINTERSTORE common:follow user:1:follow user:2:follow # 存到新集合
# 并集(合并关注)
SUNION user:1:follow user:2:follow
# 差集(我关注了但对方没关注)
SDIFF user:1:follow user:2:follow # 返回 ["user2","user4"]
场景示例:
bash
# 抽奖(从100个用户随机抽3个)
SPOP lucky:users 3
# 标签系统(找出同时包含"Java"和"Redis"的文章)
SINTER tag:Java tag:Redis # 返回文章ID集合
# 共同好友
SINTER user:1001:friends user:1002:friends
# 推荐可能认识的人(差集)
SDIFF user:1:friends user:2:friends
六、 Zset(有序集合):排行榜王者
Zset = Set + Score(分数)。元素唯一,按分数排序。
基础命令
bash
# 添加元素(带分数)
ZADD leaderboard 100 "张三" 95 "李四" 88 "王五"
# 查看分数
ZSCORE leaderboard "张三" # 返回 100
# 排名(默认升序,0开始)
ZRANK leaderboard "李四" # 返回 1(李四排第二)
# 排名(降序)
ZREVRANK leaderboard "李四" # 返回 2? 不对,降序下李四排第2? 演示一下
排名与查询:
bash
# 查询分数范围(升序,返回元素)
ZRANGE leaderboard 0 -1 # 按分数升序列出所有
ZRANGE leaderboard 0 -1 WITHSCORES # 带分数
# 查询分数范围(降序,排行榜常用)
ZREVRANGE leaderboard 0 2 WITHSCORES # 前三名(分数从高到低)
# 1) "张三" 2) "100" 3) "李四" 4) "95" 5) "王五" 6) "88"
# 按分数范围查询
ZRANGEBYSCORE leaderboard 90 100 WITHSCORES # 分数在90-100之间的
# 按分数范围删除
ZREMRANGEBYSCORE leaderboard 0 80 # 删除不及格的
分数操作
bash
# 增加分数(原子操作)
ZINCRBY leaderboard 5 "张三" # 张三 +5 分
ZINCRBY leaderboard -3 "李四" # 李四 -3 分
# 获取元素排名范围
ZREVRANGE leaderboard 0 -1
# 获取集合大小
ZCARD leaderboard # 返回 3
# 获取指定分数范围内的元素数量
ZCOUNT leaderboard 90 100 # 返回 2
场景示例:
bash
# 游戏排行榜
ZADD game:score 15000 "player1"
ZADD game:score 8000 "player2"
# 更新分数
ZINCRBY game:score 2000 "player1" # 加分
# 查看前十
ZREVRANGE game:score 0 9 WITHSCORES
# 热搜榜(每点击一次,热度+1)
ZINCRBY hot:news 1 "news_id_1001"
# 获取前十
ZREVRANGE hot:news 0 9
# 延时队列(Score = 执行时间戳)
ZADD delay:queue 1733308800 "task1"
ZADD delay:queue 1733310000 "task2"
# 取到期任务(0 到 当前时间戳)
ZRANGEBYSCORE delay:queue 0 1733308900
# 删除已执行任务
ZREMRANGEBYSCORE delay:queue 0 1733308900
七、 进阶命令:Redis 的隐藏宝藏
1. 键空间通知(KeySpace Notifications)
让 Redis 告诉你某个键发生了什么。
bash
# 开启配置(redis.conf 或 CONFIG SET)
CONFIG SET notify-keyspace-events KEA # 所有事件
# 订阅键过期事件
PSUBSCRIBE __keyevent@0__:expired
2. Pipeline(管道)
批量发送命令,减少网络往返。
bash
# 命令行不支持 Pipeline,但在代码中:
# 10000条命令从 5秒 -> 0.05秒
3. Lua 脚本
原子性执行多个命令。
bash
# 限制接口访问频率(伪代码)
EVAL "local current = redis.call('incr', KEYS[1]); if current == 1 then redis.call('expire', KEYS[1], ARGV[1]) end; return current" 1 rate:limit:1001 60
八、 实战小贴士
命令速查表(打印贴在显示器旁)
| 我要做... | 用这个 | 示例 |
|---|---|---|
| 存个普通值 | SET |
SET name "Tom" |
| 存个对象 | HSET |
HSET user:1 name Tom age 18 |
| 做计数器 | INCR |
INCR views |
| 做排行榜 | ZADD + ZREVRANGE |
游戏积分榜 |
| 做抽奖 | SPOP |
随机抽取用户 |
| 做队列 | RPUSH + LPOP |
异步任务 |
| 共同关注 | SINTER |
社交关系 |
| 最新动态 | LPUSH + LTRIM |
保持最新100条 |
最后一句叮嘱
- 命令不区分大小写,但建议大写,键名区分大小写。
- 生产环境慎用
KEYS、FLUSHALL、FLUSHDB,手一抖就是事故。 - 多敲
HELP @string或HELP SET,Redis 自带帮助系统。