返回顶部
首页 > 资讯 > 数据库 >redis使用skiplist跳表的原因解析
  • 302
分享到

redis使用skiplist跳表的原因解析

2024-04-02 19:04:59 302人浏览 八月长安
摘要

目录1.什么是skiplist跳表2.随机层数的计算3.Redis为什么要使用跳表1.什么是skiplist跳表 跳表是一种特殊的链表,特殊的点在于其可以进行二分查找。普通的链表要查找元素只能挨个遍历链表中的所有元素,而

1.什么是skiplist跳表

跳表是一种特殊的链表,特殊的点在于其可以进行二分查找。普通的链表要查找元素只能挨个遍历链表中的所有元素,而跳表则利用了空间换时间的策略,在原来有序链表的基础上面增加了多级索引,然后利用类似二分查找的思路来快速实现查找功能。跳表可以支持快速的查找,插入,删除等操作,时间复杂度为O(logn),空间复杂度为O(n)。

2.随机层数的计算

跳表在节点插入时候,会随机出一个层数,依靠这个随机数操作构建的多层链表结构,能保证一个比较好的查找性能。这个随机层数不是一个普通的服从均匀分布的随机数,具体的计算逻辑如下

1.首先,每个节点肯定都有第1层指针(每个节点都在第1层链表里)。
2.如果一个节点有第i层(i>=1)指针(即节点已经在第1层到第i层链表中),那么它有第(i+1)层指针的概率为p。
3.节点最大的层数不允许超过一个最大值,记为MaxLevel。

伪代码如下

randomLevel()
    level := 1
    // random()返回一个[0...1)的随机数
    while random() < p and level < MaxLevel do
        level := level + 1
    return level

randomLevel逻辑中包含有两个参数,一个是概率p,一个是最大层数MaxLevel。在redis的实现中,这两个参数分别为

p = 1/4
MaxLevel = 32

该部分内容来自于如下文档:

skiplist的算法性能分析

关于跳表本身更详细的讲解可以参考上述文档。

3.redis为什么要使用跳表

经常会有人问这个问题,redis中为什么要使用跳表?

这个问题,redis作者已经给出过明确答案

  1. They are not very memory intensive. It’s up to you basically. Changing parameters about the probability of a node to have a given number of levels will make then less memory intensive than btrees.
  2. A sorted set is often target of many ZRANGE or ZREVRANGE operations, that is, traversing the skip list as a linked list. With this operation the cache locality of skip lists is at least as Good as with other kind of balanced trees.
  3. They are simpler to implement, debug, and so forth. For instance thanks to the skip list simplicity I received a patch (already in Redis master) with augmented skip lists implementing ZRANK in O(log(N)). It required little changes to the code.

按照我自己的理解,稍微翻译一下就是
1.跳表不是非常吃内存,并且基本是取决于你自己。你可以通过改变参数p(第二部分中提到的),从而达到比btree消耗更少内存的目的。

2.redis中的zset结构经常会使用ZRANGE或者ZREVRANGE这种操作,这个时候遍历跳表就相当于遍历一个普通的链表。这种情况下,跳表的表现跟btree一样优秀。

3.很多人认为这一点是最重要的原因。跳表实现起来更容易,只需要一点点代码就能达到效果,修改起来也很方便。

到此这篇关于redis为什么要使用skiplist跳表的文章就介绍到这了,更多相关redis skiplist跳表内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: redis使用skiplist跳表的原因解析

本文链接: https://lsjlt.com/news/34350.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • redis使用skiplist跳表的原因解析
    目录1.什么是skiplist跳表2.随机层数的计算3.Redis为什么要使用跳表1.什么是skiplist跳表 跳表是一种特殊的链表,特殊的点在于其可以进行二分查找。普通的链表要查找元素只能挨个遍历链表中的所有元素,而...
    99+
    2024-04-02
  • php使用redis的原因
    这篇文章将为大家详细讲解有关php使用redis的原因,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、 Redis简介 redis是Nosql数据库中使用...
    99+
    2024-04-02
  • 使用Spring Boot的原因解析
    为什么要使用Spring Boot? 在使用Spring框架进行开发的过程中,需要配置很多Spring框架包的依赖,如spring-core、spring-bean、spring-c...
    99+
    2024-04-02
  • 使用redis的原因是什么
    这篇文章给大家分享的是有关使用redis的原因是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的...
    99+
    2024-04-02
  • Redis跳跃表的基本原理和实现
    目录一、概述二、跳跃表的实现2.1 跳跃表节点的zskiplisNode结构定义2.2 zskiplist结构的定义三、结束一、概述 跳跃表(skiplist)是一种有序数...
    99+
    2024-04-02
  • 用redis集群的原因
    小编给大家分享一下用redis集群的原因,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧! 为什么用redis集群?通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端...
    99+
    2024-04-02
  • redis使用Lua脚本解决多线程下的超卖问题及原因解析
    目录一.多线程下引起的超卖问题呈现二.使用Lua脚本解决多线程下超卖的问题以及为什么三.为什么使用Lua脚本就能解决多线程下的超卖问题呢?一.多线程下引起的超卖问题呈现 1.1.我先...
    99+
    2023-05-19
    redis多线程超卖 lua脚本解决超卖问题
  • Go语言struct要使用 tags的原因解析
    目录struct tags 的使用使用反引号避免使用空格避免重复使用标准化的 tag 名称多个 tag 值struct tags 的原理struct tags 的优势常用的 stru...
    99+
    2023-03-11
    Go 语言struct使用 tags struct tags 使用
  • 深入理解Oracle锁表原因分析
    深入理解Oracle锁表原因分析,需要具体代码示例 随着企业数据库规模的不断增长和复杂性的加深,数据库锁表问题逐渐成为数据库管理员以及开发人员需要面对和解决的重要挑战之一。在Oracl...
    99+
    2024-03-10
    分析 oracle 锁表原因 并发访问
  • 使用Redis做缓存的原因有哪些
    这篇文章给大家分享的是有关使用Redis做缓存的原因有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。对Redis,百度百科给出的的解释是“Redis(Remote Dicti...
    99+
    2024-04-02
  • Python使用pytest-playwright的原因分析
    目录1 用playwright能不能不用这个包?2 安装3 代码和文档4 示例代码5 结论pytest-playwright 是一个 Python 包,它允许您使用 Microsof...
    99+
    2023-03-02
    python使用pytest-playwright 使用pytest playwright
  • redis缓存延时双删的原因分析
    缓存为啥是删除,而不是更新? 如果是更新,存在分布式事务问题,可能出现修改了缓存,数据库修改失败的情况。只是删除缓存的话,就算数据库修改失败,下次查询会直接取数据库的数据,也不会出现脏数据。 延时双删是什么? 就是在增删...
    99+
    2022-08-16
    redis缓存延时双删 redis缓存延时
  • Redis内存碎片产生原因及Pipeline管道原理解析
    目录内存碎片内存碎片如何产生的?内存分配器怎么看是否有内存碎片?碎片率的意义?清理内存碎片低于4.0-RC3版本的Redis高于4.0-RC3版本的RedisPipeline管道为什么需要Pipeline原生批命令(ms...
    99+
    2023-03-23
    Redis内存碎片Pipeline管道 Redis Pipeline
  • java的类不要使用$的原因分析
    下面是在Java中标识符的定义在大多数人的理解中,Java标识符的定义规则如下。标识符由字母、数字、货币符号(¥、$等)、连接符号(_等)组成。(这里的字母为Unicode字符集, 而不再局限于传统的26个英文字母。)标识符的首字符可以是字...
    99+
    2015-12-16
    java基础 java
  • C++虚函数表的原理与使用解析
    目录前言1.虚函数表2.一般继承(无虚函数覆盖)3.一般继承(有虚函数覆盖)4.多重继承(无虚函数覆盖)5.多重继承(有虚函数覆盖)6.安全性6.1 通过父类型的指针访问子类自己的虚...
    99+
    2024-04-02
  • Redis的查询很快的原因解析及Redis如何保证查询的高效
    目录Redis如何保证高效的查询效率为什么Redis比较快Redis中的数据结构1、简单动态字符串2、链表3、字典4、跳表5、整数数组6、压缩列表为什么单线程还能很快基于多路复用的高...
    99+
    2024-04-02
  • 分布式选择使用redis的原因是什么
    分布式选择使用redis的原因是什么?可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,...
    99+
    2024-04-02
  • 大白话讲解调用Redis的increment失败原因及推荐使用详解
    大家在项目中基本都会接触到redis,在spring-data-redis-2.*.*.RELEASE.jar中提供了两个Helper class,可以让我们更方便的操作redis中...
    99+
    2024-04-02
  • vue使用fengMap速度慢的原因分析
    目录使用fengMap速度慢原因vue在使用中的一些小技巧1. 多图表resize事件去中心化2. 全局过滤器注册3. 全局组件注册4. 不同路由的组件复用5. 高阶组件6. 路由根...
    99+
    2024-04-02
  • C#入参使用引用类型要加ref的原因解析
    目录ref修饰入参的常用场景引用类型添加ref的作用是啥?总结摘一段来自官网的说明 :方法的参数列表中使用 ref 关键字时,它指示参数按引用传递,而非按值传递。 ref 关键字让形...
    99+
    2022-11-21
    c#引用类型加ref c#引用类型
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作