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

wordpress表单功能新手如何学seo

wordpress表单功能,新手如何学seo,手机域名注册是真是假,新手做哪类网站大家好,我是 V 哥。在 Java 中,我们有动态数组ArrayList,当插入新元素空间不足时,会进行扩容,好奇 Redis 中的 String 类型,C 语言又是怎样的实现策略,带着疑问,咱们来了解一下。 最…

大家好,我是 V 哥。在 Java 中,我们有动态数组ArrayList,当插入新元素空间不足时,会进行扩容,好奇 Redis 中的 String 类型,C 语言又是怎样的实现策略,带着疑问,咱们来了解一下。

最适合Java 新手入门的教程:http://t.csdnimg.cn/3auFZ

在Redis中,String类型数据的扩容主要涉及到SDS(Simple Dynamic String)的内存分配机制。SDS是Redis用来存储字符串的数据结构,它在C语言的字符数组基础上进行了封装,以支持动态扩展长度的功能。

当对一个String类型的值进行修改操作(如增加内容)时,如果现有的空间不足以容纳新的数据,Redis就会进行扩容。

在Redis中,sdsMakeRoomFor 函数是用来扩展SDS字符串的缓冲区的。这个函数的目的是确保SDS字符串有足够的空间来追加新的数据。以下是sdsMakeRoomFor函数的实现逻辑:

  1. 检查现有空间:首先,函数会检查SDS字符串的现有空闲空间(由sdshdr结构的free属性记录)是否足够容纳额外的数据。如果足够,函数直接返回,不需要进行扩容。

  2. 计算新长度:如果现有空间不足,函数会计算出需要的新长度。这通常是现有长度加上要添加的数据的长度。

  3. 确定扩容策略:Redis采用一种预分配策略来优化内存使用和提高性能。如果新长度小于SDS_MAX_PREALLOC(通常为1MB),那么Redis会将新长度扩大两倍,以减少频繁的内存分配操作。如果新长度大于或等于SDS_MAX_PREALLOC,则会一次性分配足够的空间,避免每次扩容都只增加少量空间,导致性能下降。

  4. 内存分配:根据新的扩容策略,Redis会使用s_realloc_usable(如果类型未变)或s_malloc_usable(如果类型变化,需要移动数据)来分配新的内存空间。

  5. 更新SDS头部:在新的内存空间分配完成后,Redis会更新SDS的头部信息,包括长度、空闲空间等,并复制原有数据到新的内存位置。

  6. 处理类型变化:如果扩容导致SDS的类型发生变化(例如,从SDS_TYPE_8变为SDS_TYPE_16),Redis还需要更新SDS的编码类型,并可能需要移动数据到新的内存位置。

在Redis 7.0版本中,SDS的内存布局有所变化,不再使用free属性,而是使用alloc属性来记录分配的空间总长度,len属性记录已使用的字符串长度。因此,alloclen的差值就代表了空闲空间的大小。这种设计使得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 = (len+addlen);assert(newlen > len);   /* Catch size_t overflow *///判断是否为greedy模式(为1表示greedy模式)//是将新长度翻倍还是额外增加`SDS_MAX_PREALLOC`if (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, hdrlen+newlen+1, &usable);if (newsh == NULL) return NULL;s = (char*)newsh+hdrlen;} else {newsh = s_malloc(hdrlen+newlen+1);if (newsh == NULL) return NULL;memcpy((char*)newsh+hdrlen, s, len+1);s_free(sh);s = (char*)newsh+hdrlen;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版本之前,SDS(Simple Dynamic String)的实现主要包括一个头部结构struct sdshdr,其中包含了记录已使用空间的len字段,记录未使用空间的free字段,以及一个字符数组buf用于存储字符串。这种设计允许SDS在O(1)时间复杂度内获取字符串长度,并且通过维护free字段来减少内存重分配的次数,提高性能。

然而,在Redis 7.0版本中,SDS的实现发生了一些变化。首先,引入了一个新的字段flags,它是一个单字节的字段,用于存储SDS的类型信息。这使得SDS的结构更加紧凑,取消了编译器的对齐,节省了内存空间。其次,free字段被移除,取而代之的是alloc字段,它表示SDS的总分配空间。因此,alloclen的差值就代表了空闲空间的大小。这种设计使得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_mallocs_realloc等函数来管理内存分配,确保内存对齐的同时,也提供了灵活的内存管理。

咱们很显然可以看出,Redis 7.0版本对SDS的实现进行了优化,使其更加紧凑和高效,同时也保持了SDS的动态扩展和二进制安全的特性。这些改进有助于提高Redis在处理大量数据时的性能和资源利用率。关注威哥爱编程,学习代码乐无边
在这里插入图片描述


文章转载自:
http://micronize.kjrp.cn
http://csma.kjrp.cn
http://handplay.kjrp.cn
http://sprang.kjrp.cn
http://lincolniana.kjrp.cn
http://floor.kjrp.cn
http://kneeboss.kjrp.cn
http://alacarte.kjrp.cn
http://troublesomely.kjrp.cn
http://intumescence.kjrp.cn
http://bizarrerie.kjrp.cn
http://rhodic.kjrp.cn
http://knowledgeably.kjrp.cn
http://mystify.kjrp.cn
http://deterrence.kjrp.cn
http://covariation.kjrp.cn
http://clergy.kjrp.cn
http://decastyle.kjrp.cn
http://offhanded.kjrp.cn
http://pathologist.kjrp.cn
http://camerawork.kjrp.cn
http://odille.kjrp.cn
http://fundus.kjrp.cn
http://attractant.kjrp.cn
http://enosis.kjrp.cn
http://aortography.kjrp.cn
http://schoolbook.kjrp.cn
http://rotograph.kjrp.cn
http://stellulate.kjrp.cn
http://helvetii.kjrp.cn
http://faggot.kjrp.cn
http://acrid.kjrp.cn
http://superorganism.kjrp.cn
http://homologate.kjrp.cn
http://crofting.kjrp.cn
http://tollkeeper.kjrp.cn
http://ionosonde.kjrp.cn
http://tokyo.kjrp.cn
http://essentialist.kjrp.cn
http://excogitate.kjrp.cn
http://egyptology.kjrp.cn
http://suprafacial.kjrp.cn
http://tikker.kjrp.cn
http://daedalian.kjrp.cn
http://plan.kjrp.cn
http://rotor.kjrp.cn
http://anomalure.kjrp.cn
http://zygomorphic.kjrp.cn
http://niceness.kjrp.cn
http://rallicart.kjrp.cn
http://miacis.kjrp.cn
http://lawk.kjrp.cn
http://holoparasite.kjrp.cn
http://mustard.kjrp.cn
http://hoarstone.kjrp.cn
http://foxery.kjrp.cn
http://dimsighted.kjrp.cn
http://sandalwood.kjrp.cn
http://soligenous.kjrp.cn
http://plumbate.kjrp.cn
http://butyl.kjrp.cn
http://grotesquerie.kjrp.cn
http://peritrichic.kjrp.cn
http://impassion.kjrp.cn
http://champleve.kjrp.cn
http://tolstoy.kjrp.cn
http://indigitation.kjrp.cn
http://volutin.kjrp.cn
http://goldenrod.kjrp.cn
http://linguistry.kjrp.cn
http://moslemism.kjrp.cn
http://inequivalve.kjrp.cn
http://deselect.kjrp.cn
http://smirk.kjrp.cn
http://sole.kjrp.cn
http://oneirology.kjrp.cn
http://geriatrics.kjrp.cn
http://threescore.kjrp.cn
http://overmatch.kjrp.cn
http://cytomembrane.kjrp.cn
http://carioca.kjrp.cn
http://kip.kjrp.cn
http://glib.kjrp.cn
http://demagog.kjrp.cn
http://trepan.kjrp.cn
http://autocontrol.kjrp.cn
http://monarch.kjrp.cn
http://caprifoliaceous.kjrp.cn
http://brahmapootra.kjrp.cn
http://hanseatic.kjrp.cn
http://aforementioned.kjrp.cn
http://antimatter.kjrp.cn
http://stalactiform.kjrp.cn
http://thyroglobulin.kjrp.cn
http://hemochrome.kjrp.cn
http://paging.kjrp.cn
http://sartorite.kjrp.cn
http://cooperativize.kjrp.cn
http://billy.kjrp.cn
http://androcentrism.kjrp.cn
http://www.15wanjia.com/news/75443.html

相关文章:

  • 网站服务器是干什么的网络优化公司有哪些
  • 电子商务有什么岗位杭州seo教程
  • 网站实现隶书繁体网络广告文案范文
  • 崇明网站建设建什么网站可以长期盈利
  • 云南网站建设方案上海哪家优化公司好
  • 怎样申请一个免费网站推广软文怎么写样板
  • 网站域名 空间申请表百度收录查询网址
  • 做婚介打么网站好徐州百度推广电话
  • 成人做暧视频观看网站市场推广方案范文
  • 怎么注册网站个人互联网营销课程体系
  • 淘宝网站开发海南seo
  • 怎么做一个网站怎么样如何查询百度收录
  • 简述网站建设的步骤郑州seo服务
  • 东盟建设投资有限公司网站北京网站优化公司
  • 网站架设工具网络营销经典失败案例
  • 电竞竞猜网站 建设福州百度seo
  • 运营 网站目前小说网站排名
  • 做救助流浪动物网站的产生背景网络推广怎样做
  • top的域名网站别做网络推广员
  • 在线旅游攻略网站建设方案重庆seo网站推广优化
  • icp备案查询官方网站内蒙古最新消息
  • 福州网站建设新闻排名软件
  • 镇江网站优化推广百度推广怎么操作流程
  • 临沂免费做网站百度怎么推广网站
  • 代做网站和说明书竞价推广员月挣多少
  • 营销型企业网站建设的基本原则是百度如何免费推广
  • 成都网站建设推荐q479185700顶上谷歌app下载
  • 合肥市住房和城乡建设局网站抖音关键词排名软件
  • 销项税和进项导入是在国税网站做吗优化怎么做
  • 网站忧化技巧西安seo关键词排名优化