跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist)

2023-11-09

跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist)都是Redis底层重要的数据结构。

跳跃列表(skipList)

Redis使用跳跃表作为有序集合键的底层实现之一,通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的,如果一个有序集合包含的元素数量比较多,
又或者有序集合中元素的成员(member)是比较长的字符串时,Redis就会使用跳跃表来作为有序集合键的底层实现。
Redis只在两个地方用到了跳跃表,
一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外,跳跃表在Redis里面没有其他用途。

C语言代码实现:

typedef struct zskiplistNode {
	//用于存储字符串类型的数据
    robj *obj;
    //用于存储排序的分值
    double score;
    //回退指针
    struct zskiplistNode *backward;
    struct zskiplistLevel {
    	//前进指针
        struct zskiplistNode *forward;
        //跨度
        unsigned int span;
    } level[];
} zskiplistNode;

压缩列表(zipList)

压缩列表本质上就是一个字节数组,是Redis为了节约内存而设计的一种线性数据结构,可以包含多个元素,每个元素可以是一个字节数组或一个整数。Redis的有序集合、散列和列表都直接或者间接使用了压缩列表。

当有序集合或散列表的元素个数比较少,且元素都是短字符串时,Redis便使用压缩列表作为其底层数据存储结构。当元素数量大于128个,所有元素长度大于64字节时,Redis使用快速链表(quicklist)数据结构存储,而快速链表就是双向链表与压缩列表的组合。

快速列表(quicklist)

快速列表是Redis中List的底层数据结构,它实质上是双向链表与压缩列表的组合,每个节点的实际数据存储结构为ziplist。这种结构的主要优势在于节省存储空间,同时也保证了数据读写性能。

C语言代码实现

typedef struct quicklist{
	quicklistNode *head;
	quicklistNode *tail;
	unsigned long count;//快速列表中元素总数
	unsigned long len;//快速列表中Node(节点)个数
	int fill : 16;//每个quicklistNode中ziplist长度
}quicklist;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist) 的相关文章

  • 无法启动redis.service:单元redis-server.service被屏蔽

    我在 ubuntu 16 04 上安装了 Redis 服务器 但是当我尝试使用启动redis服务时 sudo systemctl start redis 我收到消息 Failed to start redis service Unit re
  • 使用 Redis 命令 incr 和 expire 时的竞争条件

    根据redis文档 http redis io commands incr http redis io commands incr 在段落模式 速率限制器 2 较短的版本代码 value INCR ip IF value 1 THEN EX
  • socket.io 广播功能 & Redis pub/sub 架构

    如果有人能帮助我解决一个小疑问 我将不胜感激 使用socket io广播功能和在Redis上使用pub sub设计架构有什么区别 例如 在另一个示例中 node js 服务器正在侦听 socket io 针对 键 模型 todo 和值 数据
  • 有没有办法在 ruby​​ 中重新定义 []=+

    我正在尝试编写一个简单的 DSL 针对 Redis 并且我想自己定义 I have def key val redis zadd name val key end 我想定义 def key val redis zincrby name va
  • Redis发布/订阅:查看当前订阅了哪些频道

    我目前有兴趣查看我拥有的 Redis 发布 订阅应用程序中订阅了哪些频道 当客户端连接到我们的服务器时 我们将它们注册到如下所示的通道 user user id 这样做的原因是我希望能够看到谁 在线 目前 我在不知道客户端是否在线的情况下盲
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • docker-compose:容器之间的 Redis 连接被拒绝

    我正在尝试设置一个 docker compose 文件 该文件旨在替换运行多个进程 RQ 工作线程 RQ 仪表板和 Flask 应用程序 的单个 Docker 容器解决方案导师 http supervisord org 主机系统是 Debi
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • ServiceStack.Redis:无法连接:sPort:

    我经常得到 ServiceStack Redis 无法连接 sPort 0 或 ServiceStack Redis 无法连接 sPort 50071 或其他端口号 当我们的网站比较繁忙时 就会出现这种情况 Redis 本身看起来很好 CP
  • 为什么单个 Redis 实例不是线程安全的?

    https github com xetorthio jedis wiki Getting started https github com xetorthio jedis wiki Getting started 在多线程环境中使用Jed
  • Web API 缓存 - 如何使用分布式缓存实现失效

    我有一个 API 目前不使用任何缓存 我确实有一个正在使用的中间件 它可以生成缓存标头 Cache Control Expires ETag Last Modified 使用https github com KevinDockx HttpC
  • 如何在Redis中正确存储图片?

    决定将图像存储在Redis中 如何正确执行 现在我这样做 redis gt set image path here is the base64 image code 我不确定这是否正常 将图片存储在Redis中是完全可以的 Redis 键和
  • 如何通过ARM模板输出返回Redis的primaryKey?

    我正在尝试借助下面列出的 ARM 模板来部署 Redis 然后返回其主密钥 Azure 门户中 Redis 的 访问密钥 gt 主 下可用的秘密字符串 但是 我从管道 AzureResourceManagerTemplateDeployme
  • Redis 是否使用用户名进行身份验证?

    我已经在我的环境中设置了Redis 并且只看到了通过密码授权的部分 有没有办法也设置用户名 还是只能通过密码验证 Redis 6 上有 ACL 这些都有一个用户名 查看https redis io topics acl https redi
  • 无法使用 ASP.NET 会话状态提供程序连接到 Redis 服务器

    一段时间以来 我一直在尝试用 Redis 替换 ASP NET Session 多个小时与适用于 Redis 的 Microsoft ASP NET 会话状态提供程序 http blogs msdn com b webdev archive
  • nginx/uwsgi 服务器的持久内存中 Python 对象

    我怀疑这是否可能 但这是问题和提出的解决方案 提出的解决方案的可行性是这个问题的对象 我有一些需要可用于所有请求的 全局数据 我将这些数据保存到 Riak 并使用 Redis 作为缓存层以提高访问速度 目前 数据被分为约 30 个逻辑块 每
  • 在 Redis 中存储 IP 范围

    我有很多不同提供商的 IP 范围 例如 P1 192 168 1 10 192 168 1 50 192 168 2 16 192 168 2 49 P2 17 36 15 34 17 36 15 255 P3 我将此 IP 转换为 int
  • 如何在Redis中使用HSCAN命令?

    我想在我的作业中使用 Redis 的 HSCAN 命令 但我不知道它是如何工作的 Redis 的官方页面 http redis io commands hscan http redis io commands hscan 这个命令给了我空白

随机推荐

  • W2NER详解

    论文 https arxiv org pdf 2112 10070 pdf 代码 https github com ljynlp W2NER 文章目录 W2NER 介绍 模型架构 解码 源码介绍 数据输入格式 模型代码 参考资料 W2NER
  • jvm学习笔记_简单了解jvm

    一 基本概念 JVM 是可运行 Java 代码的假想计算机 包括一套字节码指令集 一组寄存器 一个栈 一个垃圾回收 堆 和 一个存储方法域 JVM 是运行在操作系统之上的 它与硬件没有直接的交互 二 运行过程 我们都知道java源文件 通过
  • java调用天地图api获取地理信息

    目录 1 注册账号登录 2 创建应用 获取key 3 查看接口示例 4 调用接口 4 1地理编码查询 4 2逆地理编码查询 天地图网址 天地图API 1 注册账号登录 2 创建应用 获取key 3 查看接口示例 4 调用接口 4 1地理编码
  • ctfshow web入门 web14

    根据题目提示查看源代码 发现编辑器路径 在url中输入 editor得到 点击文件上传发现文件空间可能有内容 editor attached file var www html nothinghere fl000g txt 访问 fl000
  • WSL2安装图形化界面

    文章目录 安装图形化界面 安装图形化界面 由于WSL2 Ubuntu默认不安装图形化界面 所以需手动安装 apt get install xfce4 使用windows powershell 查看WSL使用的IP地址 ipconfig 进入
  • vant list加载 empty空状态

  • 时序预测

    时序预测 MATLAB实现基于均方误差节点搜索优化BP神经网络的时间序列预测 多指标评价 多节点计算 目录 时序预测 MATLAB实现基于均方误差节点搜索优化BP神经网络的时间序列预测 多指标评价 多节点计算 预测效果 基本介绍 模型描述
  • python协程

    协程是实现并发编程的一种方式 一说并发 你肯定想到了多线程 多进程模型 没错 多线程 多进程 正是解决并发问题的经典模型之一 最初的互联网世界 多线程 多进程在服务器并发中 起到举足轻重的作用 随着互联网的快速发展 你逐渐遇到了 C10K
  • aviator表达式教程

    Aviator是一个轻量级 高性能的Java表达式执行引擎 它动态地将表达式编译成字节码并运行 特性包括 支持绝大多数运算操作符 包括算术操作符 关系运算符 逻辑操作符 位运算符 正则匹配操作符 三元表达式 支持操作符优先级和括号强制设定优
  • 微信小程序开发前端基础知识

    文章目录 一 简介 1 是什么 2 为什么 二 准备工作 1 环境准备 1 1 注册账号 1 2 获取APPID 1 3 开发工具 2 创建微信小程序 三 组件 1 目录及其作用介绍 2 页面操作 3 view 块级元素 4
  • Oracle Calendar

    声明 本文为转载 如果有侵犯知识版本 请通知本人 本人将即刻停止侵权行为 参考网址 http code geekinterview com oracle oracle calendar sql html 1 SELECT Initcap T
  • ROS:bag数据包内容提取——雷达点云数据和imu数据

    通常在利用ros采集传感器数据时 我们会得到一个包含多个传感器数据的bag数据包 下面将会介绍从bag数据包提取雷达点云数据和imu数据的方法 系统版本 Ubuntu20 04 ROS版本 Noetic 先觉条件 查看bag数据包中雷达点云
  • Python爬虫从入门到精通:(17)协程_Python涛哥

    协程 本节的概念需要重点理解和实际操作 我们需要安装asynico库 pip install asyncio 学习之前我们先来看下这段代码 import time def get request url print 正在请求的url url
  • nginx---四层七层代理

    理论部分 所谓四层负载均衡 也就是主要通过报文中的目标地址和端口 再加上负载均衡设备设置的服务器选择方式 决定最终选择的内部服务器 它一般走的是tcp udp协议 所谓七层负载均衡 也称为 内容交换 也就是主要通过报文中的真正有意义的应用层
  • 2022年4月23日第十三届省赛蓝桥杯真题答案_python_第五题_统计未被污染的海域

    第五题如约而至哈 和第六题差不多 但比第六题简单 好 上题目 题目 有一片海域划分为N M个方格 其中有些海域已被污染 用0表示 有些海域没被污染 用1表示 请问这片N M海域中有几块是没被污染的独立海域 没被污染的独立海域是指该块海域上下
  • Obsidian流程图

    下载的obsidian进行安装时自动在C盘建立文件夹 但是该文件夹大小不大 关于在obsidian中安装插件 参考以下文章进行操作 https zhuanlan zhihu com p 403001135 我自己弄mermaid这个插件时
  • CSDN不再更新,后续文章在掘金发布

    掘金地址 方大可的主页
  • 用手机版python爬虫_Python爬虫也能用手机进行抓包?没错!这个技巧我只告诉你...

    今天要说说怎么在我们的手机抓包 我们知道了 HTTP 的请求方式 以及在 Chrome 中摸清了一些套路 但是 除了对数据进行解析之外 有时候我们想 对请求的数据或者响应的数据进行篡改 怎么做呢 我们经常在用的手机 手机里面的数据 怎么对它
  • Memcached 学习笔记(三)——多节点测试

    Memcached 学习笔记 三 多节点测试 一 启动两个 或者多个 节点 memcached d p 11212 u nobody c 1024 m 64 memcached d p 11213 u nobody c 1024 m 64
  • 跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist)

    跳跃列表 skipList 压缩列表 zipList 和快速列表 quicklist 都是Redis底层重要的数据结构 跳跃列表 skipList Redis使用跳跃表作为有序集合键的底层实现之一 通过在每个节点中维持多个指向其他节点的指针