【Redis】Redis的五种核心数据类型详解

目录

[一. String(字符串)](#一. String(字符串))

[1. 核心介绍](#1. 核心介绍)

[2. 常用命令](#2. 常用命令)

[3. 最佳使用场景](#3. 最佳使用场景)

二、Hash(哈希)

[1. 核心介绍](#1. 核心介绍)

[2. 常用命令](#2. 常用命令)

[3. 最佳使用场景](#3. 最佳使用场景)

三、List(列表)

[1. 核心介绍](#1. 核心介绍)

[2. 常用命令](#2. 常用命令)

[3. 最佳使用场景](#3. 最佳使用场景)

四、Set(集合)

[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 有序不可重复、带分数、范围查询 排行榜、延时任务、权重消息队列
相关推荐
夕除2 小时前
javaweb--02
java·tomcat
ailvyuanj2 小时前
2026年Java AI开发实战:Spring AI完全指南
java
张np2 小时前
java进阶-Dubbo
java·dubbo
汽车仪器仪表相关领域2 小时前
NHFID-1000型非甲烷总烃分析仪:技术破局,重构固定污染源监测新体验
java·大数据·网络·人工智能·单元测试·可用性测试·安全性测试
一叶飘零_sweeeet2 小时前
深入理解 AQS:从架构到实现,解锁 Java 并发编程的核心密钥
java·aqs
一叶飘零_sweeeet2 小时前
深入拆解 Java CAS:从底层原理到 ABA 问题实战
java·cas·并发编程
StackNoOverflow3 小时前
Spring Security权限控制框架详解
java·数据库·sql
yaaakaaang3 小时前
九、装饰器模式
java·装饰器模式
d_dreamer3 小时前
SeaTunnel推荐Maven版本
java·maven