SDS

Redis的8种底层数据结构

南楼画角 提交于 2019-12-19 23:46:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 前言 Redis是一个key-value存储系统,由C语言编写。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型),这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 在此基础上,Redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis 是一个高性能的key-value数据库。 Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制

简单动态字符串

烂漫一生 提交于 2019-12-17 03:13:56
简单动态字符串 字符串 Redis中的字符串 SDS简介 SDS VS C 获取字符串的长度 杜绝缓冲区溢出 减少字符串修改带来的内存重分配次数 二进制安全 兼容部分C字符串函数 总结 字符串 作为内存数据库,Redis对字符串的底层数据结构做了很多优化,通过了解Redis的数据结构,我对Redis的高性能有了更深的理解。 Redis中的字符串 Redis中的字符串有两种表现形式: C语言传统字符串(以空字符结尾的字符数组) :适用于无需对字符串值进行修改的地方(eg:打印日志) SDS: 可以被修改的字符串(eg:大部分场景) SDS简介 class SDS { // SDS中已使用字节的数量 = SDS保存的字符串的长度 int len; // 记录SDS中未使用字节的数量 int free; // 保存的字符串 char[] buf; } len:已使用空间大小(字符串的长度) free: 未使用空间大小 buf: 字符串内容 图示: SDS VS C 相比于C类字符串,SDS具有很多C字符串不具备的特点。 获取字符串的长度 C字符串: 由于没有记录自身的长度,所以要遍历整个字符串,O(n) SDS: 获取len属性O(1) 杜绝缓冲区溢出 C类字符串(会溢出) ①: s1 =“Redis”; s2=“MongoDB”; ②:s1 =“Redis Cluster”; ③

杉岩:软件定义存储(SDS),存储新时代

。_饼干妹妹 提交于 2019-12-15 02:48:54
软件定义存储在行业内不断的被热捧,发展至今,软件定义存储不仅仅代表着一个热门话题,更代表整个存储领域的全新发展方向。 2013,“软件定义”元年 对于软件定义存储,行业内没有统一的说法。当国际存储巨头EMC发布软件定义存储战略后,新闻界开始对于软件定义存储进行了大讨论。随着软件定义的数据中心,软件定义的网络,软件定义的服务器被搬上各大媒体头版头条,2013已然成为了“软件定义”元年。 对于小的存储厂商来说,用独立于底层硬件的软件来定义存储服务非常具有吸引力,这样可以让他们在存储领域有机会与更强更大的竞争对手竞争。与此同时,对于大的存储厂商来说,传统上在硬件和软件之间的紧密联系让他们可以优化存储服务和性能,现在这些厂商必须谨慎地接受软件定义存储的概念或冒着现有产品线被侵蚀的风险。 何为软件定义存储? 简单说来,软件定义存储就是,在任何存储上运行的应用都能够在用户定义的策略的驱动下自动工作。软件定义存储将存储服务从存储系统中抽象出来,且可同时向机械硬盘及固态硬盘提供存储服务。 这样定义和虚拟化存储非常类似,但是并不是虚拟化存储。存储虚拟化可以将多个存储设备或阵列的容量组成一个池,使其看起来就好像在一个设备上,并且虚拟化存储多数情况下只能在专门的硬件设备上使用。许多厂商的虚拟化存储都是其量身定制的设备,或者是在特定服务器上加载的一款软件。 而软件定义存储并不是将存储容量与存储设备剥离开来

杉岩:软件定义存储(SDS),存储新时代

独自空忆成欢 提交于 2019-12-11 19:18:42
软件定义存储在行业内不断的被热捧,发展至今,软件定义存储不仅仅代表着一个热门话题,更代表整个存储领域的全新发展方向。 2013,“软件定义”元年 对于软件定义存储,行业内没有统一的说法。当国际存储巨头EMC发布软件定义存储战略后,新闻界开始对于软件定义存储进行了大讨论。随着软件定义的数据中心,软件定义的网络,软件定义的服务器被搬上各大媒体头版头条,2013已然成为了“软件定义”元年。 对于小的存储厂商来说,用独立于底层硬件的软件来定义存储服务非常具有吸引力,这样可以让他们在存储领域有机会与更强更大的竞争对手竞争。与此同时,对于大的存储厂商来说,传统上在硬件和软件之间的紧密联系让他们可以优化存储服务和性能,现在这些厂商必须谨慎地接受软件定义存储的概念或冒着现有产品线被侵蚀的风险。 何为软件定义存储? 简单说来,软件定义存储就是,在任何存储上运行的应用都能够在用户定义的策略的驱动下自动工作。软件定义存储将存储服务从存储系统中抽象出来,且可同时向机械硬盘及固态硬盘提供存储服务。 这样定义和虚拟化存储非常类似,但是并不是虚拟化存储。存储虚拟化可以将多个存储设备或阵列的容量组成一个池,使其看起来就好像在一个设备上,并且虚拟化存储多数情况下只能在专门的硬件设备上使用。许多厂商的虚拟化存储都是其量身定制的设备,或者是在特定服务器上加载的一款软件。 而软件定义存储并不是将存储容量与存储设备剥离开来

redis数据结构-SDS简单动态字符串

廉价感情. 提交于 2019-12-10 22:15:38
一.使用场景 redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是构建了简单动态字符串(Simple dynamic String SDS)的抽象类型,并将SDS作为默认的字符串表示形式。 redis里面C字符串只用在字符串字面量(String literal) ,用在一些无需对字符串修改的地方。 比如打印日志redisLog(REDIS_WARING,"redis is now ready to exit, bye bye...") 1.redis需要的不仅仅是一个字符串字面量,而是一个可修改的字符串值时,redis就会使用SDS来表示字符串值,比如在redis数据库里面,包含字符串值的键值对在底层都是由SDS实现的。 2.SDS还被用作缓冲区:AOF模式中的缓冲区,以及客户端状态中的输入缓冲区,都是SDS实现的。 二.定义 1.每一个sds.h/sdshdr结构表示SDS的值 struct sdshdr { //记录buf数组中已使用的字节数量 //等于SDS所保存的字符串长度 int len; //记录buf数组中未使用的字节数量 int free; //字节数组,用于保存字符串 char buf[]; } free为0,表示SDS没有分配任何未使用空间 len =5,表示SDS保存了5字节长度的字符串 buf

杉岩:软件定义存储(SDS),存储新时代

僤鯓⒐⒋嵵緔 提交于 2019-12-10 15:59:43
软件定义存储在行业内不断的被热捧,发展至今,软件定义存储不仅仅代表着一个热门话题,更代表整个存储领域的全新发展方向。 2013,“软件定义”元年 对于软件定义存储,行业内没有统一的说法。当国际存储巨头EMC发布软件定义存储战略后,新闻界开始对于软件定义存储进行了大讨论。随着软件定义的数据中心,软件定义的网络,软件定义的服务器被搬上各大媒体头版头条,2013已然成为了“软件定义”元年。 对于小的存储厂商来说,用独立于底层硬件的软件来定义存储服务非常具有吸引力,这样可以让他们在存储领域有机会与更强更大的竞争对手竞争。与此同时,对于大的存储厂商来说,传统上在硬件和软件之间的紧密联系让他们可以优化存储服务和性能,现在这些厂商必须谨慎地接受软件定义存储的概念或冒着现有产品线被侵蚀的风险。 何为软件定义存储? 简单说来,软件定义存储就是,在任何存储上运行的应用都能够在用户定义的策略的驱动下自动工作。软件定义存储将存储服务从存储系统中抽象出来,且可同时向机械硬盘及固态硬盘提供存储服务。 这样定义和虚拟化存储非常类似,但是并不是虚拟化存储。存储虚拟化可以将多个存储设备或阵列的容量组成一个池,使其看起来就好像在一个设备上,并且虚拟化存储多数情况下只能在专门的硬件设备上使用。许多厂商的虚拟化存储都是其量身定制的设备,或者是在特定服务器上加载的一款软件。 而软件定义存储并不是将存储容量与存储设备剥离开来

【Redis设计与实现】第2章 简单动态字符串

痞子三分冷 提交于 2019-12-07 18:36:53
简单动态字符串 Redis并不直接使用C语言字符串,而是自己构建一套简单动态字符串(simple dynamic string ,SDS)C字符串仅仅在一些无需对字符串进行修改的地方使用,例如打印日志。SDS除了用来保存数据库里面的字符串,还被用做缓冲区,AOF缓冲区,客户端状态中的输入缓冲区,都使用了SDS。 2.1 SDS的定义 2.2 SDS与C字符串的区别 2.2.1 常数复杂度获取字符串长度 C语言字符串获取长度 需要遍历整个字符串 时间复杂度为O(n) 而SDS为O(1) 2.2.2 杜绝缓冲区溢出 因为C语言字符串并不保存字符串的长度,如果在执行strcat(char *dest,const char *src)的时候,如果没有给dest分配足够多的内存的话,很有可能就会造成缓冲区溢出。而SDS的空间分配策略杜绝了缓冲区溢出的可能性,因为SDS API会先检查空闲空间是否满足修改的需求,不满足的话,会扩容以满足空间需要。 2.2.3 减少内存重分配次数 对于C语言字符串的扩容和缩容,频繁的内存申请和空间释放,因为内存的申请涉及到比较复杂的分配算法,还需要执行一些比较耗时的系统调用 而 SDS则实现了 空间预分配 和 惰性空间释放 空间预分配 惰性空间释放 2.2.4 二进制安全 C语言字符串以\0作为结束符,只能保存文本数据,不能保存图片、视频等二进制数据

C基础 带你手写 redis sds

拟墨画扇 提交于 2019-12-06 06:54:45
前言 - Simple Dynamic Strings    antirez 想统一 Redis,Disque,Hiredis 项目中 SDS 代码, 因此构建了这个项目 https://github.com/antirez/sds . 更多介绍的背景知识, 可以阅读 README.md.   sds 项目是 C 字符串数据结构在实际环境中一种取舍实现, 库本身是非线程安全的. 下 面 来带大家手写相关代码, 透彻了解这个库的意图(antirez 注释的很棒). #define SDS_MAX_PREALLOC (1024*1024) /* Note: sdshdr5 is never used, we just access the flags byte directly. * However is here to document the layout of type 5 SDS strings. */ struct __attribute__ ((__packed__)) sdshdr5 { unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ char buf[]; }; struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; /

Redis开发与运维:SDS与embstr、raw 深入理解

不羁岁月 提交于 2019-12-06 05:51:06
对于上一篇文章,我又自己总结归纳并补充了一下,有了第二篇。 概览 <<左移 开始之前,我们先准备点东西:位运算 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 #define SDS_TYPE_16 2 #define SDS_TYPE_32 3 #define SDS_TYPE_64 4 结合上面的位运算,我们也能理解这5个数据类型的命名规则。 外部类型String 找 SDS结构 我们现在有定义了5种SDS数据类型,那么如何根据字符串长度找这些类型呢? 或者说输入的字符串长度和类型有什么关系?下面我们来看一看他们之间的关系。 再来看看源码: static inline char sdsReqType(size_t string_size) { if (string_size < 1<<5) return SDS_TYPE_5; if (string_size < 1<<8) return SDS_TYPE_8; if (string_size < 1<<16) return SDS_TYPE_16; #if (LONG

Redis 数据结构-字符串源码分析

…衆ロ難τιáo~ 提交于 2019-12-06 01:38:28
相关文章 Redis 初探-安装与使用 本文将从以下几个部分进行介绍 1.前言 2.常用命令 3.字符串结构 4.字符串实现 5.命令是如果操作字符串的 前言 平时在使用 Redis 的时候,只会使用简单的 set,get,并不明白其中的道理,为了探个究竟,搞个明白,就看了下其底层的实现,本人的C言语水平只停留在大学上课堂上,所以看起来还是有点吃力,好在一些关键流程,数据结构还是看得懂 ^ ^。 Redis 的字符串是 Redis 中最基本的一种数据结构,所有的 key 都用字符串表示,且它是二进制安全的;它在内部使用一种称为动态字符串的结构来表示,可以动态的进行扩展,可以在 O(1) 的时间内获取字符串的长度等,此外,一个字符串的长度最多不能超过 512M。 常用命令 字符串的一些常用命令如下: set key value - 设置值 get key -获取值 append key value - 追加值 decr key - 原子减1 incr key - 原子加1 ....... 动态字符串(SDS)结构定义 在解析动态字符串之前,先来看看 Redis 中 Object 的定义,源码在 object.c 中,在该Object的中,定义了创建对象的一些方法,如创建字符串,创建list,创建set等,之外,还指定了对象的编码方法;接下来看下和字符串相关的方法: 指定对象的编码方式