第 2 课:Redis 核心数据结构详解

学习目标

完成本课后,你将掌握:

  • Redis 五大核心数据结构
  • 各数据结构的底层特点
  • 常用命令操作
  • 项目中的典型应用场景
  • 如何选择合适的数据结构解决业务问题

Redis 五大核心数据结构

Redis 支持 5 种核心数据结构。

这也是 Redis 区别于传统 Key-Value 数据库的重要原因。

数据结构 中文名称 特点
String 字符串 最基础、最常用
Hash 哈希 存储对象
List 列表 有序可重复
Set 集合 无序不重复
ZSet 有序集合 自动排序

2.1 String(字符串)

什么是 String?

String 是 Redis 最基础的数据结构。

特点:

  • 二进制安全
  • 可以存储任意数据
  • 最大支持 512MB
  • 操作效率极高

可以存储:

  • 字符串
  • 数字
  • JSON
  • 图片二进制
  • 文件二进制

常用命令

设置数据

set key value

示例:

set name zhangsan

获取数据

get key

示例:

get name

批量设置

mset key1 value1 key2 value2

示例:

mset name zhangsan age 20 city beijing

批量获取

mget key1 key2

示例:

mget name age

自增

incr count

示例:

set count 1

incr count

结果:

2

自减

decr count

指定数值增加

incrby count 10

指定数值减少

decrby count 10

不存在才设置

setnx key value

示例:

setnx lock 1

常用于:

  • 分布式锁

String 应用场景

缓存用户信息

set user:1001 "{json数据}"

文章阅读量

incr article:1001:view

点赞数

incr article:1001:like

验证码

setex sms:13800138000 300 123456

分布式锁

setnx lock:order 1

面试题

为什么 Redis 计数器不会超卖?

因为:

INCR
DECR

都是原子操作。

Redis 单线程执行命令。

不会出现并发安全问题。


2.2 Hash(哈希)

什么是 Hash?

Hash 本质上是:

key -> field -> value

类似 Java 中:

Map<String,Object>

非常适合存储对象。


数据结构示意

user:1001
 ├─ name = zhangsan
 ├─ age = 20
 └─ gender = male

常用命令

设置字段

hset user:1001 name "zhangsan" age 20 gender "male"

获取字段

hget user:1001 name

获取全部字段

hgetall user:1001

获取所有 Key

hkeys user:1001

获取所有 Value

hvals user:1001

字段自增

hincrby user:1001 age 1

判断字段是否存在

hexists user:1001 name

删除字段

hdel user:1001 age

获取字段数量

hlen user:1001

Hash 应用场景

用户信息

user:1001

保存:

  • 姓名
  • 年龄
  • 手机号
  • 邮箱

商品详情

product:1001

保存:

  • 名称
  • 价格
  • 库存

系统配置

system:config

保存:

  • 网站名称
  • Logo
  • 联系方式

购物车

cart:1001
商品ID -> 数量

例如:

hset cart:1001 10001 2
hset cart:1001 10002 5

Hash 与 String 对比

对比项 String Hash
存储对象 一般 优秀
更新单个字段 需要整体更新 直接更新
内存占用 较高 较低
推荐程度 ⭐⭐⭐ ⭐⭐⭐⭐⭐

2.3 List(列表)

什么是 List?

List 是一个:

有序
可重复

的字符串列表。

底层实现:

双向链表

常用命令

左侧插入

lpush list1 "a" "b" "c"

结果:

c b a

右侧插入

rpush list1 "d" "e"

结果:

c b a d e

左侧弹出

lpop list1

返回:

c

右侧弹出

rpop list1

返回:

e

获取元素

lrange list1 0 -1

获取全部元素。


获取前几个元素

lrange list1 0 2

获取长度

llen list1

阻塞获取

blpop list1 30

brpop list1 30

List 应用场景

消息队列

生产者:

lpush queue msg1

消费者:

rpop queue

最新文章

latest:article

最新评论

latest:comment

浏览记录

history:user:1001

栈结构

lpush
lpop

2.4 Set(集合)

什么是 Set?

特点:

无序
不重复

底层:

Hash Table

常用命令

添加元素

sadd set1 "a" "b" "c" "a"

结果:

a b c

自动去重。


获取所有元素

smembers set1

判断是否存在

sismember set1 "a"

删除元素

srem set1 "b"

获取数量

scard set1

集合运算

交集

sinter set1 set2

并集

sunion set1 set2

差集

sdiff set1 set2

Set 应用场景

用户标签

tag:user:1001

商品标签

tag:product:1001

共同好友

sinter friend:user1 friend:user2

网站 UV 去重

sadd uv:20260501 ip

抽奖系统

利用:

spop

随机抽取。


2.5 ZSet(有序集合)

什么是 ZSet?

ZSet:

有序
不重复

每个元素都有:

score

Redis 会根据 score 自动排序。


数据结构示意

100 zhangsan
90  lisi
80  wangwu

常用命令

添加元素

zadd rank 100 "zhangsan" 90 "lisi" 80 "wangwu"

升序查询

zrange rank 0 -1

降序查询

zrevrange rank 0 -1

查询排名

zrank rank "lisi"

查询分数

zscore rank "zhangsan"

增加分数

zincrby rank 10 "lisi"

删除元素

zrem rank "wangwu"

分数范围查询

zrangebyscore rank 80 90

ZSet 应用场景

游戏排行榜

game:rank

商品销量榜

product:sale:rank

热搜榜

hot:search

延时队列

score = 时间戳

定时任务

score = 执行时间

五大数据结构选型总结

场景 推荐结构
缓存对象 Hash
计数器 String
消息队列 List
去重 Set
标签系统 Set
排行榜 ZSet
延时任务 ZSet
浏览记录 List
用户信息 Hash
验证码 String

本课总结

本课学习了 Redis 五大核心数据结构:

  • String
  • Hash
  • List
  • Set
  • ZSet

掌握这五种数据结构后,已经能够解决 80% 以上的 Redis 项目场景。


课后练习

练习 1

使用 Hash 存储用户信息:

姓名
年龄
性别
邮箱
手机号

练习 2

使用 List 实现消息队列:

生产者:LPUSH

消费者:RPOP

练习 3

使用 ZSet 实现学生成绩排行榜:

  • 添加成绩
  • 查询排名
  • 修改成绩

练习 4

使用 Set 实现标签系统:

  • 添加标签
  • 删除标签
  • 查询标签
  • 查询共同标签

下一课预告

第 3 课:Java 客户端操作 Redis

学习内容:

  • Jedis
  • Lettuce
  • Spring Data Redis
  • RedisTemplate
  • Spring Boot 整合 Redis
  • Redis 工具类封装
  • 企业级项目实战