义乌网站建设设西南能矿建设工程公司网站

diannao/2026/1/15 21:20:44/文章来源:
义乌网站建设设,西南能矿建设工程公司网站,加盟编程教育哪家好,如何获得网站后台密码sds(Simple Dynamic String)是redis中最基础也是最重要的数据结构之一#xff0c;其内部使用的key、协议、回复等等都会用它来存储。sds主要设计被用来替代C原生字符串 char *#xff08;数组#xff09;#xff0c;以便更便捷、更高效、更安全的进行字符串操作管理。其实它…sds(Simple Dynamic String)是redis中最基础也是最重要的数据结构之一其内部使用的key、协议、回复等等都会用它来存储。sds主要设计被用来替代C原生字符串 char *数组以便更便捷、更高效、更安全的进行字符串操作管理。其实它和C标准库中的string在一定程度上是比较类似的都是用来完成对字符串缓冲区的动态分配、管理以及其它一些相应操作的。 // sds的定义 typedef char *sds;sds的定义非常简单直接就是一个char*的别名因此sds本身具备C字符串的特性可以使用strcpy、strlen等函数。 sds相关数据结构中真正重要的是sdshdr的定义最初老版本的定义如下 struct sdshdr {int len; // SDS字符串的长度int free; // 未使用的空间大小char buf[]; // 字符串数据 };现在的sdshdr已经重新定义成5个不同的结构了 /* Note: sdshdr5 is never used, we just access the flags byte directly.* However is here to document the layout of type 5 SDS strings. */ struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* used */uint32_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; }; struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* used */uint64_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[]; };#define SDS_TYPE_5 0 #define SDS_TYPE_8 1 #define SDS_TYPE_16 2 #define SDS_TYPE_32 3 #define SDS_TYPE_64 4这么定义的主要目的是节省存储空间针对不同的字符串长度使用不同的头。另外结构中新增了flags标记用来表示使用的是哪个头。如果flags类型是SDS_TYPE_5则高5bit还表示数据长度因为sdshdr5中并没有长度的成员定义。 sds在分配空间时是包含头结构的但真正返回的却是buf成员的地址这就是sds具备C字符串的特性的原因。由于结构体中设置了 attribute((packed))表示按单字节对齐因此可以通过sds[- 1]来获取flags的值而后获取对应的结构体指针。 #define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))))// 获取SDS_TYPE_16对应的结构体指针 struct sdshdr16 *hdr SDS_HDR(16,s)接下来先看一下sds分配释放的主要实现 _sdsnewlen和 sdsfree对外提供的分配函数最终都会调用它来实现。 sds _sdsnewlen(const void *init, size_t initlen, int trymalloc) {void *sh;sds s;// 根据数据长度获取合适的结构体类型char type sdsReqType(initlen);/* Empty strings are usually created in order to append. Use type 8* since type 5 is not good at this. */// inilen为0时, 升级类型预留空间if (type SDS_TYPE_5 initlen 0) type SDS_TYPE_8;int hdrlen sdsHdrSize(type);unsigned char *fp; /* flags pointer. */size_t usable;// 分配: 头 数据长度 1的空间assert(initlen hdrlen 1 initlen); /* Catch size_t overflow */sh trymalloc?s_trymalloc_usable(hdrleninitlen1, usable) :s_malloc_usable(hdrleninitlen1, usable);if (sh NULL) return NULL;// init不为空并且不是SDS_NOINIT, 则重置内存为0if (initSDS_NOINIT)init NULL;else if (!init)memset(sh, 0, hdrleninitlen1);// 对外返回的 sds 指针位置, 向后偏移头大小s (char*)shhdrlen;// 存储flags的指针位置fp ((unsigned char*)s)-1;usable usable-hdrlen-1;if (usable sdsTypeMaxSize(type))usable sdsTypeMaxSize(type);// 根据类型,设置结构体中相应的值switch(type) {case SDS_TYPE_5: {*fp type | (initlen SDS_TYPE_BITS);break;}case SDS_TYPE_8: {SDS_HDR_VAR(8,s);sh-len initlen;sh-alloc usable;*fp type;break;}case SDS_TYPE_16: {SDS_HDR_VAR(16,s);sh-len initlen;sh-alloc usable;*fp type;break;}case SDS_TYPE_32: {SDS_HDR_VAR(32,s);sh-len initlen;sh-alloc usable;*fp type;break;}case SDS_TYPE_64: {SDS_HDR_VAR(64,s);sh-len initlen;sh-alloc usable;*fp type;break;}}// 拷贝需要初始化的内容if (initlen init)memcpy(s, init, initlen);// buf末尾赋0s[initlen] \0;return s; }......void sdsfree(sds s) {if (s NULL) return;// 释放时,需要把指针重定向到相应结构体的起始位置s_free((char*)s-sdsHdrSize(s[-1])); }下面再看下扩容的函数 _sdsMakeRoomFor它的实现也非常清晰内部的一些扩容操作都会调用它。 sds _sdsMakeRoomFor(sds s, size_t addlen, int greedy) {void *sh, *newsh;// 获取剩余空间大小size_t avail sdsavail(s);size_t len, newlen, reqlen;// 获取当前typechar type, oldtype s[-1] SDS_TYPE_MASK;int hdrlen;size_t usable;/* Return ASAP if there is enough space left. */// 空间够用则直接退出if (avail addlen) return s;len sdslen(s);// 获取sds结构体分配内存的起始地址sh (char*)s-sdsHdrSize(oldtype);// 新的需要分配的空间大小reqlen newlen (lenaddlen);assert(newlen len); /* Catch size_t overflow */if (greedy 1) {// greedy为1时需要预留空间, 如果新分配空间小于1MB, 则分配空间调整为2倍大小; 如果大于1MB则分配成 1MB大小if (newlen SDS_MAX_PREALLOC)newlen * 2;elsenewlen SDS_MAX_PREALLOC;}// 按新长度获取新的typetype sdsReqType(newlen);/* Dont use type 5: the user is appending to the string and type 5 is* not able to remember empty space, so sdsMakeRoomFor() must be called* at every appending operation. */if (type SDS_TYPE_5) type SDS_TYPE_8;hdrlen sdsHdrSize(type);assert(hdrlen newlen 1 reqlen); /* Catch size_t overflow */if (oldtypetype) {// 如果类型不变,则直接按照新大小reallocnewsh s_realloc_usable(sh, hdrlennewlen1, usable);if (newsh NULL) return NULL;s (char*)newshhdrlen;} else {/* Since the header size changes, need to move the string forward,* and cant use realloc */// 如果类型变化了, 则重新分配内存并拷贝原来的数据到新内存以及释放原来的内存newsh s_malloc_usable(hdrlennewlen1, usable);if (newsh NULL) return NULL;memcpy((char*)newshhdrlen, s, len1);s_free(sh);s (char*)newshhdrlen;// 设置flagss[-1] type;// 设置新的长度sdssetlen(s, len);}// 设置可用空间大小usable usable-hdrlen-1;if (usable sdsTypeMaxSize(type))usable sdsTypeMaxSize(type);sdssetalloc(s, usable);return s; }另外sds在设计中本身也是二进制安全的而且sds会在末尾多分配1字节并且置’\0’用于防止一些字符串操作的越界问题。因此它除了用作字符串外还可以作为二进制数据的存储buf在redis内部也有着广泛用途。

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

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

相关文章

HTML和PHP怎么做网站招远网站建设公司地址

文章目录 一、Redis缓存的介绍二、Redis缓存问题2.1 缓存穿透2.2 缓存击穿2.3 缓存雪崩2.4 双写一致性2.5 缓存持久化RDBAOF 三、缓存数据管理3.1 数据过期策略3.2 数据淘汰策略 一、Redis缓存的介绍 我们在日常的代码编写中比较少使用到Redis,但是如果涉及到了比较…

机械行业网站有哪些网站开发保密合同

作者:邹溪源,长沙资深互联网从业者,架构师社区特邀嘉宾!一在博客园中使用小公司大公司进行搜索,列入的搜索记录长达50页。虽然完全命中关键词的文章也许并不多,但这或许也能体现出这个话题的热门程度。今天…

开网店的基础知识谷歌优化排名公司

在半年时间里,自己使用过程中,发现的一些小bug,更新了一下,也追加了一些自定义函数,不成系统,就单独放在修复与更新系列中。一、第24波-批量发送邮件并指点不同附件不同变量Excel催化剂功能第24波-批量发送…

台州网站制作服务如何使用阿里云建设网站

目录 TypeScript Number 语法 Number 对象属性 JavaScript NaN 实例 prototype 实例 Number 对象方法 TypeScript Number TypeScript 与 JavaScript 类似,支持 Number 对象。 Number 对象是原始数值的包装对象。

wordpress网站速度修改目录wordpress

我们先连接到Redis服务 然后 我们要输入 CONFIG SET requirepass “新密码” 例如 CONFIG SET requirepass "A15167"这样 密码就被设置成立 A15167 我们 输入 AUTH 密码 例如 AUTH A15167这里 返回OK说明成功了 然后 我们退出在登录就真的需要 redis-cli -h IP地…

品牌建设英文谈谈你对seo概念的理解

当程序规模变大后,一个程序用多个文件组织,便于组织生产。这样,不必每次都重复对所有代码进行编译,而只需编译一次即可。把编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可。 C…

上传网站怎么安装网页制作入门视频教程

介绍 在本教程中,我们将通过一个简单的样例,学习如何使用声明式UI编程框架的基础组件。本篇Codelab将会使用Image组件、Slider组件、Text组件共同实现一个可调节的风车动画,实现效果如图所示 相关概念 Text组件:文本组件&#x…

做网站加模块网站上传 空间 数据库

网络确实是个好东西,她让我们知识丰富起来,让我们沟通更方便,让世界更小了。 博客确实是个好东西,她记录博主的成长。 但是最近经常被博客郁闷到,本来我就是一个忧郁的人,每当我看到有些博客更新了几年最后…

网站固定通栏代码做视频付费网站

第5课 - 线性表的本质 数据结构是为了解决生活中的实际问题而存在的,那生活中与线性表相对应的例子有什么呢? 幼儿园中就有一个例子,在老师安排小朋友活动时,会将小朋友组织成下面的站队形式,这个就是线性表。 1. 线性…

西安网站建设王永杰网站备案 接口

VUE3 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vu…

苏州要服务网站建设php网站备份

虚拟机是一个好用的工具,在本地搭建的虚拟机可以给我们提供测试,但时间长了也会忘记密码;因此这里以centos系统的虚机为例,提供一个重置虚机密码的方法 1.在开机页面按“E”进入编辑模式 进入后长这样: 2.找到ro cras…

婚庆摄影企业网站大连建设网水电费查询网址

怎样安装摄像头的驱动程序怎样安装摄像头的驱动程序注意:请不要在未安装摄像头的驱动程序前将PC摄像头插入计算机USB接口中;如果在没有安装驱动程序的情况下提前插上摄像头,当WINDOWS提示安装驱动程序时,请点击取消键并将其拨出&a…

网站启动画面网络招商

【传送门:BZOJ1734】 简要题意: 约翰有N 间牛棚,这些牛棚坐落在一条直线上,第i 间牛棚位于坐标Xi 的位置。他要把C 头 奶牛安排在这些牛棚里。每间牛棚最多可以放一头奶牛,也可以空着。这些奶牛的脾气都很暴燥&#xf…

郑州做网站推广电做电商网站的公司

工大智信智能听诊器:为您提供健康报告的私人健康管家 工大智信智能听诊器在日常健康监测中扮演着重要的角色,它的出现为预防疾病提供了有力的支持。以下是工大智信智能听诊器在监测和预防疾病方面的重要性描述,以及它如何帮助用户及早发现健康…

网站建设空间怎么租用网站备案资料修改

数据持久化第一课-准备课 一.预习笔记 1.vs创建控制台项目(F5与CTRLF5的区别) 2.控制台的输入输出(看看源码) Console.Write( ) Console.WriteLine( ) Console.Read() Console.ReadLine() 3.基本数据类型 值类型:简单类型、结构类型、…

富阳区住房和城乡建设局网站dz网站数据备份

一、csv文件 csv文件是逗号分隔值(Comma-Separated Values,CSV)文件的缩写,其文件以纯文本形式存储表格数据(数字和文本),各个字段用逗号进行分割,采用回车进行换行。由于采用纯文本…

在线A视频网站 一级A做爰片网络品牌推广案例

用streamlit实现云台控制界面 效果图PC上的效果手机上的效果 源码: 本文演示了,如何用streamlit做一个云台控制界面。功能包括:用户登录,事件的处理,图片的更新 版本信息: streamlit_authenticator: 下载链接streamlit : 1.31.1python: 3.11 修改点: streamlit_authenticato…

企业网站pc优化关键词搜索优化外包

基础 简介 特点: 高吞吐、低延迟:kafka每秒可以处理几十万条消息,延迟最低只有几毫秒,每个Topic可以分多个Partition,Consumer Group对Partition进行Consumer操作可扩展性:Kafka集群支持热扩展持久性、可…

帝国网站7.2 pc wap 跳转phpstudy 网站空白

Eureka已经被Spring Cloud继承在其子项目spring-cloud-netflix中&#xff0c;搭建Eureka Server的方式还是非常简单的。只需要通过一个独立的maven工程即可搭建Eureka Server。 我们引入spring cloud的依赖和eureka的依赖。 <dependencyManagement><!-- spring clo…