目录
[一. String(字符串)](#一. String(字符串))
[1. 核心介绍](#1. 核心介绍)
[2. 常用命令](#2. 常用命令)
[3. 最佳使用场景](#3. 最佳使用场景)
[1. 核心介绍](#1. 核心介绍)
[2. 常用命令](#2. 常用命令)
[3. 最佳使用场景](#3. 最佳使用场景)
[1. 核心介绍](#1. 核心介绍)
[2. 常用命令](#2. 常用命令)
[3. 最佳使用场景](#3. 最佳使用场景)
[1. 核心介绍](#1. 核心介绍)
[2. 常用命令](#2. 常用命令)
[3. 最佳使用场景](#3. 最佳使用场景)
[五、ZSet(Sorted Set 有序集合)](#五、ZSet(Sorted Set 有序集合))
[1. 核心介绍](#1. 核心介绍)
[2. 常用命令](#2. 常用命令)
[3. 最佳使用场景](#3. 最佳使用场景)
一. String(字符串)
1. 核心介绍
String 是 Redis 最基础、最常用的数据类型,采用「key-value」键值对形式存储,一个 key 对应一个 value。其灵活性极高。
2. 常用命令
bash
# 1. 基础读写(最常用)
SET name 小明 # 设置键值对,简单好记
GET name # 获取值,返回小明
DEL name # 删除键值对,删除name
# 2. 过期时间(缓存场景必备)
SETEX age 60 20 # 设置带过期时间的键值对,age=20,60秒后过期
PSETEX count 5000 10 # 毫秒级过期,count=10,5秒后过期
# 3. 数值操作(原子性,高并发安全)
INCR count # 整数自增1,count从0变成1
DECR stock # 整数自减1,stock从10变成9
INCRBY point 5 # 自增指定数值,point加5
# 4. 分布式锁核心命令
SETNX lock 1 # 不存在则设置,获取锁
#执行 SETNX lock 1 时,Redis 会先检查:有没有一个叫「lock」的键?
如果没有(不存在):
就创建这个 key,设置 value 为 1,命令返回 1,表示「获取锁成功」;
如果有(已存在):
什么都不做,命令返回 0,表示「获取锁失败」。
3. 最佳使用场景
String 通用性极强,以下是 4 个最常见的生产场景,覆盖缓存、计数、分布式锁等核心需求:
-
缓存场景:存储高频访问的数据,减轻数据库压力,比如用户姓名、商品名称、系统配置等(示例:SET name "小明");
-
计数器场景:实现高并发下的计数,比如文章阅读量、视频播放量、点赞数、库存计数;
-
分布式锁场景:利用 SETNX 指令实现分布式环境下的锁机制,解决并发修改问题(如订单创建、库存扣减);
-
临时数据存储:存储短信验证码、临时令牌、会话信息等,配合过期时间,自动清理无效数据。
二、Hash(哈希)
1. 核心介绍
Hash 类型是 String 类型的「升级款」,本质是「key - field - value」的三层结构:一个顶层 key 对应一个哈希表,哈希表中包含多个 field(字段),每个 field 对应一个 value(值)。
| KEY | VALUE ||
| KEY | field | value |
| User:1 | name | zhangsan |
| User:1 | age | 21 |
| User:2 | name | lisi |
| User:2 | age | 32 |
|---|
2. 常用命令
Hash 命令均以 H 开头,搭配用户对象案例,方便理解和实操:
bash
# 1. 基础操作:设置/获取单个字段
HSET student name 小红 # 设置字段,学生姓名小红
HGET student name # 获取字段,返回小红
# 2. 批量操作:设置/获取多个字段
HMSET student age 18 sex 女 # 批量设置,年龄18、性别女
HMGET student age sex # 批量获取,返回18、女
# 3. 获取所有字段和值
HGETALL student # 返回所有字段和值,查看完整学生信息
# 4. 数值操作(原子性)
HINCRBY student age 1 # 字段值自增,年龄加1变成19
HINCRBYFLOAT student score 2.5 # 浮点型自增,分数加2.5
# 5. 字段判断与删除
HEXISTS student sex # 判断字段是否存在,返回1存在,0不存在
HDEL student sex # 删除字段,删除性别字段
3. 最佳使用场景
Hash 类型的核心优势是「结构化存储、单个字段操作」,以下是 3 个最常见的生产场景:
-
结构化对象存储:这是 Hash 最常用的场景,存储用户、商品、订单等结构化数据。相比 String 类型,无需序列化 JSON,可单独修改某个字段(如只更新用户年龄),且节省内存;
-
购物车场景:电商项目中,购物车可通过 Hash 实现,快速添加、修改、删除商品;
-
配置项存储:存储系统配置、接口参数等一组相关的配置项,可单独修改某个配置,无需重新设置整个配置集。
三、List(列表)
1. 核心介绍
Redis List 是一个「有序、可重复」的字符串列表,核心特点是「按插入顺序排序」------从左边插入的元素排在最前面,从右边插入的元素排在最后面,支持从两端插入、弹出元素,操作灵活。
基于这个特性,List 可以轻松实现两种数据结构:
-
队列(FIFO):左进右出(LPUSH + RPOP),适合消息队列;
-
栈(LIFO):左进左出(LPUSH + LPOP),适合临时存储、回溯场景。
List 的长度没有限制(只要内存足够),元素可以重复,这也是它和 Set 类型的核心区别。
2. 常用命令
List 命令均以 L/R 开头(L=左(left),R=右(right)),搭配消息队列案例,方便实操:
bash
# 1. 插入操作(核心)
LPUSH list a b # 从左边插入元素,插入a和b
RPUSH list c d # 从右边插入元素,插入c和d
# 2. 弹出操作(核心)
LPOP list # 从左边弹出元素,返回b
RPOP list # 从右边弹出元素,返回d
RPOPLPUSH list newlist # 从list右边弹出,插入newlist左边
# 3. 查看操作
LRANGE list 0 -1 # 获取所有元素,查看list里的全部内容
LLEN list # 获取列表长度,查看list有多少个元素
# 4. 修剪操作(常用)
LTRIM list 0 1 # 只保留前2个元素,删除其他元素
3. 最佳使用场景
List 类型的核心优势是「有序、两端操作高效」,以下是 3 个最常见的生产场景:
-
消息队列:利用 List 的「左进右出(LPUSH + RPOP)」特性,实现简单的生产者-消费者模型,适合低并发、非核心业务的消息队列(如通知、日志收集)。可通过 RPOPLPUSH 命令实现消息备份,避免消息丢失;
-
社交时间线:在朋友圈、微博等社交场景中,用户的动态列表(时间线)可通过 List 实现------用户发布新动态时,用 LPUSH 插入列表(保证最新动态在最前面),用 LRANGE 分页查询;
-
最新 N 条数据列表:存储系统的最新消息、最新订单、最新评论等,用 LTRIM 命令保留最近 N 条数据,避免列表过长占用内存(如存储最近 100 条系统日志)。
四、Set(集合)
1. 核心介绍
Redis Set 是一个「无序、不可重复」的字符串集合,核心特点有两个:
-
无序:元素没有固定顺序,不能通过索引获取(和 List 相反);
-
不可重复:同一个元素只能存一次,自动去重(插入重复元素会被忽略)。
Set 支持多种集合运算,比如交集(共同元素)、并集(所有元素)、差集(差异元素),这些运算都是 Redis 内部优化实现,效率极高,无需手动编写复杂逻辑。
核心价值:高效去重 + 集合运算,适合去重统计、社交关系、抽奖等场景。
2. 常用命令
Set 命令均以 S 开头,搭配社交、去重案例,方便实操:
bash
# 1. 基础操作:添加/删除/查询
SADD fruit1 苹果 香蕉 橘子 # 添加元素(自动去重)
SMEMBERS fruit1 # 获取所有元素
SREM fruit1 橘子 # 删除指定元素
SISMEMBER fruit1 苹果 # 判断元素是否存在
SCARD fruit1 # 获取元素个数
# 2. 随机操作(抽奖常用)
SPOP fruit1 1 # 随机弹出1个元素(删除)
SRANDMEMBER fruit1 2 # 随机获取2个元素(不删除)
# 3. 集合运算(核心)
SADD fruit1 苹果 香蕉 橘子 # 添加元素(自动去重)
SADD fruit2 香蕉 葡萄 # 新建集合fruit2,添加元素
SINTER fruit1 fruit2 # 交集(求出共同元素),返回香蕉
SUNION fruit1 fruit2 # 并集(合并后去除重复元素),返回苹果、香蕉、葡萄
SDIFF fruit1 fruit2 # 差集(fruit1有、fruit2没有),返回苹果
3. 最佳使用场景
Set 类型的核心优势是「自动去重 + 高效集合运算」,以下是 4 个最常见的生产场景:
-
去重统计:利用 Set 不可重复的特性,快速实现去重统计,比如独立 IP 访问量、单日下单用户数、文章标签去重;
-
社交关系场景:利用 Set 的集合运算,实现共同好友、共同关注、可能认识的人等功能------用 SINTER 取交集(共同好友),用 SDIFF 取差集(可能认识的人);
-
抽奖场景:利用 SPOP 或 SRANDMEMBER 命令,实现随机抽奖功能------SPOP 弹出元素(避免重复中奖),SRANDMEMBER 随机获取(可重复参与);
-
黑名单/白名单:存储恶意 IP、违规用户(黑名单)或 VIP 用户(白名单),用 SISMEMBER 命令快速判断用户/IP 是否在名单中,高效拦截。
五、ZSet(Sorted Set 有序集合)
1. 核心介绍
ZSet(Sorted Set,有序集合)是 Redis 五种基础数据类型中最强大的一种,核心特点是「有序、不可重复、带分数」:
-
不可重复:和 Set 一样,同一个元素只能存一次,自动去重;
-
带分数(score):每个元素都关联一个 double 类型的分数,Redis 会根据分数自动对元素排序(默认升序);
-
有序:排序基于分数,支持升序、降序查询,支持范围查询(如前 10 名、前 100 名)。
ZSet 完美解决了"有序 + 去重 + 范围查询"的需求,是排行榜、延时任务等场景的终极解决方案。
2. 常用命令
ZSet 命令均以 Z 开头,示例极简,复制即可实操:
bash
# 1. 基础操作:添加/删除/查询
ZADD rank 90 小红 85 小明 80 小刚 # 添加元素(带分数),三人成绩排名
ZSCORE rank 小红 # 获取元素的分数,返回90
ZREM rank 小刚 # 删除元素,删除小刚的排名
ZCARD rank # 获取元素个数,返回2
# 2. 分数操作(核心,排行榜打榜)
ZINCRBY rank 5 小明 # 增加元素分数,小明成绩加5变成90
# 3. 排序与范围查询(核心,排行榜展示)
ZRANGE rank 0 -1 WITHSCORES # 升序查询,显示所有成绩
ZREVRANGE rank 0 1 WITHSCORES # 降序查询(排行榜常用),显示前2名
# 4. 排名查询
ZREVRANK rank 小红 # 降序排名(从0开始),返回0(第一名)
3. 最佳使用场景
ZSet 类型的核心优势是「有序 + 分数 + 范围查询」,以下是 3 个最常见的生产场景:
-
排行榜系统:这是 ZSet 最经典的场景,几乎所有排行榜都可以用 ZSet 实现------游戏战力榜(score=战力值)、电商销量榜(score=销量)、朋友圈点赞榜(score=点赞数)、热搜榜(score=搜索次数),用 ZREVRANGE 即可快速获取前 N 名;
-
延时任务:利用 ZSet 的「分数排序」特性,实现延时任务(如订单超时取消、消息延时推送)------score=任务执行时间戳,member=任务ID,消费者定时查询 ZSet 中 score ≤ 当前时间戳的元素,执行任务后删除;
-
带权重的消息队列:在消息队列中,给消息设置权重(score=权重值,数值越大优先级越高),用 ZREVRANGE 按权重从高到低获取消息,实现优先级消费。
六. 总结
| 数据类型 | 核心特性 | 最佳场景 |
|---|---|---|
| String | key-value、支持数值运算 | 缓存、计数器、分布式锁、临时数据 |
| Hash | key-field-value、结构化存储 | 用户/商品对象、购物车、配置项 |
| List | 有序可重复、两端操作高效 | 消息队列、时间线、最新N条数据 |
| Set | 无序不可重复、支持集合运算 | 去重统计、共同好友、抽奖、黑名单 |
| ZSet | 有序不可重复、带分数、范围查询 | 排行榜、延时任务、权重消息队列 |