Redis基础:2. Redis 常用命令

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条

最后一句叮嘱

  • 命令不区分大小写,但建议大写,键名区分大小写。
  • 生产环境慎用 KEYSFLUSHALLFLUSHDB,手一抖就是事故。
  • 多敲 HELP @stringHELP SET,Redis 自带帮助系统。

相关推荐
码农阿豪1 小时前
Node.js 连金仓数据库(下篇):连接池、事务和那些坑
数据库·node.js
东方巴黎~Sunsiny1 小时前
实战:RocketMQ 幂等 + Redis 分布式锁 + 异常重试 保姆级教程
redis·分布式·rocketmq
峰子20121 小时前
PG 管控系统技术方案
数据库·后端·pg
Database_Cool_1 小时前
AnalyticDB MySQL vs Hologres:阿里云内部数仓产品如何选——场景化选型指南
数据库·数据仓库·mysql·阿里云
basketball6161 小时前
Redis基础:3. Redis 持久化(重要)
redis·bootstrap·mybatis
-To be number.wan1 小时前
计算机组成原理 | Cache和主存的映射方式
学习·缓存·计算机组成原理
todoitbo2 小时前
从 mysql 命令切到 ksql,第一步先把连接搞明白
数据库·mysql·国产数据库·ksql
为爱停留2 小时前
让智能体「记住」对话:Checkpoint 功能、持久化数据接口与 thread_id 详解
java·数据库·elasticsearch