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、数字。
基础命令
# 设置值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浏览量+1Hash 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__:expired2. 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八、 实战小贴士
命令速查表(打印贴在显示器旁)
| 我要做… | 用这个 | 示例 |
|---|---|---|
| 存个普通值 | 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 自带帮助系统。