【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 有序不可重复、带分数、范围查询 排行榜、延时任务、权重消息队列
相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415910 小时前
TCP超时重传机制是为了解决什么问题?
java
二宝哥11 小时前
CentOS 7.9 系统下 Redis 5.0.4 单机安装与源码编译安装指南
redis·centos
莫逸风13 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898613 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112314 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python