美文网首页
简单动态字符串

简单动态字符串

作者: 左后卫 | 来源:发表于2020-11-11 19:23 被阅读0次

定义

// sds.h
struct sdshdr
{
  unsigned int len;
  unsigned int free;
  char buf[];
}

内存布局

redis_sdshdr.jpg

优势

  1. 常数复杂度获取字符串长度
// 从len字段直接获取长度值
// sds.h
typedef char* sds;
static inline size_t sdslen(const sds s)
{
  struct sdshdr *sh = (void*)(s - sizeof(struct sdshdr));
  return sh->len;
}
  1. 内存预分配和惰性释放
    避免在字符串操作过程中,连续多次申请内存。
    内存分配策略
// sds.h sds.c
#define SDS_MAX_PREALLOC (1024*1024)
sds sdsMakeRoomFor(sds s, size_t addlen)
{
  struct sdshdr *sh, *newsh;
  size_t free = sdsavail(s);
  size_t len, newlen;
  if (free >= addlen)
  {
    return s;
  }
  len = sdslen(s);
  sh = (void*) (s - (sizeof(struct sdshdr)));
  newlen = (len + addlen);
  if (newlen < SDS_MAX_PREALLOC)
  {
    newlen *= 2; // 小于1M时,free == len
  }
  else
  {
    newlen += SDS_MAX_PREALLOC; // 大于1M时,free == 1M
  }
  newsh = zrealloc(sh, sizeof(struct sdshdr) + newlen + 1);
  if (newsh == NULL)
  {
    return NULL;
  }
  newsh->free = newlen - len;
  return newsh->buf;
}
  1. 自定义字符串操作函数
    避免在字符串操作过程中,内存溢出

  2. 兼容部分C语言字符串操作函数

相关文章

  • Redis简单字符串和链表底层实现及特性

    Sds (Simple Dynamic String,简单动态字符串) 简单动态字符串实现 Redis的简单动态字...

  • 数据结构与对象

    简单动态字符串 简单动态字符串(simple dynamic string,SDS),结构体非常简单 redis中...

  • Redis 设计与实现 -- 阅读笔记

    一、简单动态字符串(SDS) 简单动态字符串(simple dynamic string, SDS) 是 Redi...

  • 【Redis5.X源码分析】系列之字符串

    引入简单动态字符串 简单动态字符串(Simple Dynamic String 简称SDS)是Redis为了高效安...

  • 聊一聊Redis之数据结构

    基本数据结构 简单动态字符串 Redis中的字符串使用“简单动态字符串”(SDS)表示,无论是字符串值还是键底层都...

  • redis

    redis Redis 数据结构和底层实现string:简单动态字符串SDS,Redis 的字符串是动态字符串,是...

  • Redis 数据结构之SDS

    Redis 数据结构之SDS 简单动态字符串 为了实现对于字符串的高效操作,Redis 自己构建的一种名为简单动态...

  • Redis数据结构

    一、数据结构 1、简单动态字符串redis 键值对的键是一个字符串对象,对象的底层实现是简单动态字符串 2、链表R...

  • redis-六种数据结构

    六种数据结构 简单动态字符串,链表,字典,跳跃表,整数集合,压缩列表 1. 简单动态字符串 redis使用了一种名...

  • 1.简单动态字符串

    简单动态字符串(simple dynamic string,SDS),Redis默认字符串表示。 一·、SDS定义...

网友评论

      本文标题:简单动态字符串

      本文链接:https://www.haomeiwen.com/subject/ugkybktx.html