文章目录
- 前言
- [4. Redis 数据类型(核心)](#4. Redis 数据类型(核心))
-
- [4.1 String](#4.1 String)
- [4.2 Hash](#4.2 Hash)
- [4.3 List](#4.3 List)
- [4.4 Set](#4.4 Set)
- [4.5 ZSet(重点)](#4.5 ZSet(重点))
- [4.6 其他数据类型](#4.6 其他数据类型)
-
- [1. Bitmap(位图)](#1. Bitmap(位图))
- [2. HyperLogLog](#2. HyperLogLog)
- [3. Geo](#3. Geo)
- [4. Stream](#4. Stream)
- 结语
前言
Redis 之所以强大,不仅因为它速度快,更因为它提供了丰富的数据类型来解决不同业务问题。
例如:
- 计数器为什么适合用 String?
- 排行榜为什么通常使用 ZSet?
- 用户信息为什么很多项目选择 Hash?
不同的数据结构,决定了 Redis 在业务中的使用方式。
本文将围绕 Redis 的核心数据类型展开,结合常见命令与实际应用场景,帮助你快速建立 Redis 数据结构选型思维。
4. Redis 数据类型(核心)
4.1 String
String 是什么
String 是 Redis 最常用的数据类型,可以理解为: key --> value。
例如:
bash
set name tom
get name
除了字符串,它还能存数字、JSON、token、对象数据。
比如:
bash
set user '{"name":"tom","age":20}'
常用命令
- set/get:设置值 和 获取值
bash
# 设置值
set name tom
# 获取值
get name
- setex:设置并指定过期时间
bash
# 表示号码 13800 的验证码 8888 过 60 秒过期
setex code: 13800 60 8888
- incr:自增
bash
# 执行一次 阅读量 +1
incr article:1:view
- decr:自减
bash
# 常用于 库存扣减
decr stock:1001
- append:追加字符串
bash
append msg hello
append msg world
- mget/mset:批量操作
bash
mset k1 v1 k2 v2
mget k1 k2
应用场景
-
计数器
Redis 非常适合统计数量。例如:阅读量、点赞数、在线人数、商品库存。通过自增或自减实现。
-
分布式锁
例如:
bash
set lock:order 1 nx ex 10
表示:
- nx:不存在才能设置
- ex:10 秒后自动过期
常用于防止重复下单。
4.2 Hash
Hash 是什么
Hash 类似于 Java 中的 Map,结构为:field -->value,适合存对象。
例如:
bash
hset user:1 name tom
hset user:1 age 20
结构:
user:1
name -> tom
age -> 20
常用命令
- hset / hget:设置字段 / 获取字段
bash
hset user:1 name tom
hget user:1 name
- hmset / hmget:批量 设置 和 获取
bash
hmset user:1 name tom age 20 city beijing
hmget user:1 name age
- hgetall:获取整个对象
bash
hgetall user:1
- hdel:删除字段
bash
hdel user:1 age
应用场景
- 用户信息
例如:用户昵称、用户年龄、用户头像,使用 Hash:
bash
hset user:1001 name tom
hset user:1001 age 20
- 商品信息
例如:商品名称、价格、库存
bash
hset product:1 price 5999
- 购物车
结构例如:用户 --> 商品 --> 数量
bash
# 表示用户购买了 2 件商品
hset cart:1001 product:1 2
- 配置信息
例如:网站配置系统配置
bash
hset config:web title redis-study
Hash 和 String 如何选择
Hash 适合
- 字段较多
- 经常修改部分字段
- 对象结构简单
String 适合
- 整体读取
- JSON 结构复杂
- 很少修改字段
4.3 List
List 是什么
Redis List 本质上是有序列表,可以:
- 左边插入
- 右边插入
- 左边弹出
- 右边弹出
因此非常适合作队列。
常用命令
- lpush:左侧插入
bash
lpush msg hello
- rpush:右侧插入
bash
rpush msg world
- lpop:左侧弹出
bash
lpop msg
- rpop:右侧弹出
bash
rpop msg
- lrange:查看列表
bash
# 表示查看全部元素
lrange msg 0 -1
- llen:查看 list 长度
bash
llen msg
- blpop:阻塞读取,如果没有数据会一直等待
bash
blpop queue 0
应用场景
- 消息队列
例如:订单队列。
生产者:
bash
lpush order_queue order1
消费者:
bash
brpop order_queue 0
- 评论列表
例如:文章最新评论。
bash
lpush comment:list xxx
4.4 Set
Set 是什么
Set 特点:无序不可重复。
例如:
bash
sadd like:1 user1
sadd like:1 user2
不会重复保存

常用命令
- sadd:添加元素。
bash
sadd user:1 tom
- smembers:获取全部元素。
bash
smembers user:1
- srem:删除元素。
bash
srem user:1 tom
- sismember:判断是否存在。
bash
sismember user:1 tom
- scard:统计数量。
bash
scard like:1
- sinter:求交集。
bash
sinter friend:a friend:b
应用场景
- 点赞系统
例如:一个用户只能点赞一次
bash
sadd like:1001 user1
依靠 set 的自动去重。
- 共同好友
例如:A 的好友集合B 的好友集合
求共同好友:
bash
sinter friend:a friend:b
- 抽奖名单
保存所有参与用户。
bash
sadd activity:1 user1
然后随机抽取。
- 标签系统
例如:用户兴趣标签
bash
sadd user:1:tags java redis mysql
4.5 ZSet(重点)
Zset 是什么
ZSet是可排序集合,每个元素都有score(分数)。
例如:
bash
zadd rank 100 tom
zadd rank 80 jack
Redis 会根据 score 自动排序。
常用命令
- zadd:添加元素
bash
zadd rank 100 tom
- arange:升序查看
bash
zrange rank 0 -1
- zrevrange:降序查看,常用于 排行榜 Top10
bash
zrevrange rank 0 9
- zincrby:增加分数
bash
zincrby rank 10 tom
- zscore:查看分数
bash
zscore rank tom
- zrem:删除元素
bash
zrem rank tom
应用场景
- 排行榜
比如说查看 游戏积分榜、热门文章、销量排行的前 10 名。
bash
zrevrange hot_rank 0 9
-
热搜榜
热度越高,score 越大,自动排序。
-
延迟队列
利用 score 保存时间戳,到时间后消费。
-
优先级任务
score 越高,优先级越高。
4.6 其他数据类型
除了常见的: String、Hash、List、Set、ZSet,Redis 还提供了一些特殊数据类型,用于解决特定业务问题。日常开发中使用相对较少,了解即可。
1. Bitmap(位图)
Bitmap 用 0 和 1 表示状态,适合场景有签到、在线状态、是否完成任务。
常用命令有:
bash
SETBIT key offset value
GETBIT key offset
BITCOUNT key
示例:
bash
setbit dailycheck:1001 100 1
表示用户 1001 在第 100 天签到成功,其中1 表示已签到、0 表示未签到。
2. HyperLogLog
用于统计去重后的元素数量。
比方说,网站 UV(独立访客),即使一个用户访问很多次,也只统计一次。
常用命令:
bash
pfadd uv user1
pfcount uv
3. Geo
Geo 用于存储经纬度信息,可以计算:距离、附近的人、附近商家。
常用命令:
bash
geoadd
geodist
georadius
示例:
bash
geoadd city 116.40 39.90 beijing
适用于:
text
外卖、打车、地图定位
4. Stream
Redis 5.0 新增的数据结构。
本质上是消息队列。相比 List,Stream支持:消息持久化、消费组、 阻塞读取。
适用于:
text
异步任务
订单处理
消息通知
可以理解为:List 是简单队列,Stream 是增强版队列。不过在大型项目中,一般还是会使用专业 MQ,诸如Kafka、RocketMQ、RabbitMQ。
结语
Redis 的核心并不只是"记住命令",而是:根据业务场景选择合适的数据结构。
例如:
- String:计数、缓存
- Hash:对象存储
- List:队列
- Set:去重
- ZSet:排行榜
当你能够看到需求,就想到对应的数据类型时,才算真正掌握了 Redis。