天增的博客
首页
博客
  • 分布式解决方案
  • Java并发工具包
  • redis
  • LeetCode
  • 系统设计
  • JVM体系
Github (opens new window)
Rss (opens new window)
  • zh-CN
  • en-US
首页
博客
  • 分布式解决方案
  • Java并发工具包
  • redis
  • LeetCode
  • 系统设计
  • JVM体系
Github (opens new window)
Rss (opens new window)
  • zh-CN
  • en-US
  • redis
  • Redis为什么这么快
    • redis单线程的问题
  • Redis基本数据结构
    • String的底层实现
    • List的底层实现
    • Hash的底层实现
    • Set的底层实现
    • ZSet的底层实现
      • 优缺点
  • Redis分布式缓存
    • 缓存击穿
    • 缓存穿透
    • 缓存雪崩
    • 缓存预热
  • Redis的分布式锁
    • 看门狗模式
    • Redlock
  • Redis集群
    • Redis数据淘汰策略
    • redis持久化
    • Redis数据删除策略
  • topic
  • redis
  • Redis基本数据结构
  • ZSet的底层实现
2022-04-28
目录

ZSet的底层实现

# ZSet的底层实现

当有序集合中包含的元素数量超过服务器属性

zset_max_ziplist_entries 的值(默认值为 128 ),

或者 有序集合中新添加元素的 member 的长度大于服务器属性

zset_max_ziplist_value 的值(默认值为 64 )时,

redis会使用 跳跃表 作为有序集合的底层实现。

否则会使用ziplist作为有序集合的底层实现

# 跳表是什么?

跳表 = 链表 + 多级索引.

skiplist是一种以空间换取时间的结构。 时间复杂度O(logN),空间复杂度O(n);

由于链表,无法进行二分查找,因此借鉴数据库索引的思想,提取出链表中关键节点(索引),先在关键节点上查找,再进入下层链表查找。

提取多层关键节点,就形成了跳跃表.

# 优缺点

只有在 数据量较大的情况下 才能体现出来优势。 而且应该是 读多写少的情况下 才能使用,所以它的适用范围应该还是比较有限的

维护成本相对要高, 新增或者删除时需要把所有索引都更新一遍;

最后在新增和删除的过程中的更新,时间复杂度也是O(log n)

最近更新
01
以 root 身份启动 transmission-daemon
12-13
02
Debian系统安装qbittorrent-nox
12-09
03
LXC Debain12安装zerotier并实现局域网自动nat转发
07-29
更多文章>
Theme by Vdoing | Copyright © 2015-2024 天增 | 苏ICP备16037388号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式