redis 源码解读

1. 工欲善其事,必先利其器。使用git clone redis 源码,使用Clion打开工程。如果是使用mac,务必先安装xcode。但是Clion只支持CmakeFile,不支持Makefile,所以要手动增加一下配置:

cmake_minimum_required(VERSION 3.8)
project(redis-3.12)

set(CMAKE_C_STANDARD 99)

set(SOURCE_FILES ./src )
add_library(redis ${SOURCE_FILES})

set(INC_DIR ./deps/lua/src ./deps/hiredis ./deps/jemalloc/src ./deps/hiredis ./deps/hiredis/adapters)

include_directories($(INC_DIR))

2. sds。其实sds非常简单,真的是sds

typedef char *sds;
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就是一个char*,再简单不过的结构了。然而,这里有点tricky的地方在于sds自己还管理了一些元数据,比如数据长度len,分配的空间大小alloc,标志位flags(这个字段低三位目前存储的是sds的类型),真正的数据放在buf中。sdsnewlen会创建一个新的sds。创建一个sds会在堆上分配 hdrlen+initlen+1个字节的数据,但是只有其中的initlen字节是真正的数据。最后创建成功之后,返回的不是整个数据的头部字节,而是偏移到数据位置的字节。这样我们在使用sds的时候,和普通的char*没有区别,但是sds还额外维护了很多元数据。这样,我们在获取数据长度等操作上就会非常高效。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值