sds

article/2025/8/22 16:31:58

双向链表(adlist.h/adlist.c)

链表(list)是Redis中最基本的数据结构,由adlist.h和adlist.c定义。

数据结构

typedef struct listNode {//指向前一个节点struct listNode *prev;//指向后一个节点struct listNode *next;//值void *value;
} listNode;

listNode是最基本的结构,表示链表中的一个结点。结点有向前(next)和向后 (prev)两个指针,链表是双向链表。保存的值是void*类型。

typedef struct list {listNode *head;listNode *tail;void *(*dup)(void *ptr);void (*free)(void *ptr);int (*match)(void *ptr, void *key);unsigned long len;
} list;

链表通过list定义,提供头(head)、尾(tail)两个指针,分别指向头部的结点和尾部的结点;提供三个函数指针,供用户传入自定义函数,用于复制(dup)、释放(free)和匹配(match)链表中的结点的值(value);通过无符号长整数len,标示链表的长度。

typedef struct listIter {listNode *next;int direction;
} listIter;

listIter是访问链表的迭代器,指针(next)指向链表的某个结点,direction表示迭代访问的方向(宏AL_START_HEAD表示向前,AL_START_TAIL表示向后)。

digraph adlist {    rankdir=LR;    node [shape=record, style = filled, fillcolor = "#95BBE3"];    edge [style = bold];    list_node_1 [label = "<head>listNode |{<prev> prev| value|<next> next}", ];    list_node_2 [label = "<head>listNode |{<prev> prev| value|<next> next}"];    list_node_3 [label = "<head>listNode |{<prev> prev| value|<next> next}"];    list_node_1:next -> list_node_2:head;    list_node_2:next -> list_node_3:head;    list_node_2:prev -> list_node_1:head;    list_node_3:prev -> list_node_2:head;    node [width=1.5, style = filled, fillcolor = "#A8E270"];    list [label = "list |<head> head|<tail> tail|<dup> dup|<free> free|<match> match|<len> len"];    list:tail -> list_node_3:head;    list:head -> list_node_1:head;}

使用方法

Redis定义了一系列的宏,用于访问list及其内部结点。

链表创建时(listCreate),通过Redis自己实现的zmalloc()分配堆空间。链表释放(listRelease)或删除结点(listDelNode)时,如果定义了链表(list)的指针函数free,Redis会使用它释放链表的每一个结点的值(value),否则需要用户手动释放。结点的内存使用Redis自己实现的zfree()释放。

对于迭代器,通过方法listGetIterator()、listNext()、 listReleaseIterator()、listRewind()和listRewindTail()使用,例如对于链表list,要从头向尾遍历,可通过如下代码:

iter = listGetIterator(list, AL_START_HEAD); // 获取迭代器
while((node = listNext(iter)) != NULL)
{dosomething;
}
listReleaseIterator(iter);

listDup()用于复制链表,如果用户实现了dup函数,则会使用它复制链表结点的value。listSearchKey()通过循环的方式在O(N)的时间复杂度下查找值,若用户实现了match函数,则用它进行匹配,否则使用按引用匹配。

应用

除了实现列表类型以外, 双端链表还被很多 Redis 内部模块所应用:

  • 事务模块使用双端链表依序保存输入的命令;
  • 服务器模块使用双端链表来保存多个客户端;
  • 订阅/发送模块使用双端链表来保存订阅模式的多个客户端;
  • 事件模块使用双端链表来保存时间事件(time event);

字符串(sds.h/sds.c)

为了方便计算字符串的长度、以及提高字符串的拼接效率,作者实现了自己的字符串结构sdshdr,是二进制安全的,并在后面自动添加0。

数据结构

typedef char *sds;struct sdshdr {// 记录 buf 数组中已使用字节的数量// 等于 SDS 所保存字符串的长度int len;// 记录 buf 数组中未使用字节的数量int free;// 字节数组,用于保存字符串char buf[];
};

那么一个sds字符串实际申请的内存为:sizeof(sdshdr)+len+free+1,free新申请空间的时候为0,拼接字符串的时候free就不为0。

技巧

  1. 在函数sdsnewlen中,根据是否需要初始化使用zmalloc和zcalloc两个不同函数。
  2. 计算字符串长度的时候,直接使用函数sdslen,不需要调用strlen。

3. 需要扩展free的空间时,需要调用函数sdsMakeRoomFor,该函数空间分配策略比较有意思,如果free>=addlen,直接返回。否则判断free+addlen是否小于SDS_MAX_PREALLOC这个宏,如果小于,那么这次就分配2*(free+addlen)的空间,这样每次多分配一陪的空间;否则就分配free+addlen+SDS_MAX_PREALLOC的空间。这样可以控制最大多分配多少的空间,以至于不要浪费太多空间。例如:sds old=sdsnew("test one");sds new=sdscat(old,"test");此时有12的空余空间,如果再次调用``sdscat(new,”test”)``,那么就不需要分配空间。

4. 在函数sdscatvprintf中,空间申请是以16,32,64..这样增长的,无处不透露提高性能。

5. 在函数sdscmp中,调用memcmp,性能要比strcmp好,而且还是二进制安全的。

6. 在函数sdssplitlen中,默认分配的数组为5,然后按照2的倍数进行增长,这样做法,有点浪费空间,但是加快速度,不要每分割出来一个字符串就要申请空间。比较的时候把seplen为1分出来,也是加快字符串比较速度的考虑,大部分时候应该是seplen为1。


http://chatgpt.dhexx.cn/article/CYQaxE0G.shtml

相关文章

xSSD: DSSD,FSSD,ESSD,MDSSD,fireSSD

1 DSSD title :DSSD : Deconvolutional Single Shot Detector conf & anthor: arXiv, Cheng-Yang Fu arXiv:https://arxiv.org/abs/1701.06659 intro:Deconvolutional 主要内容&#xff1a; DSSD使用ResNet-101代替VGG作为主干网络&#xff0c;在‘SSD layers‘后面添加了…

redis SDS介绍

Redis面试中经常被问到&#xff0c;Redis效率为什么这么快&#xff0c;很多同学往往回答&#xff1a; ① Redis基于内存操作② Redis是单线程的&#xff0c;采用了IO多路复用技术③ Redis未使用C语言字符串&#xff0c;使用了SDS字符串然而&#xff0c;很少有人能说清楚SDS字符…

DSSD: Deconvolutional Single Shot Detector 论文笔记

论文地址&#xff1a;DSSD : Deconvolutional Single Shot Detector 项目地址&#xff1a;Github 概述 这篇论文应该算是SSD: Single Shot MultiBox Detector的第一个改进分支&#xff0c;作者是Cheng-Yang Fu&#xff0c; 我们熟知的Wei Liu大神在这里面是第二作者&#xf…

DSSD(Deconvolutional Single Shot Detector)算法理解

论文地址&#xff1a;https://arxiv.org/abs/1701.06659 Github 源码&#xff08;caffe版&#xff09;&#xff1a;https://github.com/chengyangfu/caffe/tree/dssd 1、文章概述 DSSD(Deconvolutional Single Shot Detector)是SSD算法改进分支中最为著名的一个&#xff0c;SS…

DSSD : Deconvolutional Single Shot Detector

参考 DSSD : Deconvolutional Single Shot Detector - 云社区 - 腾讯云 目录 一、简介 二、相关工作 三、反卷积的单阶段检测器DSSD 3.1、SSD 3.2、用VGG代替Residual-101 预测模型 反卷积SSD 反卷积模块 训练 四、实验 基本网络 PASCAL VOC 2007 在VOC2007上的消…

DDS 介绍

​DDS&#xff0c;全称 Data Distribution Service (数据分发服务)&#xff0c;由对象管理组(OMG)发布和维护&#xff0c;是一个中间件协议和API标准&#xff0c;采用发布/订阅体系架构&#xff0c;强调以数据为中心&#xff0c;提供丰富的QoS服务质量策略&#xff0c;以保障数…

目标检测系列:SSD系列SSD、FSSD、DSSD、DSOD

SSDDSSDFSSDDSOD SSD 动机 目前目标检测的一些算法包括基于深度学习的&#xff0c;都是先假定一些候选框&#xff0c;接着对候选框内容进行特征提取再分类&#xff0c;然后再对边框的位置进行修正这一系列的计算&#xff0c;最典型的例如Faster RCNN&#xff0c;虽然准确&…

计算机保密dss是啥,什么是DSS?

什么是DSS 上线时间&#xff1a;2020年9月4日 以下引用猪弟写的设计文档&#xff1a; DFS的存款系统: DSS (DFS Saving System) 原名DSR&#xff0c;你也可以把它称作&#xff0c;DFS的银行或DFS的余额宝。 它是专门为DFS量身定做的DFS币本位无风险保障性收入系统。 特征&#…

DDS介绍

DDS&#xff08;Data Distribution Service&#xff09; 数据分发服务 什么是DDS 数据分发服务&#xff08;DDS™&#xff09;是一个由对象管理组&#xff08;OMG&#xff09;发布的以数据为中心的中间件协议和API标准。采用分布式发布/订阅体系架构&#xff0c;以中间件的形…

SS, DSDS, DR-DSDS,DSDA 区别与理解

1.首先简单解释一下SS, DSDS, DSDA都是什么意思 SS(single standby)&#xff1a;单卡单待 DSDS(Dual SIM Dual Standby) &#xff1a;双卡双待 DSDA(Dual SIM dual active)&#xff1a;双卡双通 2.双卡双待/双卡双通主要区别 双待 &#xff1a; 两个卡都处于待机状态&#…

DSSD

目录 1. 概述2. DSSD2.1 overview2.2 Prediction module2.2 Deconvolution Module 论文&#xff1a;DSSD : Deconvolutional Single Shot Detector 来源&#xff1a;CVPR 2017 1. 概述 DSSD是对SSD的改进&#xff0c;虽然SSD直接在多尺度特征上进行预测的做法提升了目标检测的…

目标检测(六):DSSD

SSD 的提出为目标检测领域带来了一大改进&#xff0c;无论是准确性还是速度都要优于先前的检测模型&#xff0c;美中不足的是 SSD 对图像中的小目标不太友好&#xff0c;检测效果一般&#xff0c;可能是因为小目标在高层没有足够的信息。为解决该问题&#xff0c;出现了以下几种…

目标检测算法DSSD的原理详解

论文地址&#xff1a;https://arxiv.org/abs/1701.06659 Github 源码&#xff08;caffe版&#xff09;&#xff1a;https://github.com/chengyangfu/caffe/tree/dssd 1、文章概述 DSSD(Deconvolutional Single Shot Detector)是SSD算法改进分支中最为著名的一个&#xff0c;SSD…

【每日一网】Day30:DSSD(Deconvolutional Single Shot Detector)简单理解

DSSD&#xff1a;Deconvolutional Single Shot Detector 算法背景 本文的主要贡献在于将上下文索引和残差网络加到了SSD算法中&#xff0c;然后在反卷积层上增加SSD和residual-101&#xff0c;以在目标检测中提高对小目标的准确性。DSSD将SSD的VGG网络用Resnet-101进行了替换…

【压测指南|压力测试核心性能指标及行业标准】

文章目录 压力测试核心性能指标及行业标准指标1&#xff1a;响应时间指标2&#xff1a;吞吐量&#xff08;TPS)指标3&#xff1a;失败率总结&#xff1a; 压力测试核心性能指标及行业标准 在做压力测试时&#xff0c;新手测试人员常常在看报告时倍感压力&#xff1a;这么多性能…

CSDN做测试的老师教你Jmeter生成压力测试报告

根据各大招聘网站上的需求来看&#xff0c;熟悉Jmeter做性能测试已经几乎成为必要条件了。 那么今天在这个给大家安利一波。 怎么使用Jmeter生成压力测试报告呢&#xff1f; 条件准备&#xff1a; 1、Jmeter3.2&#xff08;推荐使用&#xff0c;比较稳定&#xff09; 2、J…

性能压测报告

文章目录 业务接口性能压测报告一、说明二、调优1、slb2、内核3、nginx4、php 三、盘古单节点压测数据四、盘古单代理节点压测数据五、集群压测数据1、每秒2000并发&#xff0c;总计5分钟压测数据2、每秒3000并发&#xff0c;总计5分钟压测数据 六、结论1、说明2、结果3、瓶颈 …

压力测试相关概念与性能指标以及压测实例

压力测试 压力测试考察当前软硬件环境下系统所能承受的最大负荷并帮助找出系统瓶颈所在。压测都 是为了系统在线上的处理能力和稳定性维持在一个标准范围内&#xff0c;做到心中有数。 使用压力测试&#xff0c;我们有希望找到很多种用其他测试方法更难发现的错误。有两种错误类…

系统压力测试(一)

《目录》 -------->认知&#xff0c;了解压测的一些参数&#xff0c;了解什么是正向的压测结果 -------->压测需求一般包含的东西与及步骤 -------->JMeter压测软件的介绍&#xff0c;压测计划中常用模块的用途 -------->了解怎么给出压测人员出一份压测指标&a…

压力测试报告

找XX二代--江苏对接功能点压力测试报告 一、测试目的 对找XX二代一些基本功能进行自动化测试代替人工测试&#xff0c;提高测试效率。 二、测试环境 本次压力测试使用了jmeter4.0测试工具&#xff0c;找XX二代设备1台&#xff1b; 软件版本&#xff1a;CMCC-DST1A-0-2_V2.2.X_2…