管理杂谈OA答疑ERP答疑教程搜索

Redis 九大数据结构:从原理到实战场景








前言


提到 Redis 的数据结构,很多人第一反应是 String、List、Hash、Set、Sorted Set 这五种。但在实际企业级应用中,Redis 还提供了另外四种强大的扩展数据结构,它们在某些特定场景下能发挥奇效。


本文系统梳理 Redis 的九大数据结构,包括 5种核心结构 + 4种扩展结构,重点剖析每个结构的特点、底层实现以及在真实业务中的应用场景。这不仅是一篇技术分享,也是我自己的复习笔记,希望能帮助你在实际项目中做出更合适的数据结构选型。



Redis 数据结构


Redis 之所以被称为“数据结构服务器”,正是因为它提供了丰富的数据结构,远超简单的键值存储。这九种数据结构可以分为两类:


类别数据结构核心特点
核心结构String、List、Hash、Set、Sorted Set基础通用,覆盖大多数场景
扩展结构Bitmap、HyperLogLog、GEO、Stream针对特定场景的极致优化

下面我们逐一深入讲解。


五大核心数据结构


String(字符串)


String 是 Redis 中最基础的数据结构,也是新手最先接触的。它不仅能存文本,还能存整数、JSON、甚至是二进制数据。



特点



常用命令


SETGETMSETMGETINCRDECRSETNX



实际业务场景

① 常规缓存:存储 Session 信息、用户 Token


SET user:1000 '{"id":1000,"name":"张三"}' EX 3600

② 计数器:利用 INCR 原子性实现阅读数、点赞数、库存扣减


INCR article:readcount:1001        # 阅读数+1
DECR product:stock:2001 # 扣减库存

③ 分布式锁:利用 SET NX EX 实现简单的分布式锁


SET lock:order_001 "thread_id" NX EX 10

Hash(哈希)


Hash 是一个 String 类型的 Field 和 Value 的映射表,非常适合存储对象。你可以把它想象成 Python 的字典或 Java 的 HashMap。



特点



常用命令


HSETHGETHGETALLHINCRBYHDELHEXISTS



实际业务场景

① 购物车:以用户ID为Key,商品ID为Field,商品数量为Value


HSET cart:user_1001 sku_2001 2
HINCRBY cart:user_1001 sku_2001 1 # 数量+1

② 用户会话管理:存储用户登录态、最后活跃时间等


HSET user:session:1001 username "张三" last_login "2025-12-09" cart_items 5

③ 对象存储:存储用户信息、配置信息等


HSET user:1001 name "张三" age 25 city "北京"

List(列表)


List 是一个双向链表结构,支持从两端压入或弹出元素。它是有序的,元素可以重复。



特点


常用命令

LPUSHRPUSHLPOPRPOPLRANGEBLPOPBRPOP



实际业务场景

① 轻量级消息队列:利用 LPUSH + BRPOP 实现生产者-消费者模型


# 生产者
LPUSH task_queue "send_email_123"
# 消费者(阻塞等待)
BRPOP task_queue 0

② 最新动态/消息流:例如微博的最新评论列表


LPUSH news:latest "news_id_1001"
LTRIM news:latest 0 99 # 保持最新100条
LRANGE news:latest 0 9 # 获取最新10条

③ 栈和队列



 Set(集合)


Set 是一个无序的、自动去重的字符串集合。底层基于哈希表实现。



特点


常用命令

SADDSREMSMEMBERSSISMEMBERSINTERSUNION



实际业务场景

① 标签系统:给文章打标签,或给用户打兴趣标签


SADD article:1001:tags "Java" "Redis" "微服务"
SADD tag:Java:articles 1001 1002 1003
# 找出同时有Java和Redis标签的文章
SINTER tag:Java:articles tag:Redis:articles

② 社交关系(共同好友):利用交集计算共同好友


SADD user:1001:friends 1002 1003 1004
SADD user:1002:friends 1001 1003 1005
SINTER user:1001:friends user:1002:friends # 返回 {1003}

③ 抽奖系统:利用 SRANDMEMBER 随机抽取


SADD lottery:20251225 user_1001 user_1002 user_1003
SRANDMEMBER lottery:20251225 1 # 随机抽1人(不删除)
SPOP lottery:20251225 1 # 随机抽1人(删除)

Sorted Set(有序集合,ZSet)


这是 Redis 中最“高级”的数据结构,在 Set 的基础上给每个元素关联了一个分数(score),内部通过跳表(Skip List)实现排序。



特点


常用命令

ZADDZRANGEZREVRANGEZINCRBYZRANKZRANGEBYSCORE



实际业务场景

① 排行榜:这是 ZSet 最经典的场景


ZADD leaderboard:game 5000 "player1" 4500 "player2" 4800 "player3"
ZREVRANGE leaderboard:game 0 2 WITHSCORES # 获取TOP3
ZINCRBY leaderboard:game 100 "player1" # player1加分

② 延迟队列:利用 Score 存储执行时间戳


# 添加延迟任务(当前时间戳+30秒后执行)
ZADD delayed_queue <timestamp+30> "order_1001"
# 定时任务轮询:获取到期的任务
ZRANGEBYSCORE delayed_queue 0 <current_timestamp>


四大扩展数据结构


Bitmap(位图)


Bitmap 不是一种全新的数据结构,它实际上是基于 String 的位级操作,将每个 bit 位作为独立的存储单元。



特点


常用命令

SETBITGETBITBITCOUNTBITOPBITPOS



实际业务场景

① 用户签到:以用户ID为偏移量,签到记为1


SETBIT sign:2025:12:user:1001 9 1        # 12月9日签到(偏移量从0开始)
BITCOUNT sign:2025:12:user:1001 # 统计当月签到天数

② 活跃用户统计:每天一个 Bitmap,用户登录则标记


SETBIT active:2025-12-09 1001 1          # user_id=1001 今日活跃
BITOP AND active_7days active:2025-12-03 ... # 统计连续7天活跃用户

③ 布隆过滤器底层:实现简单的去重机制


HyperLogLog(基数统计)


HyperLogLog 是一种概率性数据结构,用于估算集合的基数(唯一元素个数),以极小的内存消耗换取统计结果。



特点


常用命令

PFADDPFCOUNTPFMERGE



实际业务场景

① UV 统计:统计页面独立访客数


PFADD uv:2025-12-09 "192.168.1.1" "192.168.1.2" "192.168.1.1"
PFCOUNT uv:2025-12-09 # 返回2

② 多日去重统计:合并多天的 UV 数据


PFMERGE uv:week1 uv:day1 uv:day2 uv:day3
PFCOUNT uv:week1 # 周去重UV

③ 亿级用户去重:如广告投放的曝光用户去重


如果用 Set 存储,1 亿用户 ID 需要 1GB+ 内存
用 HyperLogLog 只需 12KB,误差不到 1%

 注意:HyperLogLog 只适合近似统计,不能用于精确计数场景(如金额、库存)


Geospatial(地理空间)


GEO 是基于 Sorted Set 实现的,专门用于存储地理位置(经纬度)和计算距离。



特点


常用命令

GEOADDGEODISTGEORADIUSGEORADIUSBYMEMBER



实际业务场景

① 附近的人/店铺:基于位置推荐附近商家


GEOADD restaurants 116.397 39.908 "故宫店" 116.405 39.915 "王府井店"
GEORADIUS restaurants 116.40 39.91 5 km # 查询附近5公里内的店铺

② 打车/外卖场景:乘客叫车时查找附近司机


GEOADD drivers:online 116.397 39.908 "driver_1001"
GEORADIUS drivers:online 116.40 39.91 3 km # 查找3公里内的在线司机

③ 两地距离计算


GEODIST restaurants "故宫店" "王府井店" km   # 返回两地距离(公里)

Stream(消息流)


Stream 是 Redis 5.0 引入的数据结构,专为消息队列场景设计,提供了完整的消息持久化、消费者组和消息确认机制。



特点


常用命令

XADDXREADXREADGROUPXACKXINFO



实际业务场景

① 订单处理流水线:保证订单不丢失、可追溯


# 生产者:添加订单消息
XADD orders:* order_id 1001 user_id 2001 status "created"
# 消费者组:消费者1读取并处理
XREADGROUP GROUP order_workers consumer1 COUNT 1 STREAMS orders >


键命名规范:使用冒号分隔,如 业务名:表名:主键,例如 article:info:1001


警惕大Key:Hash 的 Field 过多、List 过长、ZSet 成员过多都可能导致 Redis 阻塞


选型优先原则:先用最匹配业务模型的数据结构,不要为了“省事”全用 String


内存与精度权衡:Bitmap 和 HyperLogLog 用极低内存解决特定问题,但要接受其局限性



转自https://blog.csdn.net/uybji/article/details/159694849


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn