Redis是一款开源的、基于内存的、高性能的 Key-Value 数据存储系统,广泛应用于缓存、会话管理、排行榜、消息队列、实时统计等场景。
Redis 的强大之处不仅在于它将数据存储在内存中以提供极快的读写速度,还在于它支持 多种灵活的数据结构,每种数据结构都针对特定的应用场景做了优化。
一、Redis 支持的主要数据结构
Redis 提供了以下 核心数据结构类型,每种类型都对应一个或多个底层命令,用于高效地操作数据:
|
数据结构类型 |
Redis 键类型 |
简要说明 |
典型应用场景 |
|---|---|---|---|
|
String(字符串) |
key-value |
最基本的键值类型,值可以是文本、数字或二进制数据 |
缓存、计数器、分布式锁、配置存储 |
|
List(列表) |
key-list |
一个有序的字符串元素集合,基于双向链表实现 |
消息队列、最新消息排行、历史记录 |
|
Set(集合) |
key-set |
无序、唯一的字符串元素集合 |
标签系统、好友关系、去重统计 |
|
Hash(哈希表) |
key-hash |
类似 Map 的结构,存储 field-value 对 |
对象存储、用户信息、配置项 |
|
Sorted Set(有序集合 / ZSet) |
key-zset |
带权重排序的集合,每个元素关联一个分数(score) |
排行榜、优先级队列、范围查询 |
|
Bitmap(位图) |
key-bit |
基于 String 的位操作,用于高效存储布尔值 |
用户签到、活跃状态统计 |
|
HyperLogLog(基数统计) |
key-hll |
用于基数(不重复元素个数)统计,误差极小 |
UV(独立访客)统计、大规模去重估算 |
|
Stream(流) |
key-stream |
类似消息队列,支持多消费者、消息持久化 |
消息队列、事件溯源、日志流处理(Redis 5.0+) |
|
Geospatial(地理空间) |
key-geo |
存储地理位置信息,支持距离计算、范围查询 |
附近的人、地点搜索、地理围栏 |
⭐ 最常用的 5 种数据结构:String、List、Hash、Set、Sorted Set(ZSet)
二、各数据结构详解与典型用途
1. String——最基础、常用
特点:
- 一个 Key 对应一个 Value,Value 是字符串(也可以是数字、二进制数据)。
- Value 最大支持 512MB。
- 支持多种类型的操作:设置、获取、追加、自增、自减等。
常用命令:
SET key value/GET keyINCR key(自增,用于计数器)DECR key(自减)APPEND key value(追加字符串)SETNX key value(不存在才设置,可用于分布式锁)
典型应用场景:
- 缓存:缓存数据库查询结果,如
GET user:1 - 计数器:文章阅读量、点赞数,如
INCR article:views:1001 - 分布式锁:利用
SETNX实现简单的锁机制 - 配置存储:存储系统或用户配置项
2. List(列表)——有序、可重复,支持两端操作
特点:
- 一个 Key 对应一个有序的字符串元素集合,元素可重复。
- 基于双向链表实现,支持从头部或尾部快速插入/删除。
- 适合实现队列(FIFO)和栈(LIFO)。
常用命令:
LPUSH key value/RPUSH key value(从左/右插入)LPOP key/RPOP key(从左/右弹出)LRANGE key start stop(获取范围内的元素)LLEN key(获取列表长度)
典型应用场景:
- 消息队列:简单的生产者-消费者模型,如任务队列
- 最新消息/动态:如“最近发布的文章”、“最新登录用户”
- 历史记录:如用户浏览历史、操作记录(可限制长度)
3. Set(集合)——无序、唯一
特点:
- 一个 Key 对应一个无序的、唯一的字符串集合,不允许重复元素。
- 支持高效的集合运算:交集、并集、差集。
常用命令:
SADD key member(添加元素)SMEMBERS key(获取所有成员)SISMEMBER key member(判断是否在集合中)SINTER key1 key2(交集)、SUNION(并集)、SDIFF(差集)
典型应用场景:
- 标签系统:如文章的标签,一个文章对应多个标签
- 好友关系 / 共同关注:利用集合运算求共同好友
- 去重统计:统计 UV(独立访客)、防止重复提交
- 抽奖系统:随机抽取不重复用户
4. Hash(哈希表)——键值对的集合(类似 Map)
特点:
- 一个 Key 对应一个 Field-Value 的映射表(类似 JSON 对象或 Map)。
- 适合存储对象,比如用户信息、商品详情等。
- 支持单独操作某个字段,无需读取整个对象。
常用命令:
HSET key field value/HGET key fieldHMSET key field1 value1 field2 value2(批量设置)HGETALL key(获取所有字段和值)HDEL key field(删除某个字段)HKEYS key/HVALS key(获取所有字段 / 值)
典型应用场景:
- 对象存储:如用户信息
user:1 {name: 'Alice', age: 20} - 配置管理:存储一组相关的配置参数
- 缓存对象:替代多个 String Key,更节省空间、便于管理
5. Sorted Set(有序集合 / ZSet)——带权重的集合
特点:
- 一个 Key 对应一个有序的集合,每个元素都关联一个分数(score),根据 score 排序。
- 元素(member)具有唯一性,但 score 可以相同。
- 支持按照分数范围或排名范围查询,非常适合做排行榜。
常用命令:
ZADD key score member(添加元素及分数)ZRANGE key start stop [WITHSCORES](按排名正序获取)ZREVRANGE key start stop [WITHSCORES](按排名倒序获取,即从高到低)ZRANGEBYSCORE key min max(按分数范围查询)ZSCORE key member(获取某个元素的分数)ZCARD key(获取集合中元素总数)
典型应用场景:
- 排行榜:如游戏得分榜、热门文章排行
- 优先级队列:按权重处理任务
- 范围查询:如按时间范围获取热门内容
- 延迟队列 / 定时任务管理
三、其他高级数据结构(简要介绍)
6. Bitmap(位图)
- 基于 String 类型实现,通过位操作来记录布尔状态。
- 非常适合大规模状态的存储与统计,比如用户每日签到。
应用场景:
- 用户签到(每天一个 bit)
- 活跃用户统计
- 布隆过滤器基础
7. HyperLogLog
- 用于基数统计(即统计不重复元素的个数),例如统计 UV(独立访客数)。
- 占用空间极小,但有一定的误差(约 0.81%)。
应用场景:
- 统计页面 UV、广告点击去重数等大规模数据去重统计
8. Stream(流,Redis 5.0+)
- 类似消息队列,但功能更加强大,支持消息持久化、消费者组、ACK 机制。
- 适合做事件溯源、日志流、异步任务队列。
应用场景:
- 消息队列(比 List 更强大)
- 订单处理、支付流水
- 日志采集与处理
9. Geospatial(地理空间,Redis 3.2+)
- 用于存储地理位置(经纬度),支持计算两点间距离、范围查询等。
应用场景:
- 附近的人、地点搜索
- 地理围栏、配送范围判断
四、总结:Redis 数据结构与适用场景速查表
|
数据结构 |
类型关键词 |
核心特点 |
典型应用场景 |
|---|---|---|---|
|
String |
key-value |
简单键值,支持多种数据类型和原子操作 |
缓存、计数器、分布式锁、配置 |
|
List |
key-list |
有序、可重复,支持两端操作 |
消息队列、最新动态、历史记录 |
|
Set |
key-set |
无序、唯一,支持集合运算 |
标签、好友关系、去重、抽奖 |
|
Hash |
key-hash |
类似 Map,存储 field-value 对 |
用户信息、对象存储、配置项 |
|
Sorted Set (ZSet) |
key-zset |
带分数排序,唯一成员 |
排行榜、优先级队列、范围查询 |
|
Bitmap |
key-bit |
位操作,高效存储布尔值 |
签到、状态统计 |
|
HyperLogLog |
key-hll |
基数统计,低内存高效率 |
UV 统计、大规模去重估算 |
|
Stream |
key-stream |
消息流,支持消费者组 |
消息队列、事件流、日志处理 |
|
Geo |
key-geo |
地理坐标与距离计算 |
附近的人、地理围栏 |

984

被折叠的 条评论
为什么被折叠?



