博客园不常在线

有问题联系微信

微信号

微信公众号

Redis系列(十二):数据结构SortedSet跳跃表中基本操作命令和源码解析

1.SkipList

Redis的sortedSet数据结构是有序不重复的(索引为唯一的,数据(score)却可以重复),

跳表是redis的一个核心组件,也同时被广泛地运用到了各种缓存地实现当中,它的主要优点,

就是可以跟红黑树、AVL等平衡树一样,做到比较稳定地插入、查询与删除。理论插入查询删除的算法时间复杂度为O(logN)。

 

 2.什么是跳表

链表,相信大家都不陌生,维护一个有序的链表是一件非常简单的事情,我们都知道,在一个有序的链表里面,查询跟插入的算法复杂度都是O(n)。

我们能不能进行优化呢,比如我们一次比较两个呢?那样不就可以把时间缩小一半?同理,如果我们4个4个比,那不就更快了?

跳表就是这样的一种数据结构,结点是跳过一部分的,从而加快了查询的速度。跳表跟红黑树又有什么差别呢?

既然两者的算法复杂度差不多,

 

 

为什么Redis要使用跳表而不使用红黑树呢?

跳表相对于红黑树,主要有这几个优点:1.代码相对简单,手写个跳表还有可能,

手写个红黑树试试?2.如果我们要查询一个区间里面的值,用平衡树可能会麻烦。这里的麻烦指的是实现和理解上,

平衡二叉树查询一段区间也是可以做到的。3.删除一段区间,这个如果是平衡二叉树,就会相当困难,毕竟设计到树的平衡问题,而跳表则没有这种烦恼。

好了,相信你对跳表已经有一些认识了,我们来简单介绍平衡二叉树的几个基本操作。

2.源码分析

复制代码
#include<stdio.h>

#include<stdlib.h>

 

#define ZSKIPLIST_MAXLEVEL 32

#define ZSKIPLIST_P 0.25

#include <math.h>

 

//跳表节点

typedef struct zskiplistNode {

    int key;

    int value;

    struct zskiplistLevel {

        struct zskiplistNode *forward;

    } level[1];

} zskiplistNode;

 

//跳表

typedef struct zskiplist {

    struct zskiplistNode *header;

    int level;

} zskiplist;
复制代码

 

posted @   Code技术分享  阅读(634)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示