zoukankan      html  css  js  c++  java
  • redis五大数据结构

    1、二进制安全的动态字符串,简单动态字符串(simple dynamic string,SDS)的抽象类型。大于1M数据就扩容两倍扩容字符串长度,否则扩容SDS_MAX_PREALLOC(1M)
    SDS结构如下:
    struct sdshdr{
    int len; // 记录buf数组中已使用字节的数量
    int free; // 记录buf中未使用字节数量
    char buf[]; // 保存字符串的数组
    }

    1. 如果 SDS 修改后的长度小于 1MB,那么程序将会分配 len 字段值同样大小的未使用空间,这也是为什么我上面给出的例图中 len 的值是 6,free 值也是 6 的原因。对于上面那个例子,SDS 的总占用大小为:6(len) + 6(free) + 1('') = 13 字节的容量。
          2. 如果 SDS 修改后的长度大于 1MB,那么 SDS 将会为 SDS 分配 1MB 的未使用空间。如果一个 SDS len 值修改后的容量为 2MB,那么 redis 将会为 SDS 分配 1MB 的未使用空间。则此时 SDS 的总占用大小为:2MB(len) + 1MB(len) + 1byte('') =3073 byte 容量。
      这种扩容算法,减少了频繁的向系统申请内存的操作。SDS 的空间释放并不是实时的,而是惰性释放:redis 认为如果一个 SDS 的容量到达过 N 大小,则极有可能在其缩小后也有可能到达 N,且惰性释放也减少了下次内存分配的可能,假如现在有一个'golang'字符串存储在 redis 中, 现在我们需要将'golang'修改为'go',那么 redis 将会对 SDS 结构体将会是这样的:

    那么 SDS 提供了清理内存的 API,我们可以在有需要时,调用该 API 以便真正的释放内存。

    总结
        1. redis 只会使用 C 字符串作为字面量使用,大多数情况都使用 SDS 来表示字符串。
        2. 能够使用常数级复杂度获取字符串的长度。
        3. 杜绝了缓冲区溢出。
        4. 减少了字符串所需内存重新分配的次数。以及对于二进制数据安全,且兼容部分 C 字符串函数。

    2、list 有序列表双向链表又是,双端链表同时也是ziplist压缩链表,最后组合成quicklist快速链表。
    3、hash 又叫字典,redis的哈希对象的底层存储可以使用ziplist(压缩链表)和hashtabl,通过挂链解决冲突问题。
    4、set 底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表
    5、zset score,value结构,ziplist 压缩链表+跳跃表.

  • 相关阅读:
    leetcode-22 括号生成
    Mysql安装与使用(详细)
    java开发环境的搭建
    LeetCode 55. Jump Game
    LeetCode 31. Next Permutation
    2019.1.12国家开发银行(国开行)笔试【补录】+ 面试总结
    苹果电脑MAMP环境配置以及关于“星球大战”知识图谱的复现
    创新工场-Deecamp2019冬令营笔试A卷 AND 面试内容
    使用scp命令在mac本机和linux服务器之间传输数据
    python小技巧之多行缩进,获取程序运行时间,删除非空文件夹
  • 原文地址:https://www.cnblogs.com/stubborn-dude/p/14830413.html
Copyright © 2011-2022 走看看