SDS 简单动态字符串

在redis数据库里面,包含字符串值得键值对在底层都是由SDS实现的。

redis >  set msg "hello world"

1)键值对的键是一个字符串对象,对象得底层实现是一个保存着字符串“msg”的SDS。

2)键值对的值,在底层实现也是保存“hello world ”的SDS。

SDS定义:

SDS与C字符串的区别

1 读取字符串长度复杂度从o(n)降低至o(1)

2)杜绝缓冲区溢出

如果内存中存在紧邻的两个字符串s1,s2,这时候需要需要添加s3至s1之后,如果忘记给s3分配足够的内存空间,那么会导致s3覆盖s2的内存地址。

而如果使用SDS,可以完全杜绝缓冲区溢出的可能性,它会先检查SDS空间是否足够,如果不够就会先扩展SDS内存空间,然后执行拼接操作。

3)减少修改字符串时带来的内存重分配次数

【POC】如果每次修改字符串的长度都需要重新分配内存,那么内存重分配的时间就会占用修改字符串的大部分,对性能造成影响。

通过未使用内存free,SDS实现了空间预分配和惰性空间释放两种优化策略。

空间预留分配:

新增字符串后  len < 1MB   free = len ;

新增字符串后  len > 1MB    free = 1MB;

惰性空间释放:

用于字符串缩短操作,缩短SDS保存的字符串时候,不会立即内存重分配,而是使用free属性记录下来,并未将来可能的增长操作提供优化。

二进制安全

SDS使用len属性值而不是使用空字符串来判断字符串是否结束。使得redis不仅可以保存文本数据,还可以保存二进制数据。

总结

链表

字典

哈希算法

rehash

渐进式rehash

跳跃表

Redis只在两个地方用到跳跃表,一个是实现有序集合键,另一个是在集群节点中用作内部数据结构,除此之外跳跃表在redis没有其他用途。

level:除表头节点其他节点的最大层数。   每一层带有两个属性:前进指针和跨度。  BW:后退指针。

 

整数集合

压缩列表

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

       

对象

redis是基于上面的数据结构创建了一个对象系统,这个系统包含字符串对象,列表对象,哈希对象,集合对象和有序集合对象这五种类型的对象,每种对象都用到至少一种我们前面所介绍的数据结构。

内存回收:引用计数技术来实现内存回收。

1)在创建一个新对象时,引用计数的值会被初始化1;

2)当对象被一个新程序使用时,它的引用计数值会被增1;

3)当对象不再被一个程序使用时,它的引用计数值会被减1;

4)当对象的引用计数值变为0时,对象所占用的内存会被释放;

对象共享:

1)将数据库键的值指向一个现有的值对象;

2)将被共享的值对象得引用计数增1;

Redis设计与实现——数据结构与对象的更多相关文章

  1. Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》

    目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...

  2. Redis | 第一部分:数据结构与对象 下篇《Redis设计与实现》

    目录 前言 1. Redis对象概述 1.1 对象的定义 2. 字符串对象 3. 列表对象 3.1 quicklist 快速链表 4. 哈希对象 5. 集合对象 6. 有序集合对象 7. Redis对 ...

  3. Redis | 第一部分:数据结构与对象 中篇《Redis设计与实现》

    目录 前言 1. 跳跃表 1.1 跳跃表与其节点的定义 1.2 跳跃表的API 2. 整数集合 2.1 整数集合的实现 2.2 整数集合的类型升级 2.3 整数集合的API 3. 压缩列表 3.1 压 ...

  4. redis设计与实现-数据结构

    1,redis存储有5种数据对象,有7种数据结构底层实现 2,sds简单字符串 不直接使用字符数组或是string 封装了长度变量,加快获得字符串长度 杜绝缓冲区溢出(拼接字符串的时候不会因为内存里连 ...

  5. 【笔记】《Redis设计与实现》chapter8 对象

    8.1 对象的类型与编码 Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性.encoding属性和ptr属性 typedef struc ...

  6. Redis设计与实现 -- 动态字符串对象(SDS)

    1. 动态字符串( simple dynamic string, SDS) 在 Redis 中,当需要可以被重复修改的字符串时,会使用 SDS 类型 ,而不是 C 语言中默认的 C 字符串类型 .举个 ...

  7. 共读《redis设计与实现》-单机(一)

    上一章我们讲了 redis 基本类型的数据结构 和 对象系统 ,这篇来说一下单机redis 的知识点. 一.数据库 一个数据库在redis中就有一个结构体,而数据库的结构体是由redisServer这 ...

  8. Redis 的几种数据结构&五种数据类型对象

    先看几种数据结构 通过分析底层的数据结构,学习如何根据场景选型和设计 1,简单动态字符串 redis使用的字符串SDS有别于C语言中的字符串 a, 结构 free字段为已分配但未使用的空间 len为已 ...

  9. Redis 基础数据结构与对象

    Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包 ...

随机推荐

  1. xmake从入门到精通12:通过自定义脚本实现更灵活地配置

    xmake是一个基于Lua的轻量级现代化c/c++的项目构建工具,主要特点是:语法简单易上手,提供更加可读的项目维护,实现跨平台行为一致的构建体验. 本文主要详细讲解下,如何通过添加自定义的脚本,在脚 ...

  2. Linux企业运维人员最常用命令汇总

    本文目录 线上查询及帮助命令 文件和目录操作命令 查看文件及内容处理命令 文件压缩及解压缩命令 信息显示命令 搜索文件命令 用户管理命令 基础网络操作命令 深入网络操作命令 有关磁盘与文件系统的命令 ...

  3. seaborn分布数据可视化:直方图|密度图|散点图

    系统自带的数据表格(存放在github上https://github.com/mwaskom/seaborn-data),使用时通过sns.load_dataset('表名称')即可,结果为一个Dat ...

  4. laravel 验证码使用示例

    一.去https://packagist.org/网站搜索验证码的代码依赖,关键词:captcha 地址:https://packagist.org/packages/mews/captcha 二.环 ...

  5. Centos 7下编译安装Nginx

    一.下载源代码 百度云网盘下载地址:https://pan.baidu.com/s/19MQODvofRNnLV9hdAT-R6w 提取码:zi0u 二.安装依赖及插件 yum -y install ...

  6. Bug--Tomcat Error start child

    添加Quartz之后报错 下面的Cause by: More than one fragment with the name [spring_web] was found. This is not l ...

  7. C#中Session的用法详细介绍

    Session模型简介 在学习之前我们会疑惑,Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每 个用户首次 ...

  8. Django学习路35_视图使用方法(复制的代码) + 简单总结

    from django.shortcuts import render,redirect from django.http import HttpResponse,JsonResponse from ...

  9. PHP array_replace() 函数

    实例 使用第二个数组($a2)的值替换第一个数组($a1)的值: <?php$a1=array("red","green");$a2=array(&quo ...

  10. PHP fseek() 函数

    定义和用法 fseek() 函数在打开的文件中定位. 该函数把文件指针从当前位置向前或向后移动到新的位置,新位置从文件头开始以字节数度量. 如果成功该函数返回 0,如果失败则返回 -1.请注意,移动到 ...