Redis常用数据结构解析:从原理到实战应用
作为一名开发者,我深知Redis在缓存、队列等场景中的重要性。但要用好Redis,必须对其核心数据结构有透彻理解。本文将结合我的实践经验,详细讲解Redis五种最常用的数据结构及其典型应用场景,帮助你在开发中游刃有余。
一、String(字符串):不只是简单的键值对
String是Redis最基础的数据结构,但它的能力常被低估。除了简单的SET/GET
,它还能实现:
- 计数器:
INCR article:1001:views
(文章阅读量统计) - 分布式锁:
SETNX lock:order 1 EX 30
(设置30秒过期时间) - 缓存对象:
SET user:1001 '{"name":"张三","age":28}'
(JSON序列化存储)
实战技巧:大文本(如HTML片段)建议压缩后存储,用SET user:1001:profile <compressed_data>
节省内存。
二、Hash(哈希):对象存储的首选
当需要存储对象属性时,Hash比String更高效:
HSET user:1001 name "张三" age 28 city "北京"
HGET user:1001 age # 获取单个字段
HGETALL user:1001 # 获取全部字段
典型场景:
- 用户画像存储(避免序列化/反序列化开销)
- 商品属性管理(
HSET product:1001 price 299 stock 50
)
注意:字段超过500个时,哈希表会转为更紧凑的编码方式,此时HGETALL
可能阻塞服务,建议用HSCAN
分批获取。
三、List(列表):实现消息队列与最新列表
List的双向链表特性使其非常适合顺序性场景:
LPUSH news:latest "2024大模型技术峰会" # 左侧插入
LRANGE news:latest 0 4 # 获取最新5条
RPOP order:queue # 右侧消费任务
应用案例:
- 消息队列(配合
BRPOP
实现阻塞式消费) - 朋友圈时间线(
LPUSH user:1001:timeline "新动态..."
) - 操作日志记录(固定长度列表保证日志量可控)
四、Set(集合):去重与关系运算利器
Set的唯一性和集合运算能力不可替代:
SADD article:1001:likes "user100" # 点赞
SISMEMBER article:1001:likes "user100" # 检查是否点赞
SINTER user:1001:follows user:1002:follows # 共同关注
高频使用场景:
- UV统计(自动去重)
- 标签系统(
SADD product:1001:tags "优惠"
) - 权限白名单(
SADD admin:whitelist "192.168.1.100"
)
五、ZSet(有序集合):排行榜的核心实现
通过score实现自动排序,是排行榜业务的标配:
ZADD leaderboard 95 "玩家A" # 添加分数
ZREVRANGE leaderboard 0 9 # TOP10玩家
ZSCORE leaderboard "玩家A" # 查询分数
经典案例:
- 电商热销榜(
ZINCRBY hot_products 1 "iPhone15"
) - 延迟队列(用时间戳作score,
ZRANGEBYSCORE
轮询) - 地理位置附近的人(GeoHash转score存储)
结语:选择数据结构的黄金法则
- 读多写少用String缓存
- 对象属性优先选Hash
- 顺序访问场景用List
- 需要去重时必用Set
- 排序需求直接上ZSet
理解这些数据结构的底层实现(如Hash的ziplist优化、ZSet的跳表+哈希表),能让你在面试中脱颖而出。建议用OBJECT ENCODING key
命令观察不同数据量下的编码变化,这对性能调优至关重要。
你的Redis使用场景是什么?欢迎在评论区分享实战经验!