• redis设计与实现-数据结构


    1,redis存储有5种数据对象,有7种数据结构底层实现

     

    2,sds简单字符串

    • 不直接使用字符数组或是string
    • 封装了长度变量,加快获得字符串长度
    • 杜绝缓冲区溢出(拼接字符串的时候不会因为内存里连线的内存不够就会溢出,每次分配会先检查
    • 减少内存分配次数,不用每次变长都申请,申请多一倍,够就直接用
    • 二进制安全(使用len来判断,不会中途停止

    3,链表

    • 用于列表键,发布订阅,慢查询,监视器
    • 双端链表,无环

    4,字典(hash表差不多

    • 用于数据库和哈希键
    • 通常有两个哈希表,再扩容reahsh的时候使用(开辟出一个新的哈希表,懒替换,每次用到的时候才去替换,逐渐完整替换
    • 基本上和Java得hashmap差不多

    5,跳跃表

    • 用于有序列表的实现
    • 跳表的查找时间复杂度是LogN,可以和平衡二叉树相当。但是平衡二叉树实现略复杂,所以redis就采用了实现上稍简单的skiplist。

    6,整数集合

    • 当集合键都是整数的时候,底层就是整合集合
    • 整数数组的类型可以是16位的,32位的,64位的。当数组里所有的整数都是16位长度的,如果新加入一个32位的整数,那么整个16的数组将升级成一个32位的数组。
    • 整数数组里数据是(大小上)有序的。

    7,压缩列表

    • 列表键和哈希键比较小的情况下,底层数据结构未压缩列表
    • 特点是在一串内存中,比较节约内存

    8,对象和底层编码转换

      string

    • int编码  全是整数,若有字符出现或者大于32字节变成raw,浮点数是embstr
    • embstr      初次的字符串是用这个,是短字符串的一种优化,内存连线,embstr应该是只读的,若是有修改操作,则变成raw
    • raw   

      list对象

    • ziplist :满足每个对象字节小于64,数量小于512个。
    • linkedlist

      set对象

    • intset:使用整数集合的时候和不能超过512个对象
    • hashtable:

      zset对象

    • ziplist:每个元素字节少于64,元素数量少于128,有一个字典辅助,提高查找速录
    • skiplist

      哈希对象

    • ziplilst:小于64字节和数量少于512
    • hashtable
  • 相关阅读:
    页面返回顶部的方法总结
    举个栗子学习JavaScript设计模式
    深入理解css3中nth-child和 nth-of-type的区别
    HTML5笔记2——HTML5音/视频标签详解
    Chrome DevTools – 键盘和UI快捷键参考
    js中this关键字测试集锦
    JavaScript学习总结(三)——this、原型、javascript面向对象
    javascript移动设备Web开发中对touch事件的封装实例
    手机兼容集锦
    谈谈常用清除浮动的方法
  • 原文地址:https://www.cnblogs.com/vhyc/p/10191513.html
Copyright © 2020-2023  润新知