SDS

Redis3.20阅读-SDS实现

好久不见. 提交于 2020-01-25 04:51:12
声明:这是本人参考黄建宏的《redis设计与实现》(源码版本是redis3.0)来学习redis3.20源码的笔记,如果有什么不对的地方,欢迎大家指正,大家一起学习、一起进步,QQ:499656254。 一、SDS介绍 SDS又叫简单动态字符串,在Redis中默认使用SDS来表示字符串。比如在Redis中的键值对中的键一般都是使用SDS来实现。首先需要说明的是在Redis中,字符串不是用传统的字符串来实现,而是Redis自己构建了一个结构来表示字符串。优点如下: 1、O(1)时间内获取字符串长度。(依据其结构特性,只需要访问其结构体成员len既可获得字符串长度) 2、SDS提供的一些API操作,是二进制安全的(也就是不会因为空格等特殊字符而中断字符串)、不会溢出(API操作会检查其长度) 3、减少了修改字符串时带来的内存重分配次数。 对于增长字符串其采用的策略是检查修改之后的长度大小,如果小于1024*1024,则分配2倍的修改后的长度+1 对于减少的字符串其并不立即释放空间,而是回归到alloc中去。 这个构建的结构在Redis3.20中的表示如下(和Redis2.x中还是有一定区别的): typedef char *sds; /* Note: sdshdr5 is never used, we just access the flags byte directly. *

Redis---SDS(简单动态字符串)

喜欢而已 提交于 2020-01-25 04:46:17
   Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。   在 Redis 里面, C 字符串只会作为字符串字面量(string literal), 用在一些无须对字符串值进行修改的地方, 比如打印日志.   当 Redis 需要的不仅仅是一个字符串字面量, 而是一个可以被修改的字符串值时, Redis 就会使用 SDS 来表示字符串值 1.SDS的定义 struct sdshdr { // 记录 buf 数组中已使用字节的数量, 不包括 '\0' 的长度 // 等于 SDS 所保存字符串的长度 int len; // 记录 buf 数组中未使用字节的数量 int free; // 字节数组,用于保存字符串 char buf[]; };   buf [ ] 除了保存字符串的字符外, 还会在末尾保存一个 空字符 '\0' , 空字符不计算在 len 属性之中.   遵循空字符结尾的好处是可以重用一部分C字符串的函数. 2.SDS与C字符串的区别 2.1 常数复杂度获取字符串长度   C字符串不记录自身的长度信息, 获取字符串长度时会遍历字节数组, 直到遇到空字符为止. 复杂度为

Redis 设计与实现(第二章) -- SDS

微笑、不失礼 提交于 2020-01-25 04:44:46
概述 1.SDS介绍 2.SDS API 3.SDS与C的比较 SDS介绍 在C语言中,用来表达字符串的方式通常有两种, char *buf1= "redis"; char buf2[]= "redis"; 方式1,通过一个char指针指向一个字符串字面量,起内容无法改变,即无法通过buf1[1]='c'来改变内容,如果需要改变,需要将指针重新赋值,指向其他内存空间; 方式2,char数组,末尾有一个‘\0’来代表结束,但是不携带长度信息,在字符串操作时,比如strcat,可能会导致缓存区溢出。 在Redis里面C中的字符串字面量一般只用于不需要对字符串值修改的地方,比如打印日志: redisLog(REDIS_WARNING,'redis now is ready to exit,bye bye...') 当需要对字符串值进行修改时,会使用SDS结构来表示字符串值; 在Redis中,SDS用于很多地方,比如数据库中的键值,缓冲区,AOF缓冲区等。 可以说SDS是redis的基础。 可以看一下SDS的数据结构,在sds.h文件: struct sdshdr { unsigned int len; //记录buf数组中已经使用的字节数量,等于SDS的长度 unsigned int free; //buf数组中未使用的字节数量 char buf[]; //buf数组,用于存储字符串 }

Redis数据结构之字符串-SDS

岁酱吖の 提交于 2020-01-25 04:27:03
C 语言中,传统的字符串表示是以空字符结尾的字符数组, Redis 的字符串没有直接使用该表示,而是选择构建了一种名为简单动态字符串 (simple dynamic string, SDS) 的抽象类型。 在 Redis 中, C 字符串只会作为字符串字面量 (string literal) 用在一些无需对字符串值进行修改的地方,例如打印日志等场景。 结构 struct SDS<T> { T capacity; // 数组容量 T len; // 数组长度 bytes flags; // 特殊标识位 bytes[] content; // 字节数组,存储字符串 }; capacity :分配给字节数组的长度 len :字节数组存储内容的实际长度 Redis 规定字符串长度不能超过 512M 。 绝大部分情况下,认为不会对字符串进行 append 操作,所以创建字符串时 len 和 capacity 一样长,即不分配冗余空间。 SDS 对比 C 字符串 获取字符串长度时间复杂度为 O(1) :直接使用 len 属性 有效杜绝缓冲区溢出: APPEND 操作先分配空间,再执行拼接 减少修改字符串可能带来的内存重分配次数:空间预分配,动态扩容提供冗余空间 二进制安全: SDS 使用 len 的值而不是空字符来判断字符是否结束,所以字节数组可以用来保存一系列二进制数据 兼容部分 C

redis源码阅读——动态字符串sds

流过昼夜 提交于 2020-01-24 13:13:42
redis中动态字符串sds相关的文件为:sds.h与sds.c 一、数据结构 redis中定义了自己的数据类型"sds",用于描述 char*,与一些数据结构 1 typedef char *sds; 2 3 /* Note: sdshdr5 is never used, we just access the flags byte directly. 4 * However is here to document the layout of type 5 SDS strings. */ 5 struct __attribute__ ((__packed__)) sdshdr5 { 6 unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ 7 char buf[]; 8 }; 9 struct __attribute__ ((__packed__)) sdshdr8 { 10 uint8_t len; /* used */ 11 uint8_t alloc; /* excluding the header and null terminator */ 12 unsigned char flags; /* 3 lsb of type, 5 unused bits */ 13 char buf[];

第二章-简单动态字符串

旧时模样 提交于 2020-01-16 22:35:20
在Redis的数据库里面,包含字符串值的 键值对 (注意,键也是)在底层都是由SDS实现的。(在Redis源码里,C字符串只会作为字符串字面量用在一些无须对字符串值进行修改的地方,比如打印日志)。如: redis > SET msg "hello world" OK Redis将在数据库中创建一个新的键值对,其中键是一个字符串对象,对象的底层实现是一个保存着字符串“msg”的SDS。值也是一个字符串对象,对象的底层实现是一个保存着字符串“hello world”的SDS。 除了用来保存数据库中的字符串值之外,SDS还被用作缓冲区(buffer):AOF模块中的AOF缓冲区,以及客户端状态中的输入缓冲区,都是由SDS实现的。 2.1SDS的定义 SDS,simple dynamic string,简单动态字符串。 struct sdshdr { int len ; // 记录buf数组中已使用字节的数量,等于SDS所保存字符串的长度 int free ; // 记录buf数组中未使用字节的数量 char buf [ ] ; // 字节数组,用于保存字符串(最后一个字节为`\0`,是额外分配的,不算在len中,即当len为5、free为5时,buf的实际长度为11。遵循空字符结尾这一惯例的好处是,SDS可以直接重用一部分C字符串函数库里面的函数) } ; 2.2SDS与C字符串的区别

浅谈分布式存储之SSD基本原理

落爺英雄遲暮 提交于 2020-01-10 12:02:59
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 随着制造工艺的不断进步,SSD(Solid State Drive)性能和容量不断突破,价格不断降低,迎来了快速的发展,目前已经是商用服务器、高性能存储服务中非常流行的存储介质。作为开发人员,需要了解SSD的基本原理,以便开发时能更好地发挥其优势,规避其劣势。本文章基于末尾所列参考文献整理而来。 目录 SSD简介 闪存基础 存储原理 读写流程 GC机制 Trim机制 Bit-Error Read-Disturb Program-Disturb Wear-Leveling IO抖动因素 SSD简介 SSD诞生于上世纪70年代,最早的SSD使用RAM作为存储介质,但是RAM掉电后数据就会丢失,同时价格也特别贵。后来出现了基于闪存(Flash)的SSD,Flash掉电后数据不会丢失,因此Flash-SSD慢慢取代了RAM-SSD,但是此时HDD已经占据了大部分的市场。到本世纪初,随着制造工艺的不断进步,SDD迎来了长足的发展,同时HDD在工艺和技术上已经很难有突破性的进展,SSD在性能和容量上还在不断突破,相信在不久的将来,SSD在在线存储领域会取代HDD,成为软件定义存储(SDS)的主流设备。 闪存基础 SSD主要由SSD控制器,Flash存储阵列,板上DRAM(可选)以及跟HOST接口(SATA、SAS

redis 5种基本类型实现原理

北城余情 提交于 2020-01-09 23:48:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Redis主要支持的数据类型有5种:String ,Hash ,List ,Set ,和 Sorted Set。 字符串类型 能存储任何形式的字符串,包括二进制数据 一个字符类型键允许存储的最大容量是512M 内部数据结构 通过 int、SDS(simple dynamic string)作为结构存储 int用来存放整型数据,sds存放字节/字符串和浮点型数据 redis3.2分支引入了五种sdshdr类型, 目的是为了满足不同长度字符串可以使用不同大小的Header, 从而节省内存 列表类型 列表类型内部使用 双向链表 实现 内部数据结构 value对象内部以linkedlist或者ziplist来实现 当list的元素个数和单个元素的长度比较小的时候, Redis会采用ziplist(压缩列表)来实现来减少内存占用。 否则就会采用linkedlist(双向链表)结构。 redis3.2之后,采用的一种叫quicklist的数据结构 二者结合 quicklist仍然是一个双向链表,只是列表的每个节点都是一个ziplist hash类型 数据结构 map提供两种结构来存储, 一种是hashtable、 另一种是前面讲的ziplist, 数据量小的时候用ziplist. 在redis中,哈希表分为三层

港口供应链+区块链实践【荷兰鹿特丹港】

假装没事ソ 提交于 2020-01-06 15:38:58
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 区块链不仅仅是比特币、以太币等虚拟货币的技术基础,它的去中心化、不可篡改、分布式共识等技术特点,使其有可能重塑当今的很多产业。港口供应链涉及到众多利益相关方的协作,因此被认为最有可能受到区块链的冲击。本文介绍荷兰鹿特丹港的区块链应用情况,希望对你有所启发。 相关教程推荐: Hyperledger Fabric | Ethereum | Tendermint | Bitcoin | EOS 1、港口供应链现状 现代的供应链网络是去中心化的,包含众多中小规模的企业,而且这一领域是数据驱动的,高度依赖于信任、透明和安全机制。例如,海运集装箱的运输,平均需要28个机构的参与,在途中需要交换数据200次。 缺乏信任和互连互通是全球货物运输成本居高不下的主要原因。供应链中的每个机构,从银行到海关到进出口公司,都有其自己的系统来处理海量的文书工作,平均一次运输需要130页文档,转账很耗时,并且需要承担欺诈风险和高昂的保险成本。这些流程需要持续的监视和复杂的财务处理。 在去中心化网络中,没有单一的主管机构,因此需要有效的协调和信任机制。区块链不仅简化了处理流程,它还强化了信任程度,因为操纵或删除数据基本上是不可能的。因此,区块链技术是实现港口和海事供应链的安全、可控、可伸缩数据分享的关键支撑,它可以让物流服务提供商安全

预防抑郁症 请学会接纳不完美的自己

╄→гoц情女王★ 提交于 2019-12-24 10:54:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 抑郁症?接纳?这两者你觉得有什么关系? 我最近有空的时候阅读了网上很多有关抑郁症的文章,道理倒是都没什么问题只是过于标准化,我今天想换一个角度去聊抑郁症,今天我不谈危害不谈治疗,因为这样的文章太多了,抑郁症本身是一种精神类疾病,我今天想说的是我们如何去接纳抑郁症,就好比我们身体中有良性的肿瘤我们没必要为一个良性的肿瘤而去做一次手术去治疗它吧,我相信大家更多的接纳它,接纳它并不是放任不管,而是为了更好的让它得到控制。 人们最恐惧的是源于什么,是自己无法控制和预知的事情,就好比我们走夜路我们为什么害怕一样,是因为我们不知道它会出现什么我们不知道的东西,如果你完全知道他会发展成什么程度,它是可控制的我们就不会恐惧,肿瘤为什么觉得那么可怕,因为它的细胞增殖不可控制。 好了我们回归我们聊的抑郁症的话题,抑郁症如果只是轻微症状或者我知道它什么时候发作,我只要能自己控制就没什么大不了的,既不影响我的生活也不影响我的工作,那我还有什么可担心的呢,换句话说节奏这么快的北上广有几个人不抑郁不郁闷不烦恼的呢? 在线抑郁症测试SDS https://www.zxgj.cn/g/yiyuzheng 接纳需要勇气需要度量,有的人可能一辈子也学不会接纳,但是有的人天生就容易接纳,人之初,性本善其实我觉得不然,我认为人之初,性本恶