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

东莞有什么做网站的公司中国建设

东莞有什么做网站的公司,中国建设,wordpress怎么搬站,wordpress 评论翻页问题#xff1a; 1. sds 是什么 #xff1f; 2. sds 相对于char * 有什么好处 #xff1f;解决了哪些疑难杂症#xff1f; 3. sds 有什么不足#xff1f;可以优化的点#xff1f; 思考下#xff1a; 平常工作开发中#xff0c;我们记录一条用户信息、订单信息 1. sds 是什么 2. sds 相对于char * 有什么好处 解决了哪些疑难杂症 3. sds 有什么不足可以优化的点 思考下 平常工作开发中我们记录一条用户信息、订单信息redis内部是怎么帮我们把数据存起来的呢是随意allot 一个内存放进去嘛 键值对中的键是字符串值有时也是字符串。我们在 Redis 中写入一条用户信息记录了用户姓名、性别、所在城市等这些都是字符串如下所示 SET user:id:100 {name: zhangsan, gender: M,city:beijing} 大家如果有实际使用过redis那么都应该知道类似这种字符串的操作在Redis中其实是最常见的那么既然它被使用这么频繁字符串的存储需要满足什么要求吗 能支持丰富且高效的字符串操作比如字符串追加、拷贝、比较、获取长度等能保存任意的二进制数据比如图片等 能尽可能地节省内存开销。 在C语言中使用char来实现字符串存储定义了很多方法来满足日常开发比如字符串比较函数 strcmp、字符串长度计算函数 strlen、字符串追加函数 strcat 等。那么下面来看下为什么不能直接使用Char 为什么Redis 不使用C的char呢 首先redis是一个纯内存操作结合它的使用属性可以想到redis 要求性能高、存储小等特点那么反过来看下char是否可以满足呢 首先以字符串‘redis’为例看下使用char的存储结构一块连续的内存空间依次存放了字符串中的每一个字符数组结构。 \0 表示一个字符串的结尾在C语言中char* 指针只是指向字符数组的起始位置而字符数组的结尾位置就用”\0表示 如strlen 函数流程 通过一段代码可以更清晰看到\0的作用这里我创建了两个字符串变量 a 和 b分别给它们赋值为red\0is和redis\0”。然后我用 strlen 函数计算这两个字符串长度如下所示 include stdio.hinclude string.hint main(){char *a red\0is;char *b redis\0;printf(%lu\n, strlen(a));printf(%lu\n, strlen(b));return 0;} 代码执行后输出结果分别是3和5a 3 , b 5 字节。那么看到这问题也就出来了我们都知道Redis是有保存二进制数据的需求的。如果使用char来存储会使二进制数据被截断完全支持不了。 另外回过来看strlen函数虽然可以计算字符串长度但是它也会带来另一方面的负面影响也就是会导致操作函数的复杂度增加。需要遍历字符数组中的每一个字符才能得到字符串长度所以这个操作函数的复杂度是 O(N)。 再来看另一个函数也是常用的strcat追加功能。strcat 函数是将一个源字符串 src 追加到一个目标字符串的末尾。该函数的代码如下所示 char *strcat(char *dest, const char *src) {//将目标字符串复制给tmp变量char *tmp dest;//用一个while循环遍历目标字符串直到遇到\0跳出循环指向目标字符串的末尾while(*dest)dest;//将源字符串中的每个字符逐一赋值到目标字符串中直到遇到结束字符while((*dest *src) ! \0 )return tmp;}从代码中可以看到strcat 函数和 strlen 函数类似复杂度都很高也都需要先通过遍历字符串才能得到目标字符串的末尾。对于 strcat 函数来说还要再遍历源字符串才能完成追加。另外它在把源字符串追加到目标字符串末尾时,还需要确认是否空间足够。 SDS的设计 SDS即简单动态字符串的数据结构。下面我们一起来看看SDS 结构设计 SDS 结构里包含了一个字符数组 buf[]用来保存实际数据。同时SDS 结构里还包含了三个元数据分别是字符数组现有长度 len 、分配给字符数组的空间长度 alloc 以及 SDS 类型 flags。 typedef char *sds;Redis 源码中 SDS 的定义Redis 使用 typedef 给 char* 类型定义了一个别名这个别名就是 sds。如上。那么到这里也可看得出本质其实还是个字符数组只是在字符数组基础上增加了额外的元数据。 接下来看下sdsnewlen 函数 sds sdsnewlen(const void *init, size_t initlen) {void *sh; //指向SDS结构体的指针sds s; //sds类型变量即char*字符数组...sh s_malloc(hdrleninitlen1); //新建SDS结构并分配内存空间...s (char*)shhdrlen; //sds类型变量指向SDS结构体中的buf数组sh指向SDS结构体起始位置hdrlen是SDS结构体中元数据的长度...if (initlen init)memcpy(s, init, initlen); //将要传入的字符串拷贝给sds变量ss[initlen] \0; //变量s末尾增加\0表示字符串结束return s; 详细说下创建一个SDS的过程sdsnewlen 函数会新建 sds 类型变量也就是 char* 类型变量并新建 SDS 结构体把 SDS 结构体中的数组 buf[] 赋给 sds 类型变量。最后sdsnewlen 函数会把要创建的字符串拷贝给 sds 变量。 到此我们已经了解SDS底层数据结构那么对比一下与传统的C语言操作字符串SDS有哪些优点SDS 结构中记录了字符数组已占用的空间和被分配的空间提高读写效率。同样以字符串追加为例Redis 中实现字符串追加的函数是 sds.c 文件中的 sdscatlen 函数。 sds sdscatlen(sds s, const void *t, size_t len) {//获取目标字符串s的当前长度size_t curlen sdslen(s);//根据要追加的长度len和目标字符串s的现有长度判断是否要增加新的空间s sdsMakeRoomFor(s,len);if (s NULL) return NULL;//将源字符串t中len长度的数据拷贝到目标字符串结尾memcpy(scurlen, t, len);//设置目标字符串的最新长度拷贝前长度curlen加上拷贝长度sdssetlen(s, curlenlen);//拷贝后在目标字符串结尾加上\0s[curlenlen] \0;return s; } 同样我们来画个流程图来梳理一下sdscatlen执行流程 和char操作相比SDS 通过记录字符数组的使用长度和分配空间大小避免了对字符串的遍历操作降低了操作开销进一步就可以帮助诸多字符串操作更加高效地完成. 紧凑型字符串结构 简单点说sds设计了不同的结构头也就是不同的类型为了能灵活的保存不同大小的字符串从而有效节省内存空间。保存不同大小的字符串时结构头占用的内存空间也不一样在保存小字符串时结构头占用的空间也比较少。 官方话语来说就是SDS 一共设计了 5 种类型分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64。主要区别就在于它们数据结构中的字符数组现有长度 len 和分配空间长度 alloc这两个元数据的数据类型不同。 // attribute__ (__packed__) 采用紧凑的方式分配内存 struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* 字符数组现有长度*/uint8_t alloc; /* 字符数组的已分配空间不包括结构体和\0结束字符*/unsigned char flags; /* SDS类型*/char buf[]; /*字符数组*/ }; 上面代码片段可以看到len、 alloc 都是uint_t 类型。是一个8位无符号整数每个占用一个字节的空间也就是说当字符串类型是 sdshdr8 时它能表示的字符数组长度2的8次方。 同理 sdshdr16、sdshdr32、sdshdr64 三种类型来说它们的 len 和 alloc 数据类型分别是 uint16_t、uint32_t、uint64_t即它们能表示的字符数组长度分别不超过 2 的 16 次方、32 次方和 64 次方。 说到这里也就大概了解不同的类型的作用了那么还有一点要提一下字节对齐方式和紧凑的方式分配内存 对齐和紧凑分配内存 在默认情况下编译器会按照 8 字节对齐的方式给变量分配内存。也就是说即使一个变量的大小不到 8 个字节编译器也会给它分配 8 个字节。 看下面的两个例子大概就懂了 include stdio.hint main() {struct s1 {char a;int b;} ts1;printf(%lu\n, sizeof(ts1));struct __attribute__((packed)) s2{char a;int b;} ts2;printf(%lu\n, sizeof(ts2));} char 类型占用 1 个字节int 类型占用 4 个字节.,sizeof(ts1) 8 , sizeof(ts2) 5,剩下的自己琢磨啦 小结 加油、学到就是赚到哪怕应付面试呢
http://www.w-s-a.com/news/189734/

相关文章:

  • 东道网站建设良品铺子网络营销案例
  • 免费企业查询软件优化模型
  • 兰亭集势的网站平台建设凡科网站免费版怎么做
  • 在网站做推广要钱吗网站根目录是哪个文件夹
  • 网站建设如何弄链接海外vps一键配置WordPress
  • 1个ip可以做几个网站吗动画制作可以自学吗
  • 顺德建设局网站如何搭建网站
  • 精品网站建设费用 干净磐石网络网页制作简单作业
  • 网站建设需要用软件群晖怎样做网站
  • 网站建设公司有哪博客网站建设方案书
  • 服装商城的网站建设宿迁论坛
  • 网站建设服务市场趋势淮南市网站开发的方式
  • 交互设计包含网站设计wordpress和discuz共存
  • 淮阳城乡建设局网站在线网页翻译软件
  • 什么是电商视觉设计郑州seo服务
  • google网站设计原则青海网站建设与管理
  • 简述网站的创建流程广西网站建设定制
  • 唐河网站制作汉中建设工程招标新闻中心
  • 网站过期就可以抢注PHP框架和wordpress
  • 天津做网站得公司克隆网站到wordpress修改
  • 郫县网站建设网站建设报价单及项目收费明细表
  • 商标做网站logo建网站作业
  • 网站顶部展出的大幅广告中建八局第二建设有限公司
  • 公众微信绑定网站帐号优秀中文网页设计
  • 如何做漫画赚钱的网站企业网站管理系统c
  • 安康公司网站制作搜狗网站
  • 太仓住房与城乡建设局网站注册推广赚钱一个80元
  • wordpress 网站生成app企业网站改版的好处
  • 广州建站服务怎么让客户做网站
  • 南京手机网站设计公司wordpress导航页