Redis 底层数据结构介绍
Redis 底层数据结构
版本:2.9
支持的数据类型:
- 字符串
- 散列
- 列表
- 集合
- 有序集合
字符串
Redis 利用原生的 c 字符串进行了一次封装。封装的字符串叫做简单动态字符串:SDS(simple dynamic string)
Redis 使用的简单动态字符串比 c 语言原生的字符串有以下优点:
- 获取字符串长度的复杂度为O(1)
- 不存在缓存区溢出
- 修改字符串长度时,不需要频繁分配内存
- 空间预分配策略
- 惰性空间策略
- 二进制安全
- 二进制安全的意思是,可以将二进制数据使用 SDS 存储,而不会存在 c 语言中,遇到 \0 是字符串结尾的情况。
- 兼容部分 c 字符串函数
- 因为 SDS 遵循 c 语言以 \0 结尾的惯例,所以 SDS 可以使用 <string.h> 函数库,避免了重复代码
链表
链表作为最常用的数据结构之一,在 redis 中的使用场景是很多的,其中包括:
- 发布、订阅
- 列表键
- 慢查询
- 监视器
- 多个客户端状态
- 客户端缓冲区
Redis 中链表的几个特性:
- 双向链表
- 无环
- 有表头和表尾指针
- 有链表长度计数器
- 多态(可以用来保存不同类型的值)
字典
字典又叫符号表,在 PHP 中叫关联数组,在 JAVA 中叫映射(map),在 Python 中叫字典(dict)。别管这么多叫法,字典就是一种保存键值对的一种数据结构。
使用场景
- 散列(hash)
- Redis 数据库
字典实现
Redis 使用 c 语言构建了自己的字典实现。hash 算法使用的是 murmurhash3 算法。遇到键的 hash 值冲突使用的解决方法是链地址法。当需要扩展时,Redis 利用两个哈希表进行渐进式的 rehash。
字典(内部的哈希表)扩展与收缩条件
哈希表内部会通过公式计算一个负载因子。公式为:
load_factor=ht[0].used/ht[0].Size
扩展条件:
- 服务器目前没有在执行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且哈希表的负载因子大于等于1。
- 服务器目前正在执行 BGSAVE 命令或者 BGREWRITEAOF 命令,并且哈希表的负载因子大于等于5。
收缩条件:负载因子小于 0.1
跳跃表
跳跃表的结构:
跳跃表是一种对标平衡树的一种数据结构。但是比平衡树更简单、更快速、使用更少空间。所以一般都会使用跳跃表。
跳跃表在 Redis 中的使用场景暂时仅限于实现有序集合。
跳跃表的实现参见:http://blog.jobbole.com/111731/
整数集合
整数集合的使用场景为元素不多且只包含整数元素的集合。
使用 c 数组实现。
压缩列表(ziplist)
压缩列表是 Redis 为了节省内存实现的。当列表键和哈希键的项比较少,并且存储的值比较小时,会使用压缩列表节省内存。
Redis 底层数据结构介绍的更多相关文章
- Redis底层数据结构详解
上一篇说了Redis有五种数据类型,今天就来聊一下Redis底层的数据结构是什么样的.是这一周看了<redis设计与实现>一书,现来总结一下.(看书总是非常烦躁的!) Redis是由C语言 ...
- Redis学习笔记(二)redis 底层数据结构
在上一节提到的图中,我们知道,可以通过 redisObject 对象的 type 和 encoding 属性.可以决定Redis 主要的底层数据结构:SDS.QuickList.ZipList.Has ...
- Redis学习——数据结构介绍(四)
一.简介 作为一款key-value 的NoSQL数据库,Redis支持的数据结构比较丰富,有:String(字符串) .List(列表) .Set(集合) .Hash(哈希) .Zset(有序集合) ...
- 【redis】redis底层数据结构原理--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表等
redis有五种数据类型string.list.hash.set.zset(字符串.哈希.列表.集合.有序集合)并且自实现了简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等数据结构.red ...
- Redis学习笔记(4)——Redis五大数据结构介绍以及应用场景
出处:https://www.jianshu.com/p/f09480c05e42 Redis是典型的Key-Value类型数据库,Key为字符类型,Value的类型常用的为五种类型:String.H ...
- Redis底层数据结构实现
REDIS 较宽泛的支持5种数据结构 分别为 字符串 列表 集合 散列 有序集合 关于这几种数据结构的使用 相信网上有很多资料,查看官网API 也很详细了 读者可以自己随意翻阅 很方便 . 接下 ...
- redis底层数据结构--简单动态字符串 链表 字典 跳跃表 整数集合 压缩列表
1.动态字符串 redis中使用c语言的字符床存储字面量,默认字符串存储采用自己构建的简单动态字符串SDS(symple dynamic string) redis包含字符串的键值对都是用SDS实现的 ...
- redis 底层数据结构 压缩列表 ziplist
压缩列表是列表键和哈希键的底层实现之一.当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,redis就会使用压缩列表来做列表键的底层实现 当一个哈希键只包含少量键 ...
- redis 底层数据结构 整数集合intset
整数集合是集合键的底层实现之一,当一个集合只包含整数值元素,并且这个集合的元素数量不多时Redis就会使用整数集合作为集合键的底层实现 整数集合是Redis用于保存整数值的集合抽象数据结构,它可以保存 ...
随机推荐
- 2019-9-19:渗透测试,基础学习,html常用标签,笔记
HTML常用标签<br>:换行<meta charset="utf-8">:编码标签<script type="路径">:插 ...
- SQL查询优化实践
为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上,即随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢,且数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时 ...
- ArrayList实现原理(JDK1.8)
ArrayList实现原理(JDK1.8) public class ArrayList<E> extends AbstractList<E> implements List& ...
- 用CodePush在React Native App中做热更新
最近在学React Native,学到了CodePush热更新. 老师讲了两种实现的方法,现将其记录一下. 相比较原生开发,使用React Native开发App不仅能节约开发成本,还能做原生开发不能 ...
- python内存-fromkeys
fromkeys 这个方法涉及到可变不可变类型,记录下测试代码 不可变类型 #可变类型-list x=["zx","zx2","zx3"] ...
- CSRF(Cross-site request forgery)跨站请求伪造
CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写 ...
- 第二章 Unity Shader基础
[TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...
- WebMagic 实现爬虫入门教程
本示例实现某电影网站最新片源名称列表及详情页下载地址的抓取. webmagic是一个开源的Java垂直爬虫框架,目标是简化爬虫的开发流程,让开发者专注于逻辑功能的开发. WebMagic 特点: 完全 ...
- 转:Java实现敏感词过滤
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- 【java基础】Thread类之join方法