Redis学习笔记-Redis内部数据结构

Redis内部数据结构

Redis和其他key-value数据库的很大区别是它支持非字符串类型的value值。它支持的value值的类型如下:

sds (simple dynamic string) 简单动态字符串 双端链表 字典(dictionary/map/associative array) 跳跃表(skiplist) 下面将对以上的各个类型在redis内部的实现进行分析。

一、sds (simple dynamic string) 简单动态字符串

Redis并没有使用C的字符串,而是在其上面进行了封装,以适应更多频繁的耗时操作。在前面的内容中,我们一直将sds 作为一种抽象数据结构来说明,实际上,它的实现由以下两部分组成:

typedef char *sds;
struct sdshdr {
    // buf 已占用长度
    int len;
    // buf 剩余可用长度
    int free;
    // 实际保存字符串数据的地方
    char buf[];
};

这样的设计对于strlen()和append()操作来说是效率很高的。对于strlen()操作来说,很明显可以通过len属性在O(1)的时间内拿到。对于append()操作,参考下面的例子:

redis> SET msg "hello world"
OK
redis> APPEND msg " again!"
(integer) 18
redis> GET msg
"hello world again!"

看看这个过程中sdshdr的变化情况:

首先,set msg后,sdshdr如下:

struct sdshdr {
    len = 11;
    free = 0;
    buf = "hello world\0";
}

然后,append msg后,sdshdr如下:

struct sdshdr {
    len = 18;
    free = 18;
    // 空白的地方为预分配空间,共18 + 18 + 1 个字节
    buf = "hello world again!\0 ";
}

可以看到,Redis的sds会预分配2倍自己大小的空间,这样就减少了内存的追加操作,即减少了字符串追加操作的时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值