Redis常见容器

Redis常见容器

简单动态字符串

Redis常见容器_第1张图片

优势:

  • 尝试复杂度获取字符串长度
  • 杜绝缓冲区溢出
  • 减少修改字符串时带来的内存重分配次数
    • 空间预分配
    • 惰性空间释放
  • 二进制安全(保存二进制文件)
  • 兼容部分C字符串函数

链表

链表节点:

Redis常见容器_第2张图片

链表头:

Redis常见容器_第3张图片

字典

哈希表

Redis常见容器_第4张图片
Redis常见容器_第5张图片

哈希表节点:

Redis常见容器_第6张图片

字典

Redis常见容器_第7张图片

哈希算法与冲突解决

哈希计算:

# 使用字典设置的哈希函数,计算键key的哈希值
hash = dirct->type->hashFunction(key);
# 使用哈希表的sizemaks属性和哈希值,计算出索引值	根据情况不同,hx[x]可以时hx[0]或hx[1]
index = hash & dict->hx[x].sizemask;

冲突解决:

​ 链地址法解决冲突

Rehash

条件:

Redis常见容器_第8张图片

过程:

Redis常见容器_第9张图片

方式:

​ 渐进式rehash

跳跃表

Redis常见容器_第10张图片

image-20200505154234961

整数集合

Redis常见容器_第11张图片

升级:

​ 每当我们要将一个新元素添加到整数集合里面,并且新元素的类型比整数集合现有所有元素的类型都要长时,整数集合需要先进行升级( upgrade),然后才能将新元素添加到整数集合里面。

升级的优势:

  • 提升灵活性
  • 节约内存

压缩列表

Redis常见容器_第12张图片

节点:

Redis常见容器_第13张图片

previous_entry_length:

​ 节点的 previous_entry_length属性以字节为单位,记录了压缩列表中前一个节点的长度。 previous_entry_length属性的长度可以是1字节或者5字节:

  • 属性长度
    • 当前一节点长度小于254字节时,采用1字节空间存储前一节点的长度
    • 当前一节点长度大于等于255字节时,采用5字节空间存储前一节点的长度

encoding:

​ 节点的encoding属性记录了节点的content属性所保存数据的类型以及长度。

  • 属性长度
    • 一字节、两字节或者五字节长,值的最高位为00、01或者10的是字节数组编码:这种编码表示节点的 content属性保存着字节数组,数组的长度由编码除去最高两位之后的其他位记录
    • 一字节长,值的最高位以11开头的是整数编码:这种编码表示节点的 content属性保存着整数值,整数值的类型和长度由编码除去最高两位之后的其他位记录;

content:

​ 节点的 content属性负责保存节点的值,节点值可以是一个字节数组或者整数,值的类型和长度由节点的 encoding属性决定。

连锁更新问题:

插入时的连锁更新:

Redis常见容器_第14张图片

删除时的连锁更新:

Redis常见容器_第15张图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Redis常见容器_第16张图片

你可能感兴趣的:(数据库)