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

redis 的 SDS 内存分配

首先最基础的就是一个 redis 对象

typedef struct Object {
    unsigned type: 4;
    unsigned encodings:4;
    void* ptr;
} robj;

其中的ptr 是一个指向底层value的指针, 区别就在于这个执政指向的值是和object 一起创建的, 还是单独创建的, 也就是一个创建2次,一个创建1次:

/*
44是因为 N = 64 - 16(redisObject) - 3(sdshr8) - 1(\0), N = 44 字节。
那么为什么是64减呢,为什么不是别的,因为在目前的x86体系下,一般的缓存行大小是64字节
*/
#define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44
robj *createStringObject(const char *ptr, size_t len) {
    //创建嵌入式字符串,字符串长度小于等于44字节
    if (len <= OBJ_ENCODING_EMBSTR_SIZE_LIMIT)
        return createEmbeddedStringObject(ptr, len);
    //创建普通字符串,字符串长度大于44字节
    else
        return createRawStringObject(ptr,len);
}
  • 当于44的时候使用 createEmbeddedStringObject, 创建一个robj+sdshdr8
robj* createEmbeddedStringObject(char* ptr, size_t len)
{
    //创建的是robj+sdshdr8
    //|--robj--|--sdshdr8--|
    robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr8)+len+1);
    
    struct sdshdr8 *sh = (void*)(o+1);
    o->ptr = sh;

    //直接拷贝 
    memcpy(sh->buf, ptr, len);
    sh->buf[len] = '\0';
}
  • 当大于44的时候使用需要分配2次:
//>44, 需要分配两次内存
robj *createRawStringObject(const char *ptr, size_t len) {
    return createObject(OBJ_STRING, sdsnewlen(ptr,len));
}

robj *createObject(int type, void *ptr) {
    //给redisObject结构体分配空间
    robj *o = zmalloc(sizeof(*o));
    //设置redisObject的类型
    o->type = type;
    //设置redisObject的编码类型,此处是OBJ_ENCODING_RAW,表示常规的SDS
    o->encoding = OBJ_ENCODING_RAW;
    //直接将传入的指针赋值给redisObject中的指针。
    o->ptr = ptr;
    o->refcount = 1;return o;
}

http://www.kler.cn/a/508511.html

相关文章:

  • SpringBoot:RestTemplate与IllegalArgumentException
  • 使用 Docker 部署 Java 项目(通俗易懂)
  • Oracle报错ORA-01078、LRM-00109
  • 【c++】哈希
  • 嵌入式系统Linux实时化(四)Xenomai应用开发测试
  • 数据结构--二叉树
  • salesforce flow如何实现延时
  • qBittorent访问webui时提示unauthorized解决方法
  • 使用 Java 实现基于 DFA 算法的敏感词检测
  • doris:导入概览
  • 【大数据】机器学习----------集成学习
  • mysql之联合索引
  • 【数据分析与可视化】Python绘制数据地图-GeoPandas地图可视化
  • 【STM32-学习笔记-10-】BKP备份寄存器+时间戳
  • 【自然语言处理】BERT系列模型-详解
  • 使用 electron-builder 构建一个 Electron 应用程序 常见问题以及解决办法
  • 东芝e-STUDIO2829A复印机提示“维护”该如何操作
  • js实现数据结构
  • 掌握Linux系统优化的技巧:提升服务器性能的指南
  • 模之屋模型导入到UE5
  • XML、HTML 和 JSON 的区别与联系
  • React第二十二章(useDebugValue)
  • TikTok专线服务器助力品牌营销新高度
  • Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250117
  • magic-dash:纯Python轻松开发网页应用
  • 使用 Vue.js 3 开发动态模块化组件:实现插件式表单系统