news 2026/6/19 7:58:00

Redis基础:2. Redis 常用命令

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Redis基础:2. Redis 常用命令

Redis 基本命令大全:从入门到敲到手软

掌握这些命令,你就掌握了 Redis 的半壁江山

嗨,欢迎回来!

上一期我们聊了 Redis 的“世界观”,今天咱们来点实在的——Redis 基本命令。毕竟,光说不练假把式,真正让你爱上 Redis 的,一定是那行云流水般的命令行操作。

我会按数据类型分类讲解,配合实际场景,让你不仅知道“怎么敲”,更知道“什么时候敲”。

前提准备:确保你已安装 Redis,终端输入redis-cli进入命令行界面。看到127.0.0.1:6379>提示符,咱们就开始了。


一、 通用命令:所有类型的起手式

这些命令不管存什么类型的数据都能用。

命令示例说明场景
PINGPING测试连接是否正常,返回PONG健康检查
KEYS patternKEYS user:*查找所有符合模式的键(生产环境慎用,会阻塞)调试用
SCAN cursorSCAN 0 MATCH user:* COUNT 100游标迭代,不阻塞生产环境遍历键
EXISTS keyEXISTS user:1检查键是否存在,返回 1/0判断数据是否已缓存
DEL keyDEL user:1删除键缓存失效
EXPIRE key secondsEXPIRE user:1 60设置过期时间(秒)限时优惠、验证码
TTL keyTTL user:1查看剩余生存时间(-1 永不过期,-2 已过期)调试缓存策略
TYPE keyTYPE user:1查看键的数据类型排查结构混乱

小贴士:生产环境禁止使用KEYS *!一次扫描千万级键,Redis 会卡死。用SCAN代替。


二、 String(字符串):最常用,最简单

String 是 Redis 的“瑞士军刀”,二进制安全,可以存图片序列化后的字符串、JSON、数字。

基础命令

# 设置值SET name"张三"# 设置值并指定过期时间(秒)SETEX session:1233600"user_data"# 设置值,仅当键不存在时成功(分布式锁基础)SET lock:order12345NX# 设置值,仅当键已存在时成功SET user:1"data"XX# 获取值GET name# 返回 "张三"# 删除DEL name# 批量操作(减少网络开销)MSET a1b2c3MGET a b c# 返回 ["1","2","3"]

数字操作(原子性!)

SET counter100# 自增1,返回新值INCR counter# 101# 自减1DECR counter# 100# 自增指定步长INCRBY counter50# 150INCRBYFLOAT price0.99# 浮点数增加# 自减指定步长DECRBY counter30# 120

场景示例

# 文章浏览量 +1INCR article:view:123# 库存扣减(秒杀场景)DECR product:stock:1001# 分布式锁(SETNX + 过期)SET lock:order:10011NX EX10

其他实用命令

# 字符串追加,返回新长度APPEND message" World"# "Hello" -> "Hello World"# 获取子串(闭区间,从0开始)GETRANGE message04# 取前5个字符# 覆盖子串,返回新长度SETRANGE message65"Redis"# 从索引6开始覆盖

String 总结:缓存任何能序列化的数据、计数器、分布式锁、Session 共享。


三、 Hash(哈希):存储对象的神器

可以把 Hash 理解为一个小型的“子 Redis”,在一个 Key 下面存储多个字段(field-value)。

# 存储用户对象HSET user:1 name"张三"age25city"北京"# 返回 (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"李四"age30city"上海"

更优雅的操作

# 字段自增(原子操作)HINCRBY user:1 age1# 年龄 +1# 判断字段是否存在HEXISTS user:1 name# 返回 1(存在)# 删除字段HDEL user:1 city# 只获取所有字段名HKEYS user:1# 返回 ["name","age"]# 只获取所有值HVALS user:1# 返回 ["张三","25"]# 获取字段数量HLEN user:1# 返回 2

场景示例

# 购物车(user:cart:1001 作为键,product_id 作为字段,数量作为值)HSET user:cart:100120012# 商品2001,数量2HSET user:cart:100120021# 商品2002,数量1HINCRBY user:cart:100120011# 数量 +1# 商品浏览量统计(每个商品一个字段)HINCRBY product:views10011# 商品1001浏览量+1

Hash vs String 存对象:如果经常修改某个字段(比如只改年龄),Hash 的HSET比 String 的GET整个 JSON 再SET回去高效得多。


四、 List(列表):消息队列、最新消息

List 是双向链表,左边(头)和右边(尾)都可以操作。

常用命令

# 从左边(头部)推入LPUSH messages"msg1""msg2"# 返回列表长度# 从右边(尾部)推入RPUSH messages"msg3"# 查看列表(索引区间,0开始,-1表示最后一个)LRANGE messages0-1# 返回所有 ["msg2","msg1","msg3"]# 从左边弹出(移除并返回)LPOP messages# 返回 "msg2"# 从右边弹出RPOP messages# 返回 "msg3"# 获取列表长度LLEN messages# 返回 1(只剩 "msg1")# 阻塞弹出(队列为空时等待,超时5秒)BLPOP queue:task5# 如果有数据立即返回,否则阻塞5秒

其他操作

# 根据索引获取元素LINDEX messages0# 根据索引设置元素LSET messages0"new_msg"# 删除指定数量的指定值LREM queue2"task1"# 删除2个值为"task1"的元素# 修剪列表(只保留指定区间)LTRIM logs099# 只保留最新100条日志

场景示例

# 最新评论列表(保持最新的100条)LPUSH comments:article:1001"{user:'张三',content:'好文'}"LTRIM comments:article:1001099# 简单消息队列(生产者-消费者)# 生产者:RPUSH task_queue "send_email"# 消费者:LPOP task_queue(或阻塞版 BLPOP)# 粉丝列表/关注列表(分页用 LRANGE)RPUSH user:1:follower"user2""user3""user4"LRANGE user:1:follower010# 第一页

注意:List 适合做“栈”(LPUSH/LPOP)或“队列”(RPUSH/LPOP)。如果频繁中间插入,请改用其他结构。


五、 Set(集合):去重、随机、交并差

Set 的元素无序且唯一,支持集合运算。

基础命令

# 添加元素(自动去重)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"

集合运算

# 准备数据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"]

场景示例

# 抽奖(从100个用户随机抽3个)SPOP lucky:users3# 标签系统(找出同时包含"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(分数)。元素唯一,按分数排序。

基础命令

# 添加元素(带分数)ZADD leaderboard100"张三"95"李四"88"王五"# 查看分数ZSCORE leaderboard"张三"# 返回 100# 排名(默认升序,0开始)ZRANK leaderboard"李四"# 返回 1(李四排第二)# 排名(降序)ZREVRANK leaderboard"李四"# 返回 2? 不对,降序下李四排第2? 演示一下

排名与查询

# 查询分数范围(升序,返回元素)ZRANGE leaderboard0-1# 按分数升序列出所有ZRANGE leaderboard0-1WITHSCORES# 带分数# 查询分数范围(降序,排行榜常用)ZREVRANGE leaderboard02WITHSCORES# 前三名(分数从高到低)# 1) "张三" 2) "100" 3) "李四" 4) "95" 5) "王五" 6) "88"# 按分数范围查询ZRANGEBYSCORE leaderboard90100WITHSCORES# 分数在90-100之间的# 按分数范围删除ZREMRANGEBYSCORE leaderboard080# 删除不及格的

分数操作

# 增加分数(原子操作)ZINCRBY leaderboard5"张三"# 张三 +5 分ZINCRBY leaderboard-3"李四"# 李四 -3 分# 获取元素排名范围ZREVRANGE leaderboard0-1# 获取集合大小ZCARD leaderboard# 返回 3# 获取指定分数范围内的元素数量ZCOUNT leaderboard90100# 返回 2

场景示例

# 游戏排行榜ZADD game:score15000"player1"ZADD game:score8000"player2"# 更新分数ZINCRBY game:score2000"player1"# 加分# 查看前十ZREVRANGE game:score09WITHSCORES# 热搜榜(每点击一次,热度+1)ZINCRBY hot:news1"news_id_1001"# 获取前十ZREVRANGE hot:news09# 延时队列(Score = 执行时间戳)ZADD delay:queue1733308800"task1"ZADD delay:queue1733310000"task2"# 取到期任务(0 到 当前时间戳)ZRANGEBYSCORE delay:queue01733308900# 删除已执行任务ZREMRANGEBYSCORE delay:queue01733308900

七、 进阶命令:Redis 的隐藏宝藏

1. 键空间通知(KeySpace Notifications)

让 Redis 告诉你某个键发生了什么。

# 开启配置(redis.conf 或 CONFIG SET)CONFIG SET notify-keyspace-events KEA# 所有事件# 订阅键过期事件PSUBSCRIBE __keyevent@0__:expired

2. Pipeline(管道)

批量发送命令,减少网络往返。

# 命令行不支持 Pipeline,但在代码中:# 10000条命令从 5秒 -> 0.05秒

3. Lua 脚本

原子性执行多个命令。

# 限制接口访问频率(伪代码)EVAL"local current = redis.call('incr', KEYS[1]); if current == 1 then redis.call('expire', KEYS[1], ARGV[1]) end; return current"1rate:limit:100160

八、 实战小贴士

命令速查表(打印贴在显示器旁)

我要做…用这个示例
存个普通值SETSET name "Tom"
存个对象HSETHSET user:1 name Tom age 18
做计数器INCRINCR views
做排行榜ZADD+ZREVRANGE游戏积分榜
做抽奖SPOP随机抽取用户
做队列RPUSH+LPOP异步任务
共同关注SINTER社交关系
最新动态LPUSH+LTRIM保持最新100条

最后一句叮嘱

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 6:35:51

Mythos门控发布:大模型深度推理与跨文档验证能力解析

1. 项目概述:一次被刻意“锁住”的能力跃迁如果你最近关注大模型前沿动态,大概率已经看到“Anthropic Mythos”这个词在技术圈悄然升温。它不是新发布的模型,也不是某个开源项目,而是Anthropic内部代号为Mythos的一组核心能力模块…

作者头像 李华
网站建设 2026/6/6 6:32:41

手把手教你用C语言实现FSK来电显示解调(基于8KHz采样与过零检测)

从零实现FSK来电显示解调的嵌入式实战指南 在嵌入式通信系统开发中,FSK信号解调是处理来电显示、远程抄表等场景的核心技术。本文将基于8KHz采样环境,通过C语言实现一套完整的过零检测解调方案,特别针对STM32等资源受限MCU进行优化。不同于理…

作者头像 李华