一、前言

Redis有五种基本数据结构:字符串、hash、set、zset、list。下面解释下载Redis 3.0.6版本中底层是怎样实现他们的。

二、动态字符串SDS

SDS是“simple dynamic string”的缩写。Redis中所有场景出现的字符串,基本都是有SDS来实现的:

  • 所有非数字的key, 如:set msg “hello” 中的key msg
  • 字符串数据类型的值,如:set msg “hello” 中的value “hello”
  • 非字符串数据类型中的“字符串值”,如:rpush fruits “apple” “banana"中的"apple” “banana”

SDS长这样:
Redis五种数据结构的底层实现
free:还剩多少空间
len:字符串长度
buf:存放的字符数组

2.1、空间预分配

为减少修改字符串代理的内存重分配次数,SDS采用了“一次管够“的策略:

  • 若修改之后SDS长度 < 1MB,则多分配现有len长度的空间
  • 若修改之后SDS长度 >= 1MB ,则扩充除了满足修改之后的长度外,额外多1MB空间。

2.2、惰性空间释放

为避免缩短字符串时候的内存重分配操作,SDS在数据减少时,并不立刻释放空间。

三、int

就是redis中存放的各种数字,包括故意加“”的
set game “111”

四、双向链表

双向链表如lpush, rpush, lpop, rpop
长这样:
Redis五种数据结构的底层实现
分两部分:

  • “统筹部分”:橘黄色
    • head:指向具体双向链表的头
    • tail:指向具体双向链表的尾
    • len:双向链表的长度
  • “具体实施方”:蓝色
    • 有前驱pre和后继next

双向链表由 list 和 listNode 两个数据结构构成。

相关文章: