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. 小白在使用ISE编写verilog代码综合时犯得错误及我自己的解决办法

    一:错误原因,顶层信号声明类别错误 错误前 更改后 二:综合时警告 更改前: 错误原因:调用子模块时 输出端口只能用wire类型变量进行映射 这是verilog语法规定的 tx_done在uart_t ...

  2. JS常用知识点(一)

    1.js数据类型 基本类型:String.Number.boolean.null.undefined.Symbol 引用类型:Object null和undefined的区别:undefined表示定 ...

  3. 4.pandas的进阶查询

    简单的查询其实根本不能满足实际开发的需求 需求可能是让你查一下2018年的销售额啊,2019年温度超过30℃的天数啊等等的 这些需求都是有异曲同工的,就是带条件的查询 这里我们先自己设计一个表格,并将 ...

  4. 机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用. 推荐的背后逻辑 有没有思考过一个问题,当我们在淘宝或者是 ...

  5. 如何阅读一本书——分析阅读Pre

    如何阅读一本书--分析阅读Pre 前情介绍 作者: 莫提默.艾德勒 查尔斯.范多伦 初版:1940年,一出版就是全美畅销书榜首一年多.钢铁侠Elon.Musk学过. 需要注意的句子: 成功的阅读牵涉到 ...

  6. python入门神书!|python编程从入门到实践|内附网盘链接带提取码|

    点击此处进入网盘下载地址 提取码:o39n 全书共有20章,书中的简介如下: 本书旨在让你尽快学会 Python ,以便能够编写能正确运行的程序 —— 游戏.数据可视化和 Web 应用程序,同时掌握让 ...

  7. activiti7 获取流程定义的xml

    RepositoryService repositoryService = ProcessEngines.getDefaultProcessEngine().getRepositoryService( ...

  8. 初学用记事本运行java报错:找不到或无法加载主类解决方法,部分出错解决办法

    刚开始学习java的人第一个程序可能通过记事本运行,当中间可能会会出现各种错误,我在下面间可能解决出现的问题 1. java环境变量没有安装好 以我的win10系统为例,在装好相应的jdk后,环境变量 ...

  9. PHP connection_status() 函数

    实例 返回连接状态: <?phpswitch (connection_status()){高佣联盟 www.cgewang.comcase CONNECTION_NORMAL:$txt = 'C ...

  10. luogu P1721 [NOI2016]国王饮水记 斜率优化dp 贪心 决策单调性

    LINK:国王饮水记 看起来很不可做的样子. 但实际上还是需要先考虑贪心. 当k==1的时候 只有一次操作机会.显然可以把那些比第一个位置小的都给扔掉. 然后可以得知剩下序列中的最大值一定会被选择. ...