锅炉信息网 > 锅炉知识 > 锅炉百科

redis sds

发布时间:

参考内容:要懂redis,首先得看懂sds(全网最细节的sds讲解) - 掘金 (juejin.cn)简单动态字符串 — Redis 设计与实现 (redisbook.readth

参考内容:

  • 要懂redis,首先得看懂sds(全网最细节的sds讲解) - 掘金 (juejin.cn)
  • 简单动态字符串 — Redis 设计与实现 (redisbook.readthedocs.io)

redis 中以 sds (simple dynamic string,简单动态字符串)来表示字符串(既是 redis 中一种基础数据结构,也是 redis 内部用于代替 c 语言中 char* 的数据结构)。

sds 定义

//定义了一个char 指针ntypedef char *sds;nn/* Note: sdshdr5 is never used, we just access the flags byte directly.n * However is here to document the layout of type 5 SDS strings. */nnstruct __attribute__ ((__packed__)) sdshdr5 {n unsigned char flags;n char buf[];n};nn//__attribute__ ((__packed__)) 代表structure 采用手动对齐的方式。nstruct __attribute__ ((__packed__)) sdshdr8 {n uint8_t len; // 已占用内存单位长度n uint8_t alloc; //buf 分配的长度,等于buf[]的总长度-1,因为buf有包括一个/0的结束符,即总共可用内存单位长度n unsigned char flags; //只有3位有效位,因为类型的表示就是0到4,所有这个8位的flags 有5位没有被用到n char buf[]; // 数据实际的内存空间n};n// 与上面的变化只有 len 和 alloc,使用了 uint16_t, uint32_t, unit64_tnstruct __attribute__ ((__packed__)) sdshdr16 {n ...n};nstruct __attribute__ ((__packed__)) sdshdr32 {n ...n};nstruct __attribute__ ((__packed__)) sdshdr64 {n ...n};

sds 扩容

如果你有稍微看过一点 java 中 ArrayList 的实现的话,两者的实现是类似的。在需要重新分配内存时,如果所需的内存不超过某个限制,那么分配两倍的内存,避免频繁内存分配,如果超过某个限制,那么只分配需要的内存空间。

sds 内存不对齐

内存对齐:简单的说,cpu 读取内存并不是以 byte 为单位的,通常以 64/32 位(也和 cache 的缓存行有关),内存对齐就是将所用的内存填补为读取内存单位的整数倍,下图中的 pad 部分。

内存不对齐的原因我认为并不是一种技术问题,是一种设计的态度,worse is better,能够较简单的实现是最重用的。如果引入内存对齐,那么需要在 32/64 位,以及不同的单位内存长度的 sds 结构做不同的调整,而且为了兼容 char*(sds 使用指针的一些操作兼容了 char* )指针直接指向数据的首位,而不利于获取当前的状态(即移动指针,获取 flag 内容),做内存对齐将会引入这一部分的工作使结构变复杂。

原文链接:redis sds (kicey.site)

精选推荐

  • 711关东煮供应商
    711关东煮供应商

    今天给大家介绍三位,奶粉,全家、罗森这些便利店里关东煮的供应商。店里卖三四块钱一串的关东煮,在网上买不到,一块钱就搞定。首先关东

  • 健康日历|高压锅容易爆炸的4个原因
    健康日历|高压锅容易爆炸的4个原因

    来源:医药养生保健报设计:李雅琴医学审核:姜峰出品人:胡丽丽

  • 高炉
    高炉

    今天这活却是个白事,等到了时辰,那家人便准备火化,本来准备送普炉,我却心中一动,便对那家人说道:“这老人走也不要省,还是送高炉吧。”

  • 高压锅和电压力锅的区别,推荐几款点压力锅
    高压锅和电压力锅的区别,推荐几款点压

    记得之前有一次去朋友家玩,他正在用高压锅煮小米粥,是的,高压锅压小米粥,大概煮了半小时,高压锅突然爆炸了,现场惨不忍睹啊,幸好厨房里没

0