当前位置: 首页 > 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.yayakq.cn/news/330804/

相关文章:

  • 外贸网站设计多少钱高明网站建设公司
  • 做摄影网站公司网站建设素材包
  • 广州网站建设公司推荐乐云seo全国免费发布信息平台
  • 网页开发网站网站建设技术大赛试题
  • 网站关键词密度查询网站备案代码如何加到
  • 石家庄语音网站建设公司简述建设网站的具体步骤
  • 深圳网站建设saote重庆建设工程信息网一般多长时间解除屏蔽
  • 网站内容策划书如何来做网站优化
  • 昆明建站网址wordpress 免密码
  • 进一步网站建设php做小公司网站用什么框架
  • 泰州网站建设定制discuz 与Wordpress
  • 做付费网站站长全自动年赚30万网站代运营 如何纳税
  • 泰安网站建设最好帮人做网站怎么收费
  • 青海做网站的公司浪网站制作
  • 山东移动网站建设网站建设规划书
  • 做网页的网站叫什么软件企业网站建设 推广
  • 做网站需要几大模板漳州市芗城区建设局网站
  • 阿里云 多域名解析 到不同的网站资质升级业绩备案在哪个网站做
  • 蓟州网站建设福州网络营销
  • 西安手机商城网站建设做游戏排行榜的网站模板
  • 网站优化3个关键词和10个关键词的区别怎么自己搭建一个网站
  • 口碑好的定制网站建设提供商wordpress 关键词 描述 插件
  • 网站代码开发文档模板网站建设开题报告ppt模板
  • 专业做国际网站如何管理手机网站源码
  • 广州达美网站建设初中生怎么升大专学历
  • 配置网站开发环境网页制作需要会哪些
  • 重庆市建设工程节能中心网站iis7.5 查看网站流量
  • 网站开发实训小结网页设计工作目标
  • 更改网站后台深圳seo网站排名优化
  • 东莞网站系统后缀网站登录不了