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

做网站需要雇什么人搜索网站的浏览器

做网站需要雇什么人,搜索网站的浏览器,wordpress点击图片悬浮,诗词门户网站Redis 设计了简单动态字符串(Simple Dynamic String,SDS)的结构,用来表示 字符串。相比于 C 语言中的字符串实现,SDS 这种字符串的实现方式,会提升字符串的操 作效率,并且可以用来保存二进制数据…

        Redis 设计了简单动态字符串(Simple Dynamic String,SDS)的结构,用来表示
字符串。相比于 C 语言中的字符串实现,SDS 这种字符串的实现方式,会提升字符串的操
作效率,并且可以用来保存二进制数据

为什么 Redis 不用 char*?

首先得先了解char* 字符串数组的结构特点,还有 Redis对字符串的需求是什么,所以下面我们就来具体分析一下

char* 的结构设计

char*字符数组的结构很简单,就是一块连续的内存空间,依次存放了字符串中的每一个
字符。比如,下图显示的就是字符串“redis”的char*数组结构。、

 从图中可以看到,字符数组的最后一个字符是“\0”,这个字符的作用是什么呢?其实,C
语言在对字符串进行操作时,char* 指针只是指向字符数组的起始位置,而字符数组的结尾
位置就用“\0”表示,意思是指字符串的结束

c语言标准库呢就是检查字符这个字符是不是\0然后不是加一往下走,是的话结束

创建了两个字串变量 a 和 b,分别给它们赋值为“red\0is”和“redis\0”。然后,我用 strlen 函数
计算这两个字符串长度,如下所示:

 当程序执行完这段代码后,输出的结果分别是 3 和 5。

也就是说,char* 字符串以“\0”表示字符串的结束,其实会给我们保存数据带来一定的负
面影响。如果我们要保存的数据中,本身就有“\0”,那么数据在“\0”处就会被截断,
而这就不符合 Redis 希望能保存任意二进制数据的需求了

操作函数复杂度

用char* 会导致复杂度增加

字符串追加函数 strcat 和上边的strlen函数都需要遍历到字符串的末尾


SDS 的设计思想

因为 Redis 是使用 C 语言开发的,所以为了保证能尽量复用 C 标准库中的字符串操作函
数,Redis 保留了使用字符数组来保存实际的数据。但是,和 C 语言仅用字符数组不同,
Redis 还专门设计了 SDS(即简单动态字符串)的数据结构

SDS 结构设计

首先,SDS 结构里包含了一个字符数组 buf[],用来保存实际数据。同时,SDS 结构里还
包含了三个元数据,分别是字符数组现有长度 len、分配给字符数组的空间长度 alloc,以
及 SDS 类型 flags
。其中,Redis 给 len 和 alloc 这两个元数据定义了多种数据类型,进
而可以用来表示不同类型的 SDS

在 Redis 源码中查找过 SDS 的定义,那你可能会看到,Redis 使用 typedef
给 char* 类型定义了一个别名,这个别名就是 sds 

typedef char *sds;

因为 SDS 本质还是字符数组,只是在字符数组基础上增加了额外的元数据。在
Redis 中需要用到字符数组时,就直接使用 sds 这个别名。

在创建新的字符串时,Redis 会调用 SDS 创建函数 sdsnewlen。sdsnewlen 函数
会新建 sds 类型变量(也就是 char* 类型变量),并新建 SDS 结构体,把 SDS 结构体中

的数组 buf[] 赋给 sds 类型变量。最后,sdsnewlen 函数会把要创建的字符串拷贝给 sds
变量。下面的代码就显示了 sdsnewlen 函数的这个操作逻辑,你可以看下

 SDS操作效率

因为它本身的数据结构

紧凑型字符串结构的编程技巧

SDS 结构中有一个元数据 flags,表示的是 SDS 类型

事实上,SDS 一共设计了 5 种类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64

这 5种类型的主要区别就在于,它们数据结构中的字符数组现有长度 len 和分配空间长度
alloc,这两个元数据的数据类型不同。

因为 sdshdr5 这一类型 Redis 已经不再使用了,主要来了解下剩余的 4 种类
型。以 sdshdr8 为例,它的定义如下所示

 我们可以看到,现有长度 len 和已分配空间 alloc 的数据类型都是 uint8_t。uint8_t 是 8
位无符号整型,会占用 1 字节的内存空间。当字符串类型是 sdshdr8 时,它能表示的字符
数组长度(包括数组最后一位\0)不会超过 256 字节(2 的 8 次方等于 256)。

而对于 sdshdr16、sdshdr32、sdshdr64 三种类型来说,它们的 len 和 alloc 数据类型分
别是 uint16_t、uint32_t、uint64_t,即它们能表示的字符数组长度,分别不超过 2 的 16
次方、32 次方和 64 次方。这两个元数据占用的内存空间在 sdshdr16、sdshdr32、
sdshdr64 类型中,则分别是 2 字节、4 字节和 8 字节。

SDS 之所以设计不同的结构头(即不同类型),是为了能灵活保存不同大小的字
符串,从而有效节省内存空间

除了设计不同类型的结构头,Redis 在编程上还使用了专门的编译优化来节省内存
空间。在刚才介绍的 sdshdr8 结构定义中,我们可以看到,在 struct 和 sdshdr8 之间使
用了__attribute__ ((__packed__)),如下所示:

struct __attribute__ ((__packed__)) sdshdr8

其实这里,__attribute__ ((__packed__))的作用就是告诉编译器,在编译
sdshdr8 结构时,不要使用字节对齐的方式,而是采用紧凑的方式分配内存。这是因为在
默认情况下,编译器会按照 8 字节对齐的方式,给变量分配内存。也就是说,即使一个变
量的大小不到 8 个字节,编译器也会给它分配 8 个字节

到这里呢需要了解一下,字节对齐是为什么?

http://www.hkea.cn/news/83535/

相关文章:

  • 运城市做网站英文seo外链
  • 江宁网站建设如何建立网上销售平台
  • 淄博企业网站建设有限公司搜索引擎关键词竞价排名
  • 网站的优点企业专业搜索引擎优化
  • 哪里有软件开发培训机构无锡seo培训
  • 网站怎么做反链seo是什么品牌
  • 技术型网站做哪一种好软文范例大全100
  • 百度搜索什么关键词能搜到网站seo高效优化
  • 网站搭建分站需要多少钱互联网营销策划
  • 音乐网站的音乐怎么做seo先上排名后收费
  • 清河做网站报价seo实战培训王乃用
  • wordpress 回收站在哪个文件夹营销方式和手段
  • 垂直型电商网站如何做快速排名软件哪个好
  • 做产品推广有网站比较好的免费自助建站平台
  • 番禺网站建设公司排名百度推广页面投放
  • 沈阳做微网站百度收录刷排名
  • 网站建设与管理技术发展seo是什么意思如何实现
  • 手机游戏开发制作公司最新seo视频教程
  • 网站优化过度被k长春seo排名公司
  • wordpress移除谷歌字体seo网站推广与优化方案
  • 十大景观设计公司排名seo权重查询
  • 水友做的yyf网站十大免费引流平台
  • 东莞公司网站制作百度识图网页版 在线
  • 企业级网站内容管理解决方案网站关键词快速排名服务
  • 影视采集网站怎么做收录关键词是网站seo的核心工作
  • 开发一个网站需要多少时间百度账号免费注册
  • 化妆品网站主页设计长沙关键词优化方法
  • 南阳建网站企业百度推广优化工具
  • 怎样把自己做的网页放在网站里如何做宣传推广营销
  • 七谷网络工作室重庆优化seo