Redis 底层数据结构

版本:2.9

支持的数据类型:

  1. 字符串
  2. 散列
  3. 列表
  4. 集合
  5. 有序集合

字符串

Redis 利用原生的 c 字符串进行了一次封装。封装的字符串叫做简单动态字符串:SDS(simple dynamic string)

Redis 使用的简单动态字符串比 c 语言原生的字符串有以下优点:

  1. 获取字符串长度的复杂度为O(1)
  2. 不存在缓存区溢出
  3. 修改字符串长度时,不需要频繁分配内存
  4. 空间预分配策略
  5. 惰性空间策略
  6. 二进制安全
  7. 二进制安全的意思是,可以将二进制数据使用 SDS 存储,而不会存在 c 语言中,遇到 \0 是字符串结尾的情况。
  8. 兼容部分 c 字符串函数
  9. 因为 SDS 遵循 c 语言以 \0 结尾的惯例,所以 SDS 可以使用 <string.h> 函数库,避免了重复代码

链表

链表作为最常用的数据结构之一,在 redis 中的使用场景是很多的,其中包括:

  1. 发布、订阅
  2. 列表键
  3. 慢查询
  4. 监视器
  5. 多个客户端状态
  6. 客户端缓冲区

Redis 中链表的几个特性:

  1. 双向链表
  2. 无环
  3. 有表头和表尾指针
  4. 有链表长度计数器
  5. 多态(可以用来保存不同类型的值)

字典

字典又叫符号表,在 PHP 中叫关联数组,在 JAVA 中叫映射(map),在 Python 中叫字典(dict)。别管这么多叫法,字典就是一种保存键值对的一种数据结构。

使用场景

  1. 散列(hash)
  2. Redis 数据库

字典实现

Redis 使用 c 语言构建了自己的字典实现。hash 算法使用的是 murmurhash3 算法。遇到键的 hash 值冲突使用的解决方法是链地址法。当需要扩展时,Redis 利用两个哈希表进行渐进式的 rehash。

字典(内部的哈希表)扩展与收缩条件

哈希表内部会通过公式计算一个负载因子。公式为:

load_factor=ht[0].used/ht[0].Size

扩展条件:

  1. 服务器目前没有在执行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且哈希表的负载因子大于等于1。
  2. 服务器目前正在执行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且哈希表的负载因子大于等于5。

收缩条件:负载因子小于 0.1

跳跃表

跳跃表的结构:

跳跃表是一种对标平衡树的一种数据结构。但是比平衡树更简单、更快速、使用更少空间。所以一般都会使用跳跃表。

跳跃表在 Redis 中的使用场景暂时仅限于实现有序集合。

跳跃表的实现参见:http://blog.jobbole.com/111731/

整数集合

整数集合的使用场景为元素不多且只包含整数元素的集合。

使用 c 数组实现。

压缩列表(ziplist)

压缩列表是 Redis 为了节省内存实现的。当列表键和哈希键的项比较少,并且存储的值比较小时,会使用压缩列表节省内存。

Redis 底层数据结构介绍的更多相关文章

  1. Redis底层数据结构详解

    上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...

  2. Redis学习笔记(二)redis 底层数据结构

    在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.Has ...

  3. Redis学习——数据结构介绍(四)

    一.简介 作为一款key-value 的NoSQL数据库,Redis支持的数据结构比较丰富,有:String(字符串) .List(列表) .Set(集合) .Hash(哈希) .Zset(有序集合) ...

  4. 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等

    redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...

  5. Redis学习笔记(4)——Redis五大数据结构介绍以及应用场景

    出处:https://www.jianshu.com/p/f09480c05e42 Redis是典型的Key-Value类型数据库,Key为字符类型,Value的类型常用的为五种类型:String.H ...

  6. Redis底层数据结构实现

    REDIS  较宽泛的支持5种数据结构  分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了  读者可以自己随意翻阅 很方便 . 接下 ...

  7. redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表

    1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...

  8. redis 底层数据结构 压缩列表 ziplist

    压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...

  9. redis 底层数据结构 整数集合intset

    整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存 ...

随机推荐

  1. day 49

    今日内容 标签操作 样式操作 样式类操作 addClass(); // 添加指定的CSS类名. removeClass(); // 移除指定的CSS类名. hasClass(); // 判断样式存不存 ...

  2. 创建指定python版本的虚拟环境

    使用virtualenvwrapper管理虚拟环境 鉴于virtualenv不便于对虚拟环境集中管理,所以推荐直接使用virtualenvwrapper. virtualenvwrapper提供了一系 ...

  3. 【Android - 进阶】之PopupWindow的使用

    创建一个类继承自PopupWindow,编写自定义的PopupWindow类.示例代码如下: import android.app.Activity; import android.graphics. ...

  4. 05-kubernetes Pod控制器应用进阶

    目录 Pod 资源 标签 给资源打标签 标签选择器 Pod 生命周期 实际操作 livenessProbe 实战 livenessProbe exec 测试 livenessProbe httpGet ...

  5. java 抽象类和接口整理

    java中定义一些不含方法体的方法,方法体的实现交给该类的子类根据自己的具体情况去实现,这样的方法就是abstract修饰的抽象方法,包含抽象方法的类叫抽象类,用abstract修饰 抽象方法: ab ...

  6. 移动端touch滑动事件监听

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. thinkPHP5开发智慧软文遇到的分页第二页不显示数据的问题

    在进行结果查询进行分页的时候,发现分页第一页数据正常,第二页没有数据,后面问题一样,这个是因为直接使用了: 如果此处使用如下语句: $lst=NewsModel::order('sendtime de ...

  8. 按照ID倒序查出某个字段不重复的集合

    一.需求 有如下一个表pp_test: id name 1 aa 2 bb 3 cc 4 aa 5 cc 6   要求查出name字段中不重复的值(不算空值),并且按照id的倒序排列(不必输出ID). ...

  9. 转:Java logger组件:slf4j, jcl, jul, log4j, logback, log4j2

    先说结论 建议优先使用logback 或 log4j2.log4j2 不建议和 slf4j 配合使用,因为格式转换会浪费性能. 名词:jcl 和 jul 标题中的 jcl 是 apache Jakar ...

  10. Plugin execution not covered by lifecycle configuration: org.codehaus.mojo:build-helper-maven-plugin:1.8:add-test-source (execution: add-functional-source, phase: generate-sources)

    在maven项目中使用add-source时,pom.xml报如下错误: Plugin execution not covered by lifecycle configuration: org.co ...