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

网页登录页面设计模板安徽关键词seo

网页登录页面设计模板,安徽关键词seo,杭州做网站建设,wordpress 批量产品尺码Redis中String 的底层实现是什么? Redis 是基于 C 语言编写的,但 Redis 的 String 类型的底层实现并不是 C 语言中的字符串(即以空字符 \0 结尾的字符数组),而是自己编写了 SDS(Simple Dynamic String&…

Redis中String 的底层实现是什么?

Redis 是基于 C 语言编写的,但 Redis 的 String 类型的底层实现并不是 C 语言中的字符串(即以空字符 \0 结尾的字符数组),而是自己编写了 SDS(Simple Dynamic String,简单动态字符串) 来作为底层实现。

SDS 最早是 Redis 作者为日常 C 语言开发而设计的 C 字符串,后来被应用到了 Redis 上,并经过了大量的修改完善以适合高性能操作。

Redis7.0 的 SDS 的部分源码如下(redis/src/sds.h at 7.0 · redis/redis · GitHub):

/* Note: sdshdr5 is never used, we just access the flags byte directly.* However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* used */uint32_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* used */uint64_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};

通过源码可以看出,SDS 共有五种实现方式 SDS_TYPE_5(并未用到)、SDS_TYPE_8、SDS_TYPE_16、SDS_TYPE_32、SDS_TYPE_64,其中只有后四种实际用到。Redis 会根据初始化的长度决定使用哪种类型,从而减少内存的使用。

类型字节
sdshdr5< 1<8
sdshdr818
sdshdr16216
sdshdr32432
sdshdr64864

对于后四种实现都包含了下面这 4 个属性:

  • len:字符串的长度也就是已经使用的字节数

  • alloc:总共可用的字符空间大小,alloc-len 就是 SDS 剩余的空间大小

  • buf[]:实际存储字符串的数组

  • flags:低三位保存类型标志

SDS 相比于 C 语言中的字符串有如下提升:

  1. 可以避免缓冲区溢出:C 语言中的字符串被修改(比如拼接)时,一旦没有分配足够长度的内存空间,就会造成缓冲区溢出。SDS 被修改时,会先根据 len 属性检查空间大小是否满足要求,如果不满足,则先扩展至所需大小再进行修改操作。

  2. 获取字符串长度的复杂度较低:C 语言中的字符串的长度通常是经过遍历计数来实现的,时间复杂度为 O(n)。SDS 的长度获取直接读取 len 属性即可,时间复杂度为 O(1)。

  3. 减少内存分配次数:为了避免修改(增加/减少)字符串时,每次都需要重新分配内存(C 语言的字符串是这样的),SDS 实现了空间预分配和惰性空间释放两种优化策略。当 SDS 需要增加字符串时,Redis 会为 SDS 分配好内存,并且根据特定的算法分配多余的内存,这样可以减少连续执行字符串增长操作所需的内存重分配次数。当 SDS 需要减少字符串时,这部分内存不会立即被回收,会被记录下来,等待后续使用(支持手动释放,有对应的 API)。

  4. 二进制安全:C 语言中的字符串以空字符 \0 作为字符串结束的标识,这存在一些问题,像一些二进制文件(比如图片、视频、音频)就可能包括空字符,C 字符串无法正确保存。SDS 使用 len 属性判断字符串是否结束,不存在这个问题。

🤐 多提一嘴,很多文章里 SDS 的定义是下面这样的:

struct sdshdr {unsigned int len;unsigned int free;char buf[];
};

这个也没错,Redis 3.2 之前就是这样定义的。后来,由于这种方式的定义存在问题,lenfree 的定义用了 4 个字节,造成了浪费。Redis 3.2 之后,Redis 改进了 SDS 的定义,将其划分为了现在的 5 种类型。

http://www.dinnco.com/news/37438.html

相关文章:

  • 郑州北环网站建设培训江西省水文监测中心
  • 在常州 做兼职上什么网站自己如何免费做网站
  • 几分钟做网站淘宝app官方下载
  • 广州市做网站网络营销swot分析
  • 公司建网站多网站制作的基本流程是什么
  • 公司网站改版要怎么做aso推广方案
  • 自我介绍网页模板代码十大seo公司
  • wordpress固定连接只能访问首页抖音搜索优化
  • 什么网站可以做网站网络推广的常用方法
  • 微信编辑器做网站绍兴seo排名公司
  • 专业的营销网站建设公司百度信息流开户多少钱
  • 信息推广的方式有哪些网站优化网
  • 做a暧小视频在线观看网站seo网络培训
  • 企业网站建设需要哪些东西电子商务培训
  • 西安网站建设报价方案凡科建站怎么样
  • 网站建设不足之处软文推广的优点
  • wordpress 分类 标题合肥网站优化平台
  • vs 网站开发教程重庆网站快速排名优化
  • 网站关键词优化排名软件系统怎么做网站优化排名
  • wordpress钉钉登陆长沙百度快速优化排名
  • 广州网站快速制作免费网站推广产品
  • python是什么意思seo是什么职位缩写
  • wordpress文章页横幅湖南关键词优化快速
  • 优秀网页欣赏seo建站系统
  • 代做寄生虫网站排行榜哪个网站最好
  • 制作网站注意哪些问题长沙百度推广排名优化
  • 做微网站的公司广州网站seo
  • 免费商城网站模板下载b2b网站有哪些平台
  • 海宁做网站免费推广网址
  • 中国美院网站建设公司市场营销四大基本策略