【Redis】细说Redis之zset底层数据结构

简介: 面试官:有了解过Redis中zset数据结构底层是怎样实现的吗?没有是吧,没关系,那感谢参加今天的面试哈。

Redis相关文章


zset | socreset

Redis中的Set结构与Java中的HashSet如出一辙,可一看做一个value为null的HashTable,本质上也是通过Hash表实现去重。


ZSet或者叫SocreSet,是基于set数据结构基础之上增加score属性并按score排序的数据结构。因为可排序且元素不重复的特性通常用作排行榜等功能。


本质上是依赖两个核心数据结构,ziplist压缩链表skiplist跳跃链表实现。


ziplist

  • ziplist本质上是字节数组,每个元素可以是一个字节数组或一个整数。占用一块完整的内存,空间连续,避免内存碎片,节省内存
  • 对值存储采用变长形式,根据大小调整存储字节大小


  • 基础结构
  1. zlbytes:记录整个ziplist的大小。
  2. zltail:ziplist开始指针与最后一个entry之间的偏移量,通过该偏移量可以获得最后一个entry。
  3. zllen:entry数量。
  4. entry:存储具体数据的节点。
  • prelen:上一个entry的大小。
  • encoding:记录content的类型以及长度。
  • content:一个整形或者字节数组。
  1. zlend:ziplist结尾标识。


image.png

  • 总结
  • 本质为占用一段完整内存字节数组,空间连续避免内存碎片
  • 每个节点通过保存特殊节点位置实现双向链表特性
  • 新增元素可能会引起连锁更新(类似数组,引发后续下标变动)



skiplist

  • 本质上由Node节点构造成的多层链表结构,每层都是有序链表,最底层包含所有元素,上下层元素比例约为1:2
  1. 通过空间换时间的思想,在原有的有序链表中增加多级索引,每个元素包含多指针,指针个数通过"丢硬币"的方式实现基本满足二分概率1/2,每丢一次指针个数+1,指向下一层的元素,直到扔到反面为止
  2. 新增删除操作需要把后面的节点都更新一遍
  3. redis为什么使用跳表而不是用红黑树
  1. 内存占用更少,自定义参数化决定使用多少内存
  2. 查询性能至少不比红黑树差
  3. 简单更容易实现和维护

image.png


总结

  1. 基于ziplist或skiplist
  2. 符合以下条件使用ziplist
  1. 服务器属性server.zset_max_ziplist_entries 的值大于 0
  2. 元素的member长度(成员长度)小于服务器属性server.zset_max_ziplist_value的值(默认64)
  1. 不符合使用skiplist


相关文章
|
8月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
483 86
|
8月前
|
存储 消息中间件 NoSQL
Redis数据结构:别小看这5把“瑞士军刀”,用好了性能飙升!
Redis提供5种基础数据结构及多种高级结构,如String、Hash、List、Set、ZSet,底层通过SDS、跳表等实现高效操作。灵活运用可解决缓存、计数、消息队列、排行榜等问题,结合Bitmap、HyperLogLog、GEO更可应对签到、UV统计、地理位置等场景,是高性能应用的核心利器。
|
8月前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
262 12
|
8月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
存储 NoSQL 算法
Redis之zset实现滑动窗口限流
Redis之zset实现滑动窗口限流
2549 0
Redis之zset实现滑动窗口限流
|
12月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
7月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
786 25
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1567 0
|
8月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
351 1
Redis专题-实战篇二-商户查询缓存
|
7月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
1371 3