当前位置: 首页 > news >正文

网站建设与维护费做网站的业务员

网站建设与维护费,做网站的业务员,重庆做个网站多少钱,做货代的有哪些网站大家好#xff0c;我是 V 哥。在 Java 中#xff0c;我们有动态数组ArrayList#xff0c;当插入新元素空间不足时#xff0c;会进行扩容#xff0c;好奇 Redis 中的 String 类型#xff0c;C 语言又是怎样的实现策略#xff0c;带着疑问#xff0c;咱们来了解一下。 最…大家好我是 V 哥。在 Java 中我们有动态数组ArrayList当插入新元素空间不足时会进行扩容好奇 Redis 中的 String 类型C 语言又是怎样的实现策略带着疑问咱们来了解一下。 最适合Java 新手入门的教程http://t.csdnimg.cn/3auFZ 在Redis中String类型数据的扩容主要涉及到SDSSimple Dynamic String的内存分配机制。SDS是Redis用来存储字符串的数据结构它在C语言的字符数组基础上进行了封装以支持动态扩展长度的功能。 当对一个String类型的值进行修改操作如增加内容时如果现有的空间不足以容纳新的数据Redis就会进行扩容。 在Redis中sdsMakeRoomFor 函数是用来扩展SDS字符串的缓冲区的。这个函数的目的是确保SDS字符串有足够的空间来追加新的数据。以下是sdsMakeRoomFor函数的实现逻辑 检查现有空间首先函数会检查SDS字符串的现有空闲空间由sdshdr结构的free属性记录是否足够容纳额外的数据。如果足够函数直接返回不需要进行扩容。 计算新长度如果现有空间不足函数会计算出需要的新长度。这通常是现有长度加上要添加的数据的长度。 确定扩容策略Redis采用一种预分配策略来优化内存使用和提高性能。如果新长度小于SDS_MAX_PREALLOC通常为1MB那么Redis会将新长度扩大两倍以减少频繁的内存分配操作。如果新长度大于或等于SDS_MAX_PREALLOC则会一次性分配足够的空间避免每次扩容都只增加少量空间导致性能下降。 内存分配根据新的扩容策略Redis会使用s_realloc_usable如果类型未变或s_malloc_usable如果类型变化需要移动数据来分配新的内存空间。 更新SDS头部在新的内存空间分配完成后Redis会更新SDS的头部信息包括长度、空闲空间等并复制原有数据到新的内存位置。 处理类型变化如果扩容导致SDS的类型发生变化例如从SDS_TYPE_8变为SDS_TYPE_16Redis还需要更新SDS的编码类型并可能需要移动数据到新的内存位置。 在Redis 7.0版本中SDS的内存布局有所变化不再使用free属性而是使用alloc属性来记录分配的空间总长度len属性记录已使用的字符串长度。因此alloc和len的差值就代表了空闲空间的大小。这种设计使得SDS在内存布局上更加紧凑取消了编译器的对齐以节省内存空间。 sdsMakeRoomFor函数的具体实现如下 sds _sdsMakeRoomFor(sds s, size_t addlen, int greedy) {void *sh, *newsh;size_t avail sdsavail(s);size_t len, newlen, reqlen;char type, oldtype s[-1] SDS_TYPE_MASK;int hdrlen;size_t usable;/* 如果有足够的剩余空间直接返回 */if (avail addlen) return s;len sdslen(s);sh (char*)s-sdsHdrSize(oldtype);reqlen newlen (lenaddlen);assert(newlen len); /* Catch size_t overflow *///判断是否为greedy模式为1表示greedy模式//是将新长度翻倍还是额外增加SDS_MAX_PREALLOCif (greedy 1) {if (newlen SDS_MAX_PREALLOC)newlen * 2;elsenewlen SDS_MAX_PREALLOC;}type sdsReqType(newlen);/* 如果类型是SDS_TYPE_5但是用户正在追加字符串那么使用SDS_TYPE_8 */if (type SDS_TYPE_5) type SDS_TYPE_8;hdrlen sdsHdrSize(type);assert(hdrlen newlen 1 reqlen); /* Catch size_t overflow */if (oldtype type) {newsh s_realloc_usable(sh, hdrlennewlen1, usable);if (newsh NULL) return NULL;s (char*)newshhdrlen;} else {newsh s_malloc(hdrlennewlen1);if (newsh NULL) return NULL;memcpy((char*)newshhdrlen, s, len1);s_free(sh);s (char*)newshhdrlen;s[-1] type;sdssetlen(s, len);}usable usable-hdrlen-1;if (usable sdsTypeMaxSize(type))usable sdsTypeMaxSize(type);sdssetalloc(s, usable);return s; }这个函数首先检查是否有足够的空间来追加数据如果没有则根据当前的字符串长度和需要追加的数据长度来计算新的总长度。如果启用了greedy模式它会根据是否超过SDS_MAX_PREALLOC来决定是将新长度翻倍还是额外增加SDS_MAX_PREALLOC。然后它会根据新的总长度来确定新的SDS类型并分配新的内存空间。如果SDS的类型没有变化它会使用s_realloc_usable来扩展现有的内存空间如果类型变化了它会使用s_malloc来分配新的内存空间并将旧数据复制到新位置。最后它会更新SDS头部信息包括长度和分配的空间大小。 注意一下哈在Redis 7.0版本之前的SDS实现和7.0版本之后的实现有哪些变化呢 在Redis 7.0版本之前SDSSimple Dynamic String的实现主要包括一个头部结构struct sdshdr其中包含了记录已使用空间的len字段记录未使用空间的free字段以及一个字符数组buf用于存储字符串。这种设计允许SDS在O(1)时间复杂度内获取字符串长度并且通过维护free字段来减少内存重分配的次数提高性能。 然而在Redis 7.0版本中SDS的实现发生了一些变化。首先引入了一个新的字段flags它是一个单字节的字段用于存储SDS的类型信息。这使得SDS的结构更加紧凑取消了编译器的对齐节省了内存空间。其次free字段被移除取而代之的是alloc字段它表示SDS的总分配空间。因此alloc和len的差值就代表了空闲空间的大小。这种设计使得SDS在内存布局上更加紧凑同时保持了动态扩展长度的功能。 在Redis 7.0版本中SDS的类型被定义为以下几种 SDS_TYPE_5长度小于32的字符串使用flags的5个最高位存储长度。SDS_TYPE_8长度在1到255之间的字符串使用1个字节存储长度。SDS_TYPE_16长度在256到65535之间的字符串使用2个字节存储长度。SDS_TYPE_32长度在65536到4294967295之间的字符串使用4个字节存储长度。SDS_TYPE_64长度大于4294967295的字符串使用8个字节存储长度。 这种设计允许SDS根据字符串的实际长度选择最合适的头部类型从而节省内存。例如对于短字符串可以使用SDS_TYPE_5类型的头部它不包含单独的长度和分配字段而是将这些信息存储在flags字段中。 此外Redis 7.0版本中的SDS实现还包括了一些其他的优化例如使用__attribute__ ((__packed__))来确保结构体在内存中紧凑排列以及通过s_malloc和s_realloc等函数来管理内存分配确保内存对齐的同时也提供了灵活的内存管理。 咱们很显然可以看出Redis 7.0版本对SDS的实现进行了优化使其更加紧凑和高效同时也保持了SDS的动态扩展和二进制安全的特性。这些改进有助于提高Redis在处理大量数据时的性能和资源利用率。关注威哥爱编程学习代码乐无边
http://www.zqtcl.cn/news/654844/

相关文章:

  • 网站图片处理方案动漫制作这个专业怎么样
  • 做写手哪个网站好黄页网站建设黄页网站建设
  • 多语言企业网站免费模板网站哪个好
  • 拟一份饰品网站建设合同襄樊门户网站建设
  • 你对网站第一印象受欢迎的广州做网站
  • 网站开发项目的需求分析浙江省城乡建设网站证件查询
  • 整站seo定制简单 大气 网站模版
  • 网站界面设计策划书怎么做云匠网订单多吗
  • html教程 pdf网站建设优化兰州
  • 招聘网站可以同时做两份简历吗外贸网站示例
  • 黑链 对网站的影响企业融资计划书范本
  • 自己的简历怎么制作网站学院网站建设成效
  • 周口seo 网站郑州建站网站的公司
  • 网站布局模板北京装修大概多少钱一平方
  • 德阳网站建设ghxhwl风景网站模板
  • 昌邑网站建设拓者设计吧现代效果图
  • 学校网站建设成功案例网站开发需要学习哪些内容
  • 怎么让公司建设网站seo于刷网站点击
  • 网站建设合同严瑾建设网站宣传
  • 哪个网站做餐饮推广最好深圳市信任网站
  • 网站模板 整站源码广州网站vi设计报价
  • 百度速页建站wordpress审核插件
  • 怎么给网站wordpress专业的vi设计公司
  • 百度关键词在线优化寻找郑州网站优化公司
  • 网站建设适合什么单位网络推广员工作内容
  • 漂亮的网站维护页面wordpress加个微信登录
  • 网站设计是什么意思创建地址怎么弄
  • nas上建设网站文章网站哪里建设好
  • 消防网站模板广告设计专业需要学什么
  • 建设银行网站首页wordpress 登录函数