redis五大类型分析--list(2)

此篇为对redis五大数据类型中list的分析,希望能有所帮助

 List API

 listTypeGet函数

robj *listTypeGet(listTypeEntry *entry) {robj *value = NULL;/* 检查编码类型是否为 quicklist (快速列表) */if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {/* 元素的值保存在 value 中 */if (entry->entry.value) {/* value = 使用当前元素创建的字符串对象 */value = createStringObject((char *)entry->entry.value,entry->entry.sz);/* 元素的值保存在 longval 中 */} else {/* value = 使用当前(整型)元素创建的字符串对象 */value = createStringObjectFromLongLong(entry->entry.longval);}} else {serverPanic("Unknown list encoding");}return value;
}

分析:

利用createStringObject函数和createStringObjectFromLongLong函数,检查编码类型并获取元素的值

listTypeInsert函数

void listTypeInsert(listTypeEntry *entry, robj *value, int where) {/* 检查编码类型是否为 quicklist (快速列表) */if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {/* 获取解码后的 value(实际上是让编码为INT的 value 转为字符串形式(raw 或 embstr))*/value = getDecodedObject(value);/* 令 str = value(字符串值),len = value 字符串长度 */sds str = value->ptr;size_t len = sdslen(str);/* 在 entry 后方插入元素 */if (where == LIST_TAIL) {quicklistInsertAfter(entry->li->iter, &entry->entry, str, len);/* 在 entry 前方插入元素 */} else if (where == LIST_HEAD) {quicklistInsertBefore(entry->li->iter, &entry->entry, str, len);}/* value 的被引用次数 -1 ,value 被引用次数为0时将被释放 */decrRefCount(value);} else {serverPanic("Unknown list encoding");}
}

分析:

对entry的插入操作,在 entry 的位置前或后方插入元素 value 

listTypeReplace函数

void listTypeReplace(listTypeEntry *entry, robj *value) {/* 检查编码类型是否为 quicklist (快速列表) */if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {/* 获取解码后的 value(实际上是让编码为INT的 value 转为字符串形式(raw 或 embstr))*/value = getDecodedObject(value);/* 令 str = value(字符串值),len = value 字符串长度 */sds str = value->ptr;size_t len = sdslen(str);/* 用 value 替换 entry 中的元素 */quicklistReplaceEntry(entry->li->iter, &entry->entry, str, len);/* value 的被引用次数 -1 ,value 被引用次数为0时将被释放 */decrRefCount(value);} else {serverPanic("Unknown list encoding");}
}

分析:

替换 entry 中的元素 

listTypeEqual函数

int listTypeEqual(listTypeEntry *entry, robj *o) {/* 检查编码类型是否为 quicklist (快速列表) */if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {/* 使用断言确保 o 内部编码为字符串(raw 或 embstr) */serverAssertWithInfo(NULL,o,sdsEncodedObject(o));/* 调用比较函数进行比较,相同返回1,不相同返回0 */return quicklistCompare(&entry->entry,o->ptr,sdslen(o->ptr));} else {serverPanic("Unknown list encoding");}
}

分析:

在当前位置比较两个元素是否相同

listTypeDelete函数

void listTypeDelete(listTypeIterator *iter, listTypeEntry *entry) {/* 检查编码类型是否为 quicklist (快速列表) */if (entry->li->encoding == OBJ_ENCODING_QUICKLIST) {/* 调用删除函数将元素删除 */quicklistDelEntry(iter->iter, &entry->entry);} else {serverPanic("Unknown list encoding");}
}

分析:

删除元素

listTypeDup函数

/* This is a helper function for the COPY command.* Duplicate a list object, with the guarantee that the returned object* has the same encoding as the original one.** The resulting object always has refcount set to 1 */robj *listTypeDup(robj *o) {robj *lobj;/* 使用断言确保 o 类型为列表 */serverAssert(o->type == OBJ_LIST);switch (o->encoding) {/* 检查编码类型是否为 quicklist (快速列表) */case OBJ_ENCODING_QUICKLIST:/* 创建 o 的副本 lobj */lobj = createObject(OBJ_LIST, quicklistDup(o->ptr));lobj->encoding = o->encoding;break;default:serverPanic("Unknown list encoding");break;}return lobj;
}

分析:

检查编码类型,辅助copy命令。复制一个列表对象,并保证返回的对象具有与原始对象相同的编码。返回的对象总是将 refcount 设置为1 

listTypeDelRange函数

/* Delete a range of elements from the list. */int listTypeDelRange(robj *subject, long start, long count) {/* 检查编码类型是否为 quicklist (快速列表) */if (subject->encoding == OBJ_ENCODING_QUICKLIST) {/* 调用范围删除函数进行删除 */return quicklistDelRange(subject->ptr, start, count);} else {serverPanic("Unknown list encoding");}
}

分析:

在列表中删除一个指定范围内的元素

总结:

本篇分析了 listTypeGet函数、listTypeInsert函数、listTypeReplace函数、listTypeEqual函数等API,即将元素的增删改操作具体分析,有助于更好地理解list类型的操作。

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

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

相关文章

【LeetCode-中等题】48. 旋转图像

文章目录 题目方法一&#xff1a;使用辅助数组矩阵 行列的规律方法二&#xff1a;原地修改 递推公式 题目 方法一&#xff1a;使用辅助数组矩阵 行列的规律 public void rotate(int[][] matrix) {int n matrix.length;int[][] matrix_new new int[n][n];for(int i 0 ; i<…

深入浅出AXI协议(2)——通道及信号

一、前言 在之前的文章中&#xff0c;我们主要介绍了什么是AXI协议&#xff0c;AXI协议的特点与优点&#xff0c;然后对于AXI协议非常重要的五通道结构进行了介绍&#xff0c;了解了5个通道各自的作用。本文我们继续AXI协议的学习&#xff0c;我们将讨论5个通道的具体内容和相对…

uni、js——点击与禁用(不可点击)、动态样式class

案例 没约满的时间可以点击进行选择&#xff0c;约满的就不能选择了。选择完之后变色变字。 核心思想就是创建一个第三方变量存起来&#xff0c;点击谁就存到第三方&#xff0c;在根据这个进行判断。 代码 <template><view class"content"><view cl…

JavaScript:基本语法(变量与函数的定义与使用)

文章目录 script 标签srcdefer 延迟加载 基本语法定义变量 与 使用变量基本类型typeof 查看变量类型复合类型数组类型定义对象类型定义 函数定义函数使用函数 script 标签 src 和scc一样可以内嵌也可以外src外引。 一般是推荐外引。 <script src"idx.js">&l…

opencv 进阶15-检测DoG特征并提取SIFT描述符cv2.SIFT_create()

前面我们已经了解了Harris函数来进行角点检测&#xff0c;因为角点的特性&#xff0c;这些角点在图像旋转的时候也可以被检测到。但是&#xff0c;如果我们放大或缩小图像时&#xff0c;就可能会丢失图像的某些部分&#xff0c;甚至有可能增加角点的质量。这种损失的现象需要一…

ant design自定义展开折叠查看子项和点击行查看详情

实现思路&#xff1a;通过配置rowSelection&#xff0c;列表项是否可选择来实现。 页面内容&#xff1a; <a-table :dataSource"integrationBonds" :columns"columns" :customRow"customintegrationBondsRow":pagination"{hideOnSingle…

Docker创建Consul并添加权限控制

一、部署Consul 1、拉取镜像&#xff1a; docker pull consul:<consul-version> 2、运行 docker run --name consul1 -p 8300:8300/tcp -p 8301:8301/tcp -p 8301:8301/udp -p 8302:8302/tcp -p 8302:8302/udp -p 8500:8500 -p 8600:8600/tcp -p 8600:8600/udp -v /h…

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part I

用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法 Part I 本文打算分成两部分写&#xff1a; 第一部分力求用最简单的办法帮助大家直接在VS中查看OpenCV的源码。这种方法最大的优点就是不容易出错&#xff0c;且操作简单。如果只是需要查看OpenCV源码的同学&…

matlab使用教程(24)—常微分方程(ODE)求解器

1.常微分方程 常微分方程 (ODE) 包含与一个自变量 t&#xff08;通常称为时间&#xff09;相关的因变量 y 的一个或多个导数。此处用于表示 y 关于 t 的导数的表示法对于一阶导数为 y ′ &#xff0c;对于二阶导数为 y ′′&#xff0c;依此类推。ODE 的阶数等于 y 在方程中…

Springboot配置高级

临时属性设置 带属性数启动SpringBoot java –jar springboot.jar –-server.port80携带多个属性启动SpringBoot&#xff0c;属性间使用空格分隔 属性加载优先顺序 参看https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-fea…

pgadmin4中的备份与恢复

一&#xff0c;postgresql 数据的备份与恢复 &#xff08;一&#xff09;数据库备份与恢复 1&#xff0c;备份 windows环境 1> dump 逻辑备份 1&#xff0c;用管理员身份打开power shell 2&#xff0c;切换到本机 postgresql 安装目录下的 bin 目录&#xff1a; PS C…

GIT 常用指令

基础指令 $ git init #初始化仓库&#xff0c;在该文件夹创建的为workspace$ git add . #已暂存 [.通配符&#xff0c;全部添加]$ git commit -m "log add file" #提交到仓库,并写了日志 ”log add file“$ git status #查看状态&#xff0c;可查看被修改的文件…

Prometheus+Grafana+AlertManager监控SpringBoot项目并发送邮件告警通知

文章目录 PrometheusGrafanaAlertManager监控平台搭建新建SpringBoot项目为Prometheus提供指标新建项目&#xff0c;引入依赖新建接口&#xff0c;运行程序 推送指标到pushgateway 开始监控Grafana连接Prometheus数据源导入Grafana模板监控SpringBoot项目 邮件告警通知同系列文…

Windows如何部署Redis

一、简介 Redis (Remote Dictionary Server) 是一个由意大利人 Salvatore Sanfilippo 开发的 key-value 存储系统&#xff0c;具有极高的读写性能&#xff0c;读的速度可达 110000 次/s&#xff0c;写的速度可达 81000 次/s 。 二、下载 访问 https://github.com/tporadows…

字符串经典问题

1. 验证回文串 验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 t…

Vue2向Vue3过度核心技术computed计算属性

目录 1 computed计算属性1.1 概念1.2 语法1.3 注意1.4.案例1.5.代码准备 2 computed计算属性 VS methods方法2.1 computed计算属性2.2 methods计算属性2.3 计算属性的优势2.4 总结 3 计算属性的完整写法 1 computed计算属性 1.1 概念 基于现有的数据&#xff0c;计算出来的新属…

React Navigation 开发准备

需要 React Native 使用 React Navigation 的话&#xff0c;我们需要首先安装如下几个包&#xff1a; npm install react-navigation/native npm install react-native-screens react-native-safe-area-context开发之前做一些处理 如果您使用的是 Mac 并针对 iOS 进行开发&am…

探索AIGC人工智能(Midjourney篇)(一)

文章目录 案例图片 Midjourney注册 创建Discord账号 下载客户端 添加Midjourney到自己的服务器 用Midjourney画一只会飞的鸭子 Midjourney绘画指令 Midjourney绘画指令_激发Midjourney的创造力 Midjourney绘画指令_Seed指令 Midjourney光线关键词&#xff0c;打造震撼…

leetcode做题笔记98. 验证二叉搜索树

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 思路一&#xff1a;递归 …

软件宇宙中的星体:软件群星的闪耀

软件宇宙中的星体&#xff1a;软件群星的闪耀 引言 在当今信息时代&#xff0c;软件已经成为人类社会不可或缺的一部分。无论是移动应用、桌面软件、云计算平台&#xff0c;还是嵌入式系统&#xff0c;各种类型的软件构成了一个庞大而复杂的宇宙。这些软件就如同群星一样&…