浅谈Redis五种数据结构的底层原理

本文详细探讨了Redis中的五种数据结构——String、List、Hash、Set和Zset的底层实现原理。针对每种数据结构,文章分析了它们的内部结构、优缺点以及在不同版本Redis中的变化,如String使用SDS,List从ziplist到quicklist的演进,Hash的zipmap与dict,Set的intset和dict,以及Zset的跳跃表(skiplist)实现。通过对这些底层结构的理解,有助于更好地理解和应用Redis。
摘要由CSDN通过智能技术生成

概念

Redis作为一个开源的用C编写的非关系型数据库,基于优秀的CRUD效率,常用于软件系统的缓存,其本身提供了以下五种数据格式:

  • string:字符串
  • list:列表
  • hash:散列表
  • set:无序集合
  • zset:有序集合

接下来我们就要针对这五种数据结构,来分析其底层的结构
这里选用的版本是redis-5.0.4,所以可能有很多地方和如今网络上的其他博文不太一致,不同的地方我会在文中指出
string
因为redis使用c语言开发,所以自然没有java和c++的那些字符串类库,在redis中,其自己定义了一种字符串格式,叫做SDS(Simple Dynamic String),即简单动态字符串
这个结构定义在sds.h中:

typedef char *sds;

但是这个sds类型仅作为参数和返回值使用,并不是真正用于操作的类型,真正核心的部分是下面的这些类:

struct __attribute__ ((__packed__)) sdshdr5 {
   unsigned char flags; 
   char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {
   uint8_t len; 
   uint8_t alloc; 
   unsigned char flags; 
   char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {
   uint16_t len;
   uint16_t alloc; 
   unsigned char flags;
   char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {
   uint32_t len;
   uint32_t alloc; 
   unsigned char flags; 
   char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {
   uint64_t len; 
   uint64_t alloc;
   unsigned char flags; 
   char buf[];
};

除掉第一个结

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构没有996

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值