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]开始,表示开始遍历valuefor (j = 2; j < c->argc; j++) {// List不存在,则需要创建List,创建的QuickListif (!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 类型》

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1&#xff09;索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2&#xff09;查询语句较烂 3&#xff09;关联查询太多join&a…

边缘计算网关在温室大棚智能控制系统应用,开启农业新篇章

项目需求 ●目前大棚主要通过人为手动控温度、控水、控光照、控风&#xff0c;希望通过物联网技术在保障产量的前提下&#xff0c;提高作业效率&#xff0c;降低大棚总和管理成本。 ●释放部分劳动力&#xff0c;让农户有精力管理更多大棚&#xff0c;进而增加农户收入。 ●…

WEB 3D技术 three.js通过光线投射 完成几何体与外界的事件交互

本文 我们来说 光线投射 光线投射技术是用于3维空间场景中的交互事件 我们先编写代码如下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";const scene new THRE…

使用 extract + TextMapAdapter 实现了自定义 traceId

前言 某些特定的场景&#xff0c;需要我们通过代码的方式实现自定义 traceId。 实现思路&#xff1a;通过 tracer.extract 能够构造出 SpanContext &#xff0c;将构造出来的 SpanContext 作为上层节点信息&#xff0c;通过 asChildOf(SpanContext) 能够构造出当前的 span。 …

MVC下的四种验证编程方式

ASP.NET MVC采用Model绑定为目标Action生成了相应的参数列表&#xff0c;但是在真正执行目标Action方法之前&#xff0c;还需要对绑定的参数实施验证以确保其有效性&#xff0c;我们将针对参数的验证成为Model绑定。总地来说&#xff0c;我们可以采用4种不同的编程模式来进行针…

第三百四十回

文章目录 1. 概念介绍2. 方法与信息2.1 获取方法2.2 详细信息 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取设备信息"相关的内容&#xff0c;本章回中将介绍如何获取App自身的信息.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…

渗透线上下料控制(SCL源代码)

有关渗透线的其它详细介绍请参考下面链接文章&#xff1a; https://rxxw-control.blog.csdn.net/article/details/133611151https://rxxw-control.blog.csdn.net/article/details/133611151这里的渗透线上下料属于整个渗透线流程里的最前端和最后端&#xff0c;分别负责待处理…

拒绝采样(算法)总结

先说说什么是拒绝采样算法&#xff1a;就类似于数学上的求阴影面积的方法&#xff0c;直接求求不出来&#xff0c;就用大面积 - 小面积 阴影面积的办法。 所谓拒绝 和 采样 &#xff1a;就像是撒豆子计个数&#xff0c;计算概率问题一样&#xff0c;大桶里面套小桶&#xff0c…

【Linux】socket基础API

目录 1. 创建socket&#xff08;TCP/UDP&#xff0c;客户端服务器&#xff09; 1.1 第一个参数——domain 1.2 第二个参数——type 1.3 第三个参数——protocol 2. 绑定socket地址&#xff08;TCP/UDP&#xff0c;服务器&#xff09; 2.1 字节序及转换函数 2.2 IP地址及…

LoadRunner安装,以及注意的点

摘要 要先安装主包&#xff0c;然后再去汉化&#xff0c;最后是去破解 因为LR12的虚拟用户数比较少&#xff0c;所以以下是以LR11教大家如何安装&#xff0c;因为LR11的虚拟用户数没有受到限制。 还有就是LR12与LR11区别不是很大。 但是LR11对Win10的兼容性不好&#xff0c…

【栈】根据模式串构造最小数字

import java.util.ArrayDeque; import java.util.Deque;/*** 思路&#xff1a;如果是字符‘I’直接对应的数字加入结果res中&#xff0c;如果是‘D’将对应的数字加入栈中。* 再次遇到‘I’先将对应的数字加入结果res中&#xff0c;然后再将栈中的元素从栈顶取出存放在* …

半导体行业-SECS/GEM协议 JAVA与SECS/GEM通信 什么是配方?springboot集成SECS通信协议 配方管理S7FX

Java与SECS基础通信 Java实现SECS指令S2F17获取时间 Java实现SECS指令 S10F3 终端单个显示例子 Java实现SECS指令 S7FX配方管理 Java实现SECS指令 S5F1报警/取消报警上传 实例源码及DEMO请查阅 JAVA开发SECS快速入门资料&#xff0c;SECS S7F19 什么是半导体配方&…