Redis为什么要自己实现一个SDS】的更多相关文章

Redis是使用C语言开发的,在C语言中没有字符串这种数据类型,字符串大都是通过字符数组实现的,但是使用字符数组有以下不足: 1. 字符数组的长度都是固定,容易发生空指针2. 获取字符数组的长度的时候需要便利数组,时间复杂度较高3. 字符数组长度发生改变之后需要重新分配内存4. 使用\0表示结尾,在存储二进制的时候就会出现问题. 所以Redis就自己实现了SDS来解决上面的问题,下面是SDS相对的一些优点:1. 长度达到一定标准会有相应的扩容.从而解决内存溢出的问题.2. 在SDS的内部定义了字…
Redis的底层数据结构非常多,其中包括SDS.ZipList.SkipList.LinkedList.HashTable.Intset等.如果你对Redis的理解还只停留在get.set的水平的话,是远远不足以应对面试提问的.本文简单介绍了Redis底层最重要的数据结构 - 简单动态字符串(SDS) Redis使用C语言开发,但并没有使用C语言传统的字符串表示(以空字符结尾的字节数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串的(simple dynamic string,SDS…
几个概念1:key对象 数据库存储键值对的键,总是一个字符串对象.2:value对象 数据库存储键值对的值,可以是字符串对象,list对象,hash对象,set对象,sorted set对象.     例如:            set msg "hello world" 则redis在数据库中创建一个新的键值对,键和值都是一个字符串对象,底层实现都是一个sds对象.            rpush fruits "apple" "banana&quo…
Redis 设计与实现,看 SDS(Simple Dynamic String) 感悟 今天在看 Redis 设计与实现这本书的时候,发现了里面系统定义的数据结构 SDS,中文名为 简单动态字符串.对其设计的思想挺有收获的. SDS 的定义,位于 sds.h/sdshdr 中:结构如下: struct sdshdr{ // len 为 buf 数组中已使用字节的数量,等于 SDS 所保存的字符串的长度 int len; // buf 中未使用字节的数量 int free; // 字节数组,用于保…
Key(键) Del     语法:DEL  Key [key ...]     删除给定的一个或者多个key  不存在的key会被忽略. 返回值: 被删粗key的数量# 删除单个 key redis> SET name huangz OK redis> DEL name (integer) 1 # 删除一个不存在的 key redis> EXISTS phone (integer) 0 redis> DEL phone # 失败,没有 key 被删除 (integer) 0 #…
O(N):时间复杂度 N的值越大 时间复杂度随N的平方增大 O(1):就是说N很大的时候,复杂度基本不增长了.基本就是常量了. 在Redis数据库里 包含字符串值的键值对 在底层都是由SDS实现的. 如果客户端执行命令: SET msg 'hello world' OK 那么redis将在数据库中创建一个新的键值对 键值对的键是一个字符串对象,对象底层实现是一个保存着字符串‘msg'的SDS 键值对的值是一个字符串对象,对象底层实现是一个保存着字符串‘hello world'的SDS…
STRING 我们会经常打交道的string类型,在redis中拥有广泛的使用.也是开启redis数据类型的基础. 在我最最开始接触的redis的时候,总是以为字符串类型就是值的类型是字符串. 比如:SET key value 我的理解是value数据类型是stirng类型,现在来看呢,这句话说得不够具体全面. 所有的键都是字符串类型 字符串类型的值可以是字符串.数字.二进制 这里也就引出了,另一个概念:外部类型和内部类型 外部类型 vs 内部类型 这里的外部类型,就是我们所熟知的:字符串(st…
对于上一篇文章,我又自己总结归纳并补充了一下,有了第二篇. 概览 <<左移 开始之前,我们先准备点东西:位运算 i<<n 总结为 i*2^n 所以 1<<5 = 2^5 1<<8 = 2^8 1<<16 = 2^16 1<<32 = 2^32 1<<64 = 2^64 SDS 5种数据类型 Redis 3.2 以后SDS数据类型有5个 #define SDS_TYPE_5 0 #define SDS_TYPE_8 1 #d…
本文的分析没有特殊说明都是基于 Redis 6.0 版本源码 redis 6.0 源码:https://github.com/redis/redis/tree/6.0 在 Redis 中,字符串都用自定义的结构简单动态字符串(Simple Dynamic Strings,SDS). Redis 中使用到的字符串都是用 SDS,例如 key.string 类型的值.sorted set 的 member.hash 的 field 等等等等... 数据结构 旧版本的结构 在 3.2 版本之前,sds…
C 语言的字符串函数 C 语言 string 函数,在 C 语言中可以使用 char* 字符数组实现字符串,C 语言标准库 string.h 中也定义了多种字符串操作函数. 字符串使用广泛,需要满足: 高效的字符串操作,比如追加.拷贝.比较.获取长度 能保存任意的二进制数据,比如图片 尽可能省内存 为什么 Redis 不直接使用 C 语言的字符串? C 语言 char* 以 '\0'标识字符串的结束,则中间含有'\0'的字符串无法被正确表示:也正因为此,没有办法保存图像等二进制数据. C 语言…