Redis设计与实现——数据结构与对象
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设计与实现——数据结构与对象的更多相关文章
- Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》
目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...
- Redis | 第一部分:数据结构与对象 下篇《Redis设计与实现》
目录 前言 1. Redis对象概述 1.1 对象的定义 2. 字符串对象 3. 列表对象 3.1 quicklist 快速链表 4. 哈希对象 5. 集合对象 6. 有序集合对象 7. Redis对 ...
- Redis | 第一部分:数据结构与对象 中篇《Redis设计与实现》
目录 前言 1. 跳跃表 1.1 跳跃表与其节点的定义 1.2 跳跃表的API 2. 整数集合 2.1 整数集合的实现 2.2 整数集合的类型升级 2.3 整数集合的API 3. 压缩列表 3.1 压 ...
- redis设计与实现-数据结构
1,redis存储有5种数据对象,有7种数据结构底层实现 2,sds简单字符串 不直接使用字符数组或是string 封装了长度变量,加快获得字符串长度 杜绝缓冲区溢出(拼接字符串的时候不会因为内存里连 ...
- 【笔记】《Redis设计与实现》chapter8 对象
8.1 对象的类型与编码 Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性.encoding属性和ptr属性 typedef struc ...
- Redis设计与实现 -- 动态字符串对象(SDS)
1. 动态字符串( simple dynamic string, SDS) 在 Redis 中,当需要可以被重复修改的字符串时,会使用 SDS 类型 ,而不是 C 语言中默认的 C 字符串类型 .举个 ...
- 共读《redis设计与实现》-单机(一)
上一章我们讲了 redis 基本类型的数据结构 和 对象系统 ,这篇来说一下单机redis 的知识点. 一.数据库 一个数据库在redis中就有一个结构体,而数据库的结构体是由redisServer这 ...
- Redis 的几种数据结构&五种数据类型对象
先看几种数据结构 通过分析底层的数据结构,学习如何根据场景选型和设计 1,简单动态字符串 redis使用的字符串SDS有别于C语言中的字符串 a, 结构 free字段为已分配但未使用的空间 len为已 ...
- Redis 基础数据结构与对象
Redis用到的底层数据结构有:简单动态字符串.双端链表.字典.压缩列表.整数集合.跳跃表等,Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包 ...
随机推荐
- 生态 | Apache Hudi集成Alluxio实践
原文链接:https://mp.weixin.qq.com/s/sT2-KK23tvPY2oziEH11Kw 1. 什么是Alluxio Alluxio为数据驱动型应用和存储系统构建了桥梁, 将数据从 ...
- 拿不到offer?阿里HR教你简历应该这样写
首先,要明白公司看重的是你的什么?为什么要聘请你?当然是看重你的能力,聘请你来是要来干活的. 都知道简历是敲门砖,那么这一块砖要怎么才能敲得响,怎么才能敲得开大厂的门. 1 能力萃取!什么是能力萃取? ...
- 修改 Ubuntu SSH 登录后的欢迎信息
主要就是几个文件: cd /etc/update-motd.d/ ls 00-header 90-updates-available 98-fsck-at-reboot 10-help-t ...
- Spring事务处理时自我调用
1.预备知识 aop概念请参考[http://www.iteye.com/topic/1122401]和[http://jinnianshilongnian.iteye.com/blog/141859 ...
- 干货分享丨玩转物联网IoTDA服务系列四-智能网关
摘要:该场景主要描述的是设备可以通过MQTT协议与物联网平台进行交互,用户可以在控制台产品详情中自定义Topic,通过应用侧接口或控制台创建数据转发规则,把设备上报的消息转发给其他华为云服务,供应用侧 ...
- SQL Server跟踪工具Profiler的使用
一.什么是SQL Profiler SQL Server Profiler 是一个功能丰富的界面,用于创建和管理跟踪并分析和重播跟踪结果. 事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进 ...
- python学习笔记1 -- 函数式编程之高阶函数 map 和reduce
我用我自己,就是高阶函数,直接表现就是函数可以作为另一个函数的参数,也可以作为返回值 首先一个知识点是 函数的表现形式,印象中的是def fw(参数)这种方式定义一个函数 python有很多的内置函 ...
- Fortify Audit Workbench Cookie Security: Cookie not Sent Over SSL
Abstract 所创建的 cookie 的 secure 标记没有设置为 true. Explanation 现今的 Web 浏览器支持每个 cookie 的 secure 标记. 如果设置了该标记 ...
- Day06_商品分类(vuetify-nginx-cors)与品牌查询
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 0.学习 ...
- Python for循环通过序列索引迭代
Python for 循环通过序列索引迭代: 注:集合 和 字典 不可以通过索引进行获取元素,因为集合和字典都是无序的. 使用 len (参数) 方法可以获取到遍历对象的长度. 程序: strs = ...