redis 从0到1完整学习 (十二):RedisObject 之 List 类型

文章目录

  • 1. 引言
  • 2. redis 源码下载
  • 3. redisObject 管理 List 类型的数据结构
    • 3.1 redisObject 管理 List 类型
    • 3.2 List `PUSH` 源码
  • 4. 参考


1. 引言

前情提要:
《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》
《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》

上一节整体讲了 RedisObject 的数据结构,能灵活地处理不同类型和大小的数据,本文主要介绍 RedisObject 是如何管理 List 类型的数据结构的。

2. redis 源码下载

Redis 源码可以点击这里下载,方便查看其中定义的一些数据结构。
在这里插入图片描述

3. redisObject 管理 List 类型的数据结构

3.1 redisObject 管理 List 类型

在 redis 3.2版本之后,采用 QuickList 来实现 List 数据结构。参考 《redis 从0到1完整学习 (八):QuickList 数据结构》我们回顾下 QuickList 数据结构:
在这里插入图片描述
那么我们看下 RedisObject 是怎么管理 List 类型的数据结构:
在这里插入图片描述

ptr 指向的是 QuickList 结构体,QuickList 结合 ZipList 保存着正常的 List 数据,是不是很简单!

3.2 List PUSH 源码

还记得 redis 的 List 用法吗?参考这里 redis 从0到1完整学习 (三):redis 数据结构 的 List 用法,我们在 List 可以用 push、pop 命令,例如:

LPUSH myqueue item1  
RPOP myqueue

那么我们看下 LPUSH 这些命令在源码是怎么实现的:

void lpushCommand(client *c) {
    pushGenericCommand(c,LIST_HEAD);
}

void rpushCommand(client *c) {
    pushGenericCommand(c,LIST_TAIL);
}

这里都指向了pushGenericCommand 方法,所以我们来看下 pushGenericCommand 关键部分,我这里看的是 v6.0.0 的源码,不同版本可能稍微有差异,但是主体逻辑差异不大:

void pushGenericCommand(client *c, int where) {
    int j, pushed = 0;
    // 根据key来找缓存中的redisObject。
    // 例如 LPUSH key v1 v2:对应的argv从0开始,也就是LPUSH对应的是argv[0],key对应的是argv[1],v1对应的是argv[2],依次类推
    robj *lobj = lookupKeyWrite(c->db,c->argv[1]);
	// 判断redisObject的type是否为List,不是List需要报错!
    if (lobj && lobj->type != OBJ_LIST) {
        addReply(c,shared.wrongtypeerr);
        return;
    }
   	// 从argv[2]开始,表示开始遍历value
    for (j = 2; j < c->argc; j++) {
    	// List不存在,则需要创建List,创建的QuickList
        if (!lobj) {
            lobj = createQuicklistObject();
            quicklistSetOptions(lobj->ptr, server.list_max_ziplist_size,
                                server.list_compress_depth);
            dbAdd(c->db,c->argv[1],lobj);
        }
        // 将value push到List里
        listTypePush(lobj,c->argv[j],where);
        pushed++;
    }
	...
}

关键的部分的逻辑都在上面注解了,其实很好理解!

4. 参考

《redis 从0到1完整学习 (一):安装&初识 redis》
《redis 从0到1完整学习 (二):redis 常用命令》
《redis 从0到1完整学习 (三):redis 数据结构》
《redis 从0到1完整学习 (四):字符串 SDS 数据结构》
《redis 从0到1完整学习 (五):集合 IntSet 数据结构》
《redis 从0到1完整学习 (六):Hash 表数据结构》
《redis 从0到1完整学习 (七):ZipList 数据结构》
《redis 从0到1完整学习 (八):QuickList 数据结构》
《redis 从0到1完整学习 (九):SkipList 数据结构》
《redis 从0到1完整学习 (十):RedisObject 数据结构》
《redis 从0到1完整学习 (十一):RedisObject 之 String 类型》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/283187.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytest --collectonly 收集测试案例

pytest --collectonly 是一条命令行指令&#xff0c;用于在运行 pytest 测试时仅收集测试项而不执行它们。它会显示出所有可用的测试项列表&#xff0c;包括测试模块、测试类和测试函数&#xff0c;但不会执行任何实际的测试代码。 这个命令对于查看项目中的测试结构和确保所有…

千里马2023年终总结-android framework实战

背景&#xff1a; hi粉丝朋友们&#xff1a; 2023年马上就过去了&#xff0c;很多学员朋友也都希望马哥这边写个年终总结&#xff0c;因为这几个月时间都忙于新课程halsystracesurfaceflinger专题的开发&#xff0c;差点都忘记了这个事情了&#xff0c;今天特别花时间来写个bl…

思维链COT原理探究

要进行因果分析&#xff0c;需要把思维链中的不同元素拆解开来&#xff0c;然后通过控制变量实验&#xff0c;来研究不同元素对COT效果的影响。以下两篇论文的核心差异就在于: COT的变量拆解&#xff0c;以及控制变量的实验方式。 结合两篇论文的实验结论&#xff0c;可能导致…

【深度学习:Convolutional Neural Networks】卷积神经网络入门指南

卷积神经网络&#xff08;CNN&#xff09;是深度学习领域最引人注目的成就之一。自从LeCun等人在20世纪90年代初引入以来&#xff0c;CNN在图像处理、视频分析和自然语言处理等领域取得了显著的成就。在这篇博客中&#xff0c;我们将探讨CNN的基本原理、结构和一些实际应用案例…

实验3 vTPM相关

一、实验目的 1.了解vTPM原理和相关知识&#xff1b;2.创建具备vTPM的虚拟机&#xff1b;3.加深对可信计算技术的理解。 二、实验内容 安装seabios&#xff0c;libtpms&#xff0c;swtpm&#xff0c;qemu‐tpm&#xff1b;启动vTPM&#xff1b;安装虚拟机。 三、实验环境 …

2013年第二届数学建模国际赛小美赛B题寄居蟹进化出人类的就业模式解题全过程文档及程序

2013年第二届数学建模国际赛小美赛 B题 寄居蟹进化出人类的就业模式 原题再现&#xff1a; 寄居蟹是美国最受欢迎的宠物品种&#xff0c;依靠其他动物的壳来保护。剥去寄居蟹的壳&#xff0c;你会看到它柔软、粉红色的腹部卷曲在头状的蕨类叶子后面。大多数寄居蟹喜欢蜗牛壳&…

Unity Window安装包制作

Unity Window安装包制作 介绍一、RAR自解压方式1、找到Unity打包的可执行程序2.创建自解压文件3.配置设置4、最后点击确定等待压缩完成即可&#xff08;默认生成位置为你选中文件右键点击添加到压缩文件时的路径&#xff09; 二、Setup Factory工具安装制作Window安装包相关常用…

2023年成都市中等职业学校学生技能大赛“网络搭建及应用”赛项竞赛样卷

2023年成都市中等职业学校学生技能大赛 “网络搭建及应用”赛项竞赛样卷 &#xff08;总分1000分&#xff09; 目录 2023年成都市中等职业学校学生技能大赛 “网络搭建及应用”赛项竞赛样卷 网络建设与调试项目&#xff08;500分&#xff09; 服务器搭建与运维项目&#xff08;…

每日一题----删除指定数字

大家好今天是1月1号&#xff0c;我在这里祝大家元旦快乐&#xff0c;感谢大家的支持&#xff0c;新的一年我会更加努力。谢谢大家。&#xff01;&#xff01;&#xff01; 文章目录 目录 文章目录 题目演示 题⽬描述&#xff1a; 先输⼊10个整数存放在数组中&#xff0c;再输⼊…

华为云创新中心,引领浙南的数字化腾飞

编辑&#xff1a;阿冒 设计&#xff1a;沐由 县域经济是我国国民经济的重要组成部分&#xff0c;是推动经济社会全面发展的核心力量之一。在推进中国式现代化的征程中&#xff0c;县域经济扮演的角色也越来越重要。 毫无疑问&#xff0c;县域经济的良性发展&#xff0c;需要多方…

阿里后端实习一面面经

阿里后端实习一面面经 项目中使用到了es&#xff0c;es的作用&#xff1f; elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 es中的重要概念&#xff1f; 群集&#xff1a;一个或多个节点…

【HarmonyOs Arkts笔记】Arkts ForEach循环使用

说明 ForEach循环数组对象时 要指定对象的唯一标识 例如 id&#xff0c;否则只会显示第一个 State tabsList: object[] [{ name: 砍价活动, id: 1, icon: https://php-b2c.likeshop.cn/uploads/images/2022062414322367e6a5479.png },{ name: 拼团活动, id: 2, icon: https:…

Java循环高级(无限循环,break,continue,Random,逢七过,平方根,判断是否是质数,猜数字小游戏)

文章目录 1.无限循环概念&#xff1a;for格式&#xff1a;while格式&#xff1a;do...while格式&#xff1a;无限循环的注意事项&#xff1a; 2.条件控制语句break:continue: 3. Random使用步骤&#xff1a; 4. 逢七过5. 平方根6.判断是否为质数7. 猜数字小游戏 1.无限循环 概…

【形式语言与自动机/编译原理】CFG-->Greibach-->NPDA(3)

本文将详细讲解《形式语言与自动机》&#xff08;研究生课程&#xff09;或《编译原理》&#xff08;本科生课程&#xff09;中的上下文无关文法&#xff08;CFG&#xff09;转换成Greibach范式&#xff0c;再转成下推自动机&#xff08;NPDA&#xff09;识别语言是否可以被接受…

NXP实战笔记(三):S32K3xx基于RTD-SDK在S32DS上配置WDT配置

目录 1、WDT概述 2、SWT配置 2.1、超时时间&#xff0c;复位方式的配置 2.2、中断形式 1、WDT概述 SWT 编程模型只允许 32 位&#xff08;字&#xff09;访问。 以下任何尝试访问都是无效的: •非32位访问 •写入只读寄存器 •启用SWT时&#xff0c;将不正确的值写入SR…

10 个顶级的 OBS 录屏替代品知识分享

视频是任何商业沟通策略的关键。您可能希望共享和记录您的屏幕以显示工作流程、为客户创建有用的教程和资源&#xff0c;或增强组织的知识库。 或者&#xff0c;也许视频是您核心产品的一部分&#xff0c;而出色的视频录制软件对于您的业务、YouTube 频道或直播爱好来说是必需…

计算机基础面试题 |01.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【软件工程】融通未来的工艺:深度解析统一过程在软件开发中的角色

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 软件工程 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 统一过程&#xff08;Unified Process&#xff09; 介绍和解释&#xff1a; 应用&#xff1a; 优缺点&#xf…

使用docker轻量化部署snmp agent(SNMPv2访问)

文章目录 服务器环境说明单机部署&#xff08;非挂载conf文件版&#xff09;debian:buster-slim容器简介实现步骤创建Dockerfile创建SNMP配置文件 (snmpd.conf)构建Docker镜像运行Docker容器 注意补充复制容器文件到本地容器、镜像操作 单机部署&#xff08;挂载conf文件版&…

【SpringBoot】常用注解

RequestBody&#xff1a;自动将请求体中的 json 数据转换为实体类对象。 这个例子凑巧传入的json属性键名和User键名一致&#xff0c;可以直接使用User实体类对象&#xff0c;如果键名不一致则需要用一个Map 类接收参数&#xff1a; PutMapping("/update")public R…