上一篇
📢 最新动态(2025-08)
Redis Labs 近期优化了 ZSET
和 Hash
的存储结构,使得层级数据的查询效率提升 30%,特别适合社交网络、评论系统、文件目录等树形数据场景!
树结构在业务中无处不在:
传统关系型数据库(如MySQL)存储树形数据时,递归查询效率低,而 Redis 凭借内存存储+灵活数据结构,能轻松应对高频读写需求!
用 Hash
存储节点,parent_id
维护父子关系:
# 存储节点 HSET node:1 name "根节点" parent_id "" HSET node:2 name "技术部" parent_id "1" HSET node:3 name "产品部" parent_id "1" # 查询子节点 HSCAN node:* MATCH * parent_id 1 # 找父ID=1的所有子节点
✅ 优点:结构简单,修改灵活
❌ 缺点:查询子树需全表扫描,不适合深层树
用 ZSET
维护排序,String
存储路径(如 1:2:3
表示层级):
# 存储节点路径 SET node:1:path "1" SET node:2:path "1:2" SET node:3:path "1:2:3" # 查询所有子节点(用ZSET按路径范围查询) ZADD tree 0 "1" 1 "1:2" 2 "1:2:3" ZRANGEBYLEX tree "[1:" "(1;\xff" # 获取节点1的所有子孙
✅ 优点:查询子树速度快(O(log N))
❌ 缺点:移动节点需更新所有子孙路径
用 Set
存储所有祖先-后代关系:
# 记录直接关系 SADD node:1:children 2 3 SADD node:2:children 4 # 记录闭包关系(1是2的祖先,2是4的祖先...) SADD node:1:descendants 2 3 4 SADD node:2:descendants 4
✅ 优点:查询任意关系极快(O(1))
❌ 缺点:写入成本高,占用内存大
实战推荐! 结合多种结构:
# 1. Hash存节点详情 HSET node:1 name "CEO" level 0 # 2. ZSET维护层级排序 ZADD tree:level 0 1 1 2 1 3 # 节点1在0级,节点2/3在1级 # 3. Set存父子关系 SADD node:1:children 2 3
✅ 优点:平衡读写效率,支持快速层级跳转
❌ 缺点:实现略复杂
1:2:3
→ 1|2|3
) TTL
避免内存膨胀 # 用ZSET按分类深度排序 ZADD categories 0 "电子产品" 1 "手机" 2 "智能手机" # 用户点击"手机"时,返回所有子类 ZRANGE categories 2 3 BYSCORE # 返回"智能手机"
# 用Hash存评论,Set存回复链 HSET comment:1001 user "Alice" text "Redis真香!" SADD comment:1001:replies 1002 1003 # 子评论ID
方案 | 适用场景 | 查询速度 | 写入成本 |
---|---|---|---|
嵌套Hash | 小规模静态树 | ||
路径枚举 | 深层树查询 | ||
闭包表 | 频繁关系判断 | ||
混合模式 | 综合高频读写 |
🚀 选择建议:
快试试用Redis驯服你的树形数据吧! 🌲✨
本文由 帖宏毅 于2025-08-08发表在【云服务器提供商】,文中图片由(帖宏毅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/564768.html
发表评论