SDS

redis2. sds 字符串(SimpleDynamicString)

依然范特西╮ 提交于 2019-12-05 16:28:53
1.标准strcat 会有溢出风险,sdscat无溢出风险 2.空间预分配,惰性空间释放 空间预分配:sds分配空间时,如果原来是5,free是0, sdscat追加一个10长度的,此时字符串加长到15,free也同时分配15,总长为15 + 15free + 1(/0) 为31字节; 若大于1M后则以1M为单位追加。 这么做的原因是,内存分配是比较耗时的操作【 https://baike.baidu.com/item/realloc/659993?fr=aladdin 】,在原地址空间后面若无足够的可用空间,还需要内存拷贝。这样预分配free空间以减少后续的内存分配操作。 惰性过期:free后不会释放空间,会把减少的字符长度追加到free上。 来源: https://www.cnblogs.com/do-your-best/p/11903450.html

php+JS版 抑郁症测试题SDS 抑郁症在线测试

落爺英雄遲暮 提交于 2019-12-05 14:29:35
近年来,随着公众对精神卫生的关注,“抑郁症”这个名词频繁出现在媒体报道中。那么,究竟什么是抑郁症?是不是就是大家所说的瞎矫情、太脆弱? 某天突然心血来潮,开发了这个抑郁症在线测试程序: https://www.zxgj.cn/g/yiyuzheng 试试呗,反正试试又不会怀孕的! 韩国艺人崔雪莉在京畿道城南市的家里被发现身亡,年仅25岁。警方推测是自杀,现在正在进行调查。在向警方陈述时,崔雪莉经纪人传达了雪莉生前患有严重抑郁症的情况。不论是明星还是普通人,对每个病人来说,“抑郁症”的标签背后,都是一种具体的痛苦。而除了抑郁症患者,没有人可以真正了解抑郁带来的痛苦和绝望。 一提到抑郁症,很多人会把它这种病当成脆弱、矫情、想不开,甚至还有人说,就是因为太闲,想太多。但事实并非如此。抑郁症就是一种疾病,而且可能比你想象中的更严重。 来源: https://my.oschina.net/u/4250950/blog/3133449

SDS——动态字符串

邮差的信 提交于 2019-12-04 19:58:50
Redis中简单动态字符串sds数据结构与API相关文件是:sds.h, sds.c。 SDS本质上就是char *,因为有了表头sdshdr结构的存在,所以SDS比传统C字符串在某些方面更加优秀,并且能够兼容传统C字符串。 sds在Redis中是实现字符串对象的工具,并且完全取代char*..sds是二进制安全的,它可以存储任意二进制数据,不像C语言字符串那样以‘\0’来标识字符串结束, 因为传统C字符串符合ASCII编码,这种编码的操作的特点就是:遇零则止 。即,当读一个字符串时,只要遇到’\0’结尾,就认为到达末尾,就忽略’\0’结尾以后的所有字符。因此,如果传统字符串保存图片,视频等二进制文件,操作文件时就被截断了。 SDS表头的buf被定义为字节数组,因为判断是否到达字符串结尾的依据则是表头的len成员,这意味着它可以存放任何二进制的数据和文本数据,包括’\0’ SDS 和传统的 C 字符串获得的做法不同,传统的C字符串遍历字符串的长度,遇零则止,复杂度为O(n)。而SDS表头的len成员就保存着字符串长度,所以获得字符串长度的操作复杂度为O(1)。 总结下sds的特点是:可动态扩展内存、二进制安全、快速遍历字符串 和与传统的C语言字符串类型兼容。 来源: https://www.cnblogs.com/nr-zhang/p/11880494.html

Redis开发与运维:SDS

我们两清 提交于 2019-12-04 02:33:35
STRING 我们会经常打交道的string类型,在redis中拥有广泛的使用。也是开启redis数据类型的基础。 在我最最开始接触的redis的时候,总是以为字符串类型就是值的类型是字符串。 比如:SET key value 我的理解是value数据类型是stirng类型,现在来看呢,这句话说得不够具体全面。 所有的键都是字符串类型 字符串类型的值可以是字符串、数字、二进制 这里也就引出了,另一个概念:外部类型和内部类型 外部类型 vs 内部类型 这里的外部类型,就是我们所熟知的:字符串(string)、哈希(hash)、列表(list)、集合(set)、有序结合(zset)等 Q1:那么什么是内部类型呢? Q2:外部类型和内部类型是什么时候出现的? Q3:为什么要这样设计? 我们先来看问题1,可以这样理解,对外数据结构就像是我们的API,对外提供着一定组织结构的数据。 对内来说,我们可以更换里面的逻辑算法,甚至更换数据存储方式,比如将Mysql换成Redis. 内部类型其实就是数据存储的形式。举现在我们所讨论的stirng来说。 string的外部类型就是string,而它对应的数据内部存储结构分为三种。 int:8个字节的长整形 embstr:<=39个字节的字符串(3.2 版本变成了44) raw:>39个字节的字符串(3.2 版本变成了44) 所以

Redis字符串类型实现内幕

微笑、不失礼 提交于 2019-12-03 06:08:07
摘要 Redis不仅仅是一个key-value存储,它更是一个数据结构服务,支持不同类型的值。这意味着在传统的key-value存储中,我们用string的key关联string的value。而在Redis中,我们可以存储的值不受限于string,我们还可以存储复杂的数据结构。string是我们在使用Redis过程中能接触到的最简单的数据类型,也是Memcached中仅有的类型,因此对于Redis新手来说,首先选择使用string类型是理所当然的。这篇文章主要介绍Redis的string类型的实现内幕。 初识:简单动态字符串 Redis中使用的字符串是通过包装的,基于c语言字符数组实现的一个抽象数据结构,后文中提到的sds指的就是简单动态字符串,它的定义和实现在sds.h和sds.c中,结构是这样的: struct sdshdr { int len; int free; char buf[]; }; Redis中定义了这样一个结构体来表示字符串,字段含义如下: len表示buf中存储的字符串的长度。 free表示buf中空闲空间的长度。 buf用于存储字符串内容。 举个例子: 图1 假设上面图1是当前buf中存储的内容,那么这个时候len为8,free为2,sds的内存占用量可以用下面公式表示: sizeof(struct sdshdr) + len + free + 1

Redis设计与实现系列-基本数据结构-SDC

*爱你&永不变心* 提交于 2019-12-03 04:45:35
关于《Redis设计与实现》读书笔记 SDC全称是(simple dynamic string,SDS),Redis是以C语言编写的,但是Redis并没有直接使用C语言内置的字符串(C语言内置的字符串以空格结束),Redis自己构建了一套抽象字符串SDC用来描述Redis中使用的字符串,当且仅当使用字符串常量时Redis才会直接使用C语言字符串。 我们使用Set命令设置一个键值对时,例如SET ls "hello",Redis将会在数据库中设置一个键值对,其中键值对的键是一个字符串对象,底层实现了一个保存ls的SDC对象;键值对的值也是一个字符串对象,底层实现了一个保存"hello"的SDC对象。 如果我们使用LPUSH指令设置一个列表,例如 RPUSH fruits "apple" "banana" "cherry",Redis将会在数据库中设置一个键值对,其中键值对的键也是一个字符串对象,底层实现了一个保存fruits的SDC对象,键值对的值是一个列表对象,列表中包含3个字符串,每个字符串都是一个SDC对象。 通过两个例子我们对SDC有了简单的认识,简单地说SDC就是用Redis对C语言字符串的一个封装,但是这种封装在Redis中有着严格的定义,C语言中没有类这种概念,C语言中SDC是用一个结构体来描述SDC,具体定义在Redis中sds.h文件中,如下所示: struct

redis数据类型--String

故事扮演 提交于 2019-12-02 16:12:59
/** 问题1:为什么要用String类型?* 问题2:String它能存什么?* 问题3:String存储实现原理是什么?* 问题4:应用场景?** */1、为什么用String?原因:Redis是有C语音编写的,在C语音中本身是没有String的而是用Char[]。使用Char[]数组有违背redis的存储理念。说一下Char[]存储的不好之处:1):Char[]在存储之前必须要指定字符数组的大小,若果指定过大则导致内存浪费,过小则导致内存溢出。2):对Char[]字符数组的长度进行变更的时候需要重新分配内存。3):获取字符数组的长度的时候需要对字符数组进行遍历,时间复杂度为O(n)。4):结束符以\0为标准,像音频、视频等2进制的文件,它极有可能会出行数据不安全,会出现和预想的不一致的情况。基于上面的一些问题,Redis有自己的一套String的实现,它采用的就是SDS,若问SDS是什么,那它就是Redis中String字符串的实现。SDS存储字符串好处:1):不需要担心内存溢出的问题,若果有需要会自动扩容。2):String字符串长度变更不需要重新分配内存,可以通过"空间预分配"和"惰性空间释放"防止重新分配内存。3):获取字符串的长度的时候有自己的len属性来获取,() -> 时间复杂度为O(1)。4):String字符串读取的结尾有len的长度决定

redis数据结构分析 (redisObject、SDS)

我是研究僧i 提交于 2019-12-01 13:00:17
  redis是一个key-value储存系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)   redis字符串:在redis-Client中执行以下命令: SET USER_NAME zhangsan   会创建一个key为USER_NAME,value为zhangsan 的键值对。那么,那么这个字符串的值 "zhangsan" 在数据库中是以哪种数据结构储存的呢? RedisObject对象   redis并没有直接只用string list set等来直接实现键值对数据库,而是根据这些数据结构创建了一个对象系统,这个系统包含了redis中五种数据结构。并且redis对象中记录最后一次访问时间,服务器会根据这个时间删除对象,从而释放内存(如果启用了maxmemory功能的情况下).   redisObject数据结构分析: typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */ int refcount;

Redis为什么要自己实现一个SDS

喜你入骨 提交于 2019-12-01 11:59:32
Redis是使用C语言开发的,在C语言中没有字符串这种数据类型,字符串大都是通过字符数组实现的,但是使用字符数组有以下不足: 1. 字符数组的长度都是固定,容易发生空指针 2. 获取字符数组的长度的时候需要便利数组,时间复杂度较高 3. 字符数组长度发生改变之后需要重新分配内存 4. 使用\0表示结尾,在存储二进制的时候就会出现问题。 所以Redis就自己实现了SDS来解决上面的问题,下面是SDS相对的一些优点: 1. 长度达到一定标准会有相应的扩容。从而解决内存溢出的问题。 2. 在SDS的内部定义了字符串的长度,使用时可以直接获取。从而解决获取长度时间复杂度高的问题。 3. SDS是空间预分配,惰性释放内存的。从而减少分配内存的次数 4. SDS根据长度判断结束的位置。从而解决二进制不安全的问题。 来源: https://www.cnblogs.com/excellencesy/p/11684549.html

redis源码分析1---结构体---简单动态字符串sds

谁说胖子不能爱 提交于 2019-12-01 03:23:06
redis源码分析1---结构体---简单动态字符串sds   redis的底层数据结构主要有简单动态字符串,链表,字典,跳跃表,整数集合,压缩列表,对象等组成。 这些数据结构的实现直接影响redis的表现效果,所以第一部分我先打算从这几个角度来对redis的底层数据结构 从源码上进行分析,具体的实现等。 1 SDS定义 redis大量的数据表现都是以字符串的形式。redis中使用了自己定义的字符串结构,我们先从整体上理解这一部分是怎么样实现的。 首先sds的声明如下 SDS中声明了长度,剩余空间,异界用于保存字符串的数组; 举例说明 那么打印字符串的内存,就直接使用这样的语句 printf("%s",s->buf)。 2 SDS和C字符串的区别 既然在结构体SDS增加了两个属性,那么区别就很明显了 区别1)常数复杂度获取字符串长度 区别2)杜绝缓冲区溢出 SDS在在数据处理之前会先检查空间是否足够,不够再分配; 区别3)减少修改字符串时带来的内存重新分配 这个点我们一般都不打能做好,涉及到内存的分配就容易出现这样的问题,为什么会遇到这样的问题? 因为: 那么redis是如何解决的呢? ①空间预分配 当对SDS进行修改的时候,分配方式如下: ②惰性空间释放 顾名思义,就是晚一点释放;具体的做法是当SDS的API需要缩短SDS保存的字符串时