字节面试,Redis 的 ZSET 怎么实现的?

本文详细阐述Redis的五大数据类型(String, List, Hash, Set, SortedSet)及六种底层数据结构(字符串、链表、压缩列表、哈希表、跳跃表和整数数组),并重点介绍ZSet的两种实现方式。应用实例涵盖排行榜和优先级队列。
摘要由CSDN通过智能技术生成

Redis的数据类型和数据结构

Redis有五种数据类型,String(字符串)、List(列表)、Hash(哈希)、Set(集合)和Sorted Set(有序集合)。

Redis的底层数据结构有6种,分别是简单动态字符串、双向链表、压缩列表、哈希表、跳表和整数数组。

ZSet的实现

ZSet 有两种不同的实现,分别是 ziplist 和 skiplist。

  • ziplist:满足以下两个条件[value,score] 键值对数量少于 128 个每个元素的长度小于 64 字节
  • skiplist:不满足以上两个条件时使用跳表、组合了 hash 和 skiplisthash 用来存储 value 到 score 的映射,这样就可以在 O(1) 时间内找到 value 对应的分数skiplist 按照从小到大的顺序存储分数skiplist 每个元素的值都是 [value,score] 对。

压缩列表(Ziplist)

跳跃表(Skiplist)

skiplist本质上是并行的有序链表,但它克服了有序链表插入和查找性能不高的问题,跳跃表中查询、插入任意数据的时间复杂度都是 O(logn)

应用场景

1、 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

2、用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值