在后端开发中,Redis 凭借 “快”(内存存储)、“活”(多数据类型)、“稳”(可持久化)的特性,成为缓存、会话存储、排行榜等场景的 “刚需工具”。对于刚接触 Redis 的开发者,无需一开始深究底层原理,先掌握 “怎么用” 才是关键 —— 比如如何切换数据库、统计 key 数量、选择合适的数据类型存储数据。本文将从最基础的操作命令讲起,一步步带你吃透 Redis 的核心能力。
一、Redis 数据库基础操作:4 个必学命令
Redis 默认提供 16 个独立数据库(编号 0-15),就像 16 个 “独立文件柜”,可分别存放不同业务数据(比如 0 号存商品缓存,1 号存用户会话)。以下 4 个命令是管理数据库的 “基本功”,但使用时需注意 “安全边界”。
1. Select:切换数据库的 “钥匙”
作用:从当前数据库切换到指定编号的数据库,语法极简单 ——Select 数据库编号。
Redis 启动后默认停在 0 号数据库,想操作其他库,只需用 Select “解锁”。
实操示例:
# 连接Redis后,默认在0号库(命令行前缀为127.0.0.1:6379>)
127.0.0.1:6379> ping # 先确认连接正常,返回PONG说明没问题
PONG
# 切换到2号数据库
127.0.0.1:6379> select 2
OK # 切换成功,前缀变成127.0.0.1:6379[2]>,一眼能区分当前库
# 再切回0号库
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> # 前缀恢复,回到默认库
注意:默认仅支持 0-15 号库,若业务需要更多库,可修改 Redis 配置文件redis.conf中的databases 16(比如改成 32),但需重启 Redis 才能生效。
2. Dbsize:统计当前库的 “计数器”
作用:快速查询当前数据库中所有 key 的总数,无需传参数,直接输Dbsize即可。
它的优势是 “快”—— 底层靠 Redis 内置计数器实现,不用遍历所有 key,哪怕有 10 万条数据也能瞬间出结果。
实操示例:
# 先在0号库加2个key(后续讲数据类型时会细讲这些命令,先跟着操作)
127.0.0.1:6379> set product:name "iPhone15" # 存一个字符串key
OK
127.0.0.1:6379> hset user:101 name "小明" age 22 # 存一个哈希key
(integer) 2 # 表示成功添加2个field(name和age)
# 查当前库(0号)的key总数
127.0.0.1:6379> dbsize
(integer) 2 # 正好2个key,和实际添加的一致
# 切换到1号库(默认空库),再查一次
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> dbsize
(integer) 0 # 空库返回0,符合预期
3. Flushdb:清空当前库的 “安全擦除”
作用:删除当前数据库中的所有 key,执行后当前库变成 “空柜子”,但不影响其他库 —— 这是它的 “安全点”,适合清理单个业务的测试数据。
实操示例:
# 0号库当前有2个key(先确认)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 2
# 清空当前库(0号)
127.0.0.1:6379> flushdb
OK
# 再查key数量,确认清空
127.0.0.1:6379> dbsize
(integer) 0 # 成功清空
4. Flushall:清空所有库的 “高危操作”
作用:删除 Redis 中所有 16 个库的全部 key,相当于 “把所有文件柜里的东西全扔了”—— 生产环境绝对要谨慎,一旦误执行,没有备份的话数据就彻底没了。
实操示例:
# 先给3号库加个key,模拟其他库有数据
127.0.0.1:6379> select 3
OK
127.0.0.1:6379[3]> set test:key "hello"
OK
127.0.0.1:6379[3]> dbsize
(integer) 1
# 执行Flushall,清空所有库
127.0.0.1:6379[3]> flushall
OK
# 检查3号库(原1个key)和0号库(原空库)
127.0.0.1:6379[3]> dbsize
(integer) 0
127.0.0.1:6379[3]> select 0
OK
127.0.0.1:6379> dbsize
(integer) 0 # 所有库都空了
生产环境防护:为避免误操作,建议做两件事:① 在redis.conf加rename-command FLUSHALL "",直接禁用该命令;② 用 Redis ACL(权限控制),只给管理员开放该命令权限。
二、Redis 核心:五大数据类型怎么用?
Redis 的核心优势不是 “存键值对”,而是支持 5 种不同数据类型 —— 每种类型对应不同业务场景,比如存对象用 Hash,做排行榜用 Zset。下面逐个拆解它们的 “特性 + 命令 + 场景”,用实例帮你理解。
1. String(字符串):最百搭的 “基础款”
特性:一个 key 对应一个 value,能存文本(如 JSON)、数字(如计数器)、甚至二进制(如图片 Base64),最大能存 512MB—— 就像 “万能收纳盒”,啥都能装。
常用命令表:
|
命令 |
作用 |
示例操作 |
结果 / 说明 |
|
set key val |
存键值对 |
set user:name "张三" |
OK |
|
get key |
取 value |
get user:name |
"张三" |
|
incr key |
数字自增 1(仅支持数字) |
set views 50 → incr views |
(integer) 51 |
|
decr key |
数字自减 1 |
decr views |
(integer) 50 |
|
append key str |
拼接字符串 |
append user:name "_男" |
(integer) 5(拼接后长度) |
典型场景:
- 缓存简单数据:比如存商品价格 ——set product:100:price 5999;
- 做计数器:统计文章阅读量,每读一次执行incr article:200:views;
- 存验证码:设置 5 分钟过期 ——set code:138xxxx8888 6688 EX 300(EX 表示过期时间,单位秒)。
2. Hash(哈希):存对象的 “专业款”
特性:一个 key 对应多个 “field-value” 对,类似 Java 的 Map—— 比如用user:100当 key,存 name、age、phone 等属性,修改时不用动整个对象,只改某个 field 就行,效率高。
常用命令表:
|
命令 |
作用 |
示例操作 |
结果 / 说明 |
|
hset key f val |
存 field-value |
hset user:100 name "李四" age 28 |
(integer) 2(加 2 个 field) |
|
hget key field |
取单个 field 的值 |
hget user:100 name |
"李四" |
|
hgetall key |
取所有 field-value |
hgetall user:100 |
1) "name" 2) "李四" 3) "age" 4) "28" |
|
hdel key field |
删除单个 field |
hdel user:100 age |
(integer) 1(删除成功) |
典型场景:
- 存用户详情:user:100为 key,field 包括 name、age、email、address;
- 存商品属性:product:200为 key,field 包括 name、price、stock、category;
- 统计用户行为:user:action:100为 key,field 包括 login_count(登录次数)、click_count(点击次数)。
3. List(列表):有序可重复的 “队列盒”
特性:基于双向链表实现,元素按插入顺序排列,能从头部(left)或尾部(right)加 / 删数据 —— 头部 / 尾部操作极快(O (1)),中间操作慢(O (n)),适合做队列或栈。
常用命令表:
|
命令 |
作用 |
示例操作 |
结果 / 说明 |
|
lpush key val... |
从头部加元素 |
lpush todo "吃饭" "睡觉" "工作" |
(integer) 3(列表长度) |
|
rpush key val... |
从尾部加元素 |
rpush todo "运动" |
(integer) 4 |
|
lrange key s e |
取指定范围元素 |
lrange todo 0 -1(0=-1 表示所有) |
1) "工作" 2) "睡觉" 3) "吃饭" 4) "运动"(lpush 是逆序加) |
|
lpop key |
从头部删元素 |
lpop todo |
"工作"(返回删除的元素) |
|
rpop key |
从尾部删元素 |
rpop todo |
"运动" |
典型场景:
- 消息队列:用rpush加消息(生产者),lpop取消息(消费者),实现 “先进先出”;
- 最新列表:存 “用户最近浏览的 5 个商品”,新浏览的用lpush加,用lrange 0 4取前 5 个;
- 栈:用lpush入栈,lpop出栈,实现 “先进后出”(比如 undo 操作记录)。
4. Set(集合):去重 + 关系计算的 “神器”
特性:无序、不可重复(加重复元素会自动忽略),底层是哈希表 —— 判断元素是否存在极快(O (1)),还支持交集、并集、差集,适合去重和关系计算。
常用命令表:
|
命令 |
作用 |
示例操作 |
结果 / 说明 |
|
sadd key val... |
加元素(自动去重) |
sadd user:100:tags "篮球" "音乐" "篮球" |
(integer) 2(重复的 “篮球” 只算 1 个) |
|
smembers key |
取所有元素 |
smembers user:100:tags |
1) "篮球" 2) "音乐"(无序) |
|
sismember key val |
判断元素是否存在 |
sismember user:100:tags "足球" |
(integer) 0(不存在) |
|
sinter k1 k2 |
求两个集合的交集 |
sadd user:101:tags "音乐" "电影" → sinter user:100:tags user:101:tags |
1) "音乐"(共同标签) |
典型场景:
- 标签去重:存用户兴趣标签,避免重复;
- 共同好友:求用户 A 和 B 的共同好友 ——sinter user:A:friends user:B:friends;
- 独立统计:统计 “今日访问网站的独立用户 ID”,用sadd加 ID,scard key查数量(scard 是查集合大小)。
5. Zset(有序集合):做排行榜的 “专家”
特性:在 Set 基础上给每个元素加 “分数(score)”,按分数从小到大排序(分数可重复,元素不可重复)—— 底层是跳表,支持按分数 / 排名查数据,做排行榜超方便。
常用命令表:
|
命令 |
作用 |
示例操作 |
结果 / 说明 |
|
zadd key s val... |
加元素(带分数) |
zadd rank:score 85 小明 92 小红 78 小刚 |
(integer) 3 |
|
zrange key s e withscores |
升序取元素(带分数) |
zrange rank:score 0 -1 withscores |
1) "小刚" 2) "78" 3) "小明" 4) "85" 5) "小红" 6) "92" |
|
zrevrange key s e withscores |
降序取元素(带分数) |
zrevrange rank:score 0 1 withscores |
1) "小红" 2) "92" 3) "小明" 4) "85"(取前 2 名) |
|
zincrby key num val |
元素分数自增 |
zincrby rank:score 3 小明 |
"88"(85+3=88) |
典型场景:
- 排行榜:做 “考试分数排行榜”,用zrevrange取前 10 名;
- 延迟队列:用时间戳当分数,zadd加任务,zrangebyscore key 0 当前时间取到期任务;
- 分数筛选:找 “分数≥90 的学生”——zrangebyscore rank:score 90 +inf(+inf 表示无穷大)。
三、Redis 键(key)命名规范:让数据 “好管理”
不管用哪种数据类型,key 都是数据的 “身份证”—— 如果 key 命名混乱(比如a1、user123、Product_100),后续维护会很头疼。推荐 “业务:对象:ID: 属性” 的格式,遵循 4 个原则:
- 用冒号(:)分层:比如order:200:status(业务 = order,对象 = 200,属性 = status),一眼能看懂含义;
- 全小写 + 下划线:Redis key 区分大小写(User:100和user:100是两个 key),全小写能避免混淆;
- 带业务标识:比如cart:100:items(购物车业务)、log:login:202405(登录日志业务),便于区分不同业务数据;
- 不长不短:太长会占内存(比如this_is_user_id_100_name),太短语义不清(比如u100n),适中最好。
规范示例:
- String 类型:verify:code:138xxxx8888(验证码);
- Hash 类型:user:100:info(用户详情);
- List 类型:user:100:recent:products(用户最近浏览商品);
- Set 类型:product:200:tags(商品标签);
- Zset 类型:rank:game:score(游戏积分排行榜)。
四、总结:Redis 选型 “一句话口诀”
学完这些内容,记住一句口诀,就能快速选对数据类型:
- 存单一值(计数器、验证码)→ 用 String;
- 存对象(用户、商品)→ 用 Hash;
- 存有序列表(队列、最新记录)→ 用 List;
- 要去重或算关系(标签、共同好友)→ 用 Set;
- 做排序或排行榜(分数、排名)→ 用 Zset。
基础命令方面,Select、Dbsize 是日常操作,Flushdb、Flushall 要谨慎;key 命名按规范来,后续维护能省很多事。Redis 的高级特性(如持久化、集群)可以慢慢学,但先把这些基础用熟,就能应对大部分开发场景了。
818

被折叠的 条评论
为什么被折叠?



