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

redis设计与实现-数据结构的更多相关文章

  1. Redis设计与实现——数据结构与对象

    SDS 简单动态字符串 在redis数据库里面,包含字符串值得键值对在底层都是由SDS实现的. redis >  set msg "hello world" 1)键值对的键是 ...

  2. 探索Redis设计与实现8:连接底层与表面的数据结构robj

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  3. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  4. 探索Redis设计与实现7:Redis内部数据结构详解——intset

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  5. 探索Redis设计与实现5:Redis内部数据结构详解——quicklist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  6. 探索Redis设计与实现4:Redis内部数据结构详解——ziplist

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  7. 探索Redis设计与实现3:Redis内部数据结构详解——sds

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  8. 探索Redis设计与实现2:Redis内部数据结构详解——dict

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

  9. 探索Redis设计与实现1:Redis 的基础数据结构概览

    本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...

随机推荐

  1. L271 操纵太空中航天器的几种方法

    Manoeuvring a satellite in orbit usually requires thrusters. Sometimes the thrust is provided by a f ...

  2. Linux平台 获取程序依赖文件

    创建sh脚本文件 =========================================================== #!/bin/sh exe=$1 #发布的程序名称des=$2 ...

  3. 框架:Intellij搭建Spring框架

    第二章.Intellij搭建Spring框架 前提条件:jdk.jre已经安装完成 方法一.intellij下载jar 附:自带的jar的版本为4.3[2018/11/22] 第一步:选择File&g ...

  4. SQL拼接大法

    SQL拼接大法:          Step1:括号先写上() Step2:在括号内写上(,     ,     ,     ,      ,     ,) Step3:再写上单引号(,'     ' ...

  5. 2019 flag

    学习 1.学会一种新的编程语言或脚本语言,并编写不少于十个应用 2.读5-8本其他学科书籍,(经济,心里学等) 3.坚持每个月最少更新8-10篇博客(技术,学习) 4.阅读并理解和应用两个开源lib ...

  6. Spring Boot 揭秘与实战(八) 发布与部署 - 远程调试

    文章目录 1. 依赖 2. 部署 3. 调试 4. 源代码 设置远程调试,可以在正式环境上随时跟踪与调试生产故障. 依赖 在 pom.xml 中增加远程调试依赖. <plugins> &l ...

  7. Webservice客户端动态调用服务端功能方法

    一.发布WebService服务 方式一:在服务端生成wsdl文件,下方客户端直接引用即可     优点:针对要发布的方法生成一个wsdl文件即可,无需多余配置.   缺点:每次服务端方法发生改变都需 ...

  8. Scrum_Sprint

    1.计划会议过程 经过一天的讨论研究,我们对该项目进行了需求分析,确定了这周所要实现的各个功能 并做好了任务看板,并将项目的各个功能分成一个个任务,进行了初步的分工 2.backlog BACKLOG ...

  9. php 中 ">>" "<<" 的含义

    运算符  说明 <<<    管道,引入自c++.将被其后标记括起来的内容视为一个字符串处理,其中的变量会被展开 <<     左移,位操作算符 >>     ...

  10. hint不当索引,影响多表连接方式,最终导致SQL执行缓慢

    需求:一个SQL执行特别慢,无法返回结果,需要进行优化,最终返回结果即可. 一.SQL分析 二.尝试执行,观测执行计划 三.修改SQL 四.问题总结 一.SQL分析 )SQL文本,执行时间,执行用户 ...