SDS

Redis(三)--- Redis的五大数据类型的底层实现

被刻印的时光 ゝ 提交于 2021-02-17 20:17:36
1、简介 Redis的五大数据类型也称五大数据对象;前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象,字符串对象(string)、列表对象(list)、哈希对象(hash)、集合(set)对象和有序集合对象(zset);而这五大对象的底层数据编码可以用命令OBJECT ENCODING来进行查看。 redisObject结构 1 typedef struct redisObject { 2 // 类型 3 unsigned type: 4 ; 4 // 编码 5 unsigned encoding: 4 ; 6 // 指向底层实现数据结构的指针 7 void * ptr; 8 // ... 9 } robj; redis是以键值对存储数据的,所以对象又分为键对象和值对象,即存储一个key-value键值对会创建两个对象,键对象和值对象。 键对象总是一个字符串对象,而值对象可以是五大对象中的任意一种。 type属性存储的是对象的类型,也就是我们说的 string、list、hash、set、zset中的一种,可以使用命令 TYPE key 来查看。 encoding属性记录了队形所使用的编码,即这个对象底层使用哪种数据结构实现。

redis系列之------简单的动态字符串(SDS)

眉间皱痕 提交于 2021-02-17 11:38:43
前言 Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。 个人感觉 SDS 类似于Java的 ArrayList, 大家可以拿两者对比一些,谁的效率更加高一点。 SDS定义 1 struct sdshdr { 2 3 // 记录 buf 数组中已使用字节的数量 4 // 等于 SDS 所保存字符串的长度 5 int len; 6 7 // 记录 buf 数组中未使用字节的数量 8 int free ; 9 10 // 字节数组,用于保存字符串 11 char buf[]; 12 13 }; 这里注意一下。C语言的char是 占一个字节的。 不像Java的char占两个字节。也就是只有八位,-127 - 128。 SDS相比于C字符串的优势 1. 常数复杂度获取字符串长度 这个比较好理解,因为SDS里面有一个字段为len,可以直接获取长度 2. 减少修改字符串时带来的内存重分配次数 因为传统的c字符串,不会自动扩容。而且其内存大小就等于字符串长度+1,因此,每修改一次字符串,都要重新分配一次内存,非常的耗费时间 SDS 会自动扩容,并且会进行空间预分配。比如现在有一个 Hello

全球服务器市场格局简述,又跌跌跌跌跌跌跌跌了.....

大憨熊 提交于 2021-02-13 11:51:58
哎,胸太大,写标题的时候压键盘了。。。。 喂,别扔西瓜好不好,西瓜哥就不能大胸了。。。。。 这段时间,大胸体(也有叫口吃体)在广告圈很流行,我也来凑个热闹。不过,好像不知道那个输入法能够压着键盘一直连续输入一个汉字?输入字母是没有问题的,但是输入汉字,好像胸多大都没有用,不信你试试,O(∩_∩)O哈! 好了,不贫了,回归正题。我们今天来聊聊服务器Q1的市场格局。 关于服务器Q1在国内的市场格局,特大妹在文章 爆料:2017年Q1中国服务器市场份额 里面已经分析得很清楚了,因此,我今天只是来聊聊全球的情况。 先看看Gartner的统计数据。今年全球Q1服务器的销售额下滑了4.5%,TOP5厂商里面只有Dell EMC保持了增长。看来Dell和EMC合并后,还是利用EMC在大企业的优势突破了一些高端客户。 Garner说,除了亚太区是上涨外,其他区域都是下跌的。Gartner认为虚拟化和云的流行造成需求继续被抑制。 下面我们来看一下IDC的统计数据。首先,IDC的数据显示,全球服务器Q1收入总体下滑是4.6%,和Gartner的数据基本一致。在排名方面,Cisco和IBM的排名略有区别,但从统计学角度来说,可以说排名也是一致的。TOP5里面,也是只有Dell是增长的。 IDC认为,Q1的下滑是由于很多大型数据中心都在等待Intel在Q2推出的新CPU Skylake

“透明”的道路——光透明技术与神经科学

不羁的心 提交于 2021-02-09 15:32:39
撰文丨之悯(华中科技大学 生物医学工程博士) 责编丨高阳 排版丨小箱子 著名的恐怖电影《透明人》给不少人留下了深刻的印象,抛开科幻电影,现实中真的存在使生命体变透明的技术吗?答案是肯定的,近年来发展出了能够使离体组织和大小鼠全身透明的光透明技术,使科幻电影中的“透明”生物成为可能。光透明技术,顾名思义,就是通过多种物理化学手段,减小组织对光的散射,使不透明的生物组织变透明。该技术与荧光标记技术、光学成像技术结合,能够获取完整组织的三维整体结构信息,这样的技术是不是非常奇妙? 封面图片 孕11.5天小鼠胚胎的周围神经(2013年尼康微观世界显微摄影大赛获奖作品) 光透明技术是如何实现的? 光透明是如何让生物组织透明的呢?要理解这个问题,就需要先知道组织为什么不透明。生物组织成分复杂,像蛋白质、脂质和血红素这些物质,对光穿透组织非常不友好。光透明技术就是使用物理和化学手段将这些物质除去,同时将组织浸泡在折射率匹配的高渗透高折射率的试剂中(图1),通过这样的处理,组织就会变得透明,给光穿透组织大开方便之门。 图1 光透明技术基本原理 光透明技术简介 现代光透明技术的研究,其实在很长一段时间内处于停滞的状态。人们对生命奥秘的探索随着认知的加深越发的全面。从局部到整体,人们意识到三维成像的重要性,而这一迫切的需求使得光透明技术在近十年的时间内呈现出井喷式发展

Python 字符串与列表去重

亡梦爱人 提交于 2021-02-06 17:28:45
最近面试中出现频率比较高的字符串和列表的去重 pstr = 'abcadcf' # 字符串去重 # 1、使用集合 --没有保持原来的顺序 print(set(pstr)) # 2、使用字典 -- 没有保持原来的顺序 print({}.fromkeys(pstr).keys()) # 3、使用循环遍历法 -- 代码不够简洁,不高端 a = [] for i in range(len(pstr)): if pstr[i] not in a: a.append(pstr[i]) print(a) # 列表去重 plist = [1,0,3,7,5,7] # 1、使用set方法 print(list(set(plist))) # 2、使用字典 print(list({}.fromkeys(plist).keys())) # 3、循环遍历法 plist1 = [] for i in plist: if i not in plist1: plist1.append(i) print(plist1) # 4、按照索引再次排序 b = list(set(plist)) b.sort(key=plist.index) print('sds:',b) 来源: oschina 链接: https://my.oschina.net/u/4349250/blog/3485716

重磅 | 中国移动云能力中心荣获云计算标准与应用大会2项大奖,首批通过3项认证!

蹲街弑〆低调 提交于 2021-02-03 15:36:12
友情提示:全文2000多文字,预计阅读时间5分钟 2019年12月16-17日,第九届中国云计算标准与应用大会在京举行,大会基于技术标准、应用落地、未来趋势等方面深度剖析了云计算产业新阶段面临的机遇和挑战。 会上,中国移动云能力中心荣获“2019年云计算标准化突出贡献奖”、“第四届中国云计算优秀开源案例”二等奖,首批通过“分布式块存储标准符合测评”、“边缘云标准符合测评”、“OpenStack标准符合测评”。 这意味着中国移动云能力中心在块存储、边缘云、OpenStack领域标准化水平处于行业前沿,在云计算开源领域更进一竿。 2019年中国移动云能力中心牵头编写1项国标,参与制定3项国标,2项团标。 基于中国移动云能力中心在标准化领域积极探索并对云计算领域做出突出贡献,在本次大会上,中国移动云能力中心被评为2019年云计算标准化工作突出贡献单位。 合力共筑标准,首批通过认证 中国移动云能力中心不仅积极参与编制标准,同时推进标准落地实施,5款产品首批通过权威标准认证。大云边缘计算产品BC-Edge、大云软件定义存储产品BC-SDS、大云弹性计算产品BC-EC 、大云虚拟网络产品BC-VN、 大云裸金属系统产品BC-BMS共5项产品首批通过国家权威标准认证,获得产品资质。 「1」 BC-Edge BC-Edge获得目前国内首个边缘计算标准《信息技术云计算边缘云计算通用技术要求

Redis底层数据类型

半腔热情 提交于 2021-02-02 00:59:10
Redis主要数据结构: 简单动态字符串(SDS)、双端链表、字典、跳跃表、整数集合、压缩列表和快速列表 ; 一、简单动态字符串(SDS): Redis没有直接使用C语言中的传统的字节数组保存字符串,而是自行构建了简单动态字符串(SDS),C字符串只是作为简单动态字符串(SDS)的字面量,用于在无需对字符串值进行修改的地方。 结构: struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; /* 表示字符串真正的长度,不包含空终止字符 */ uint8_t alloc; /* 表示字符串的最大容量,不包含Header和最后的空终止字符 */ unsigned char flags; /*表示header的类型 */ char buf[]; }; sds结构一共有五种Header定义,其目的是为了满足不同长度的字符串可以使用不同大小的Header,从而节省内存。 通过使用SDS代替C字符串的优点: 将获取字符串长度所需的复杂度降低到O(1); 杜绝缓冲区溢出的情况;   当 SDS需要修改时,首先会检查 SDS的空间是否满足修改所需的要求,如果不满足会自动进行空间扩容。 sds规定:如果扩展后的字符串总长度小于 1M则新字符串长度为扩展后的两倍;如果大于 1M,则新的总长度为扩展后的总长度加上 1M;这样做的目的是减少

不惧疫情,中国SDS市场迎来井喷行情!

此生再无相见时 提交于 2021-01-19 05:46:57
2020年已经过去了,但是,疫情的影响还是严重影响了全球人民的生活,我都一年没有见到海外上学的闺女了啊,没有办法。不过,可喜的是,过去一年,虽然受到疫情的影响,但软件定义存储(SDS)还是迎来大发展,需求出现井喷。 虽然现在各个咨询公司只公布了2020年前三个季度的统计数字,现在说去年全年还有点早,但我认为,第四季度应该比前三个季度要好一些吧,因为大家都没有疫情刚来的时候那么慌乱,生产秩序大部分已经恢复正常了。 SDS加快侵蚀传统存储份额 根据IDC发布的2020年前三个季度的中国存储市场统计数据,SDS替代传统存储的步伐开始加速。 整个中国存储市场,我们来看一下去年和今年(到现在,也就是前三个季度)的份额变化。 01 传统企业存储系统TESS: 市场份额从65.4%下降到59.2%,失去6.2%份额; 02 超融合HCI: 市场份额从17.4%增长到18.6%,增长1.2个百分点; 03 软件定义存储SDS: 市场份额从17.2%增长到22.2%,增长了5个百分点。 也就是传统存储失去的份额,80%被SDS抢去了,另外20%被HCI抢去了。 从绝对份额来看,SDS是22.2%,而HCI是18.6%,说明SDS的市场空间比HCI要大一些,最少目前看如此。 SDS的增幅最高 SDS在2020年前三个季度的整体涨幅是47.1%,其中20Q3出现井喷行情,市场增幅高达62.3%。

Redis设计与实现学习记录《一》

佐手、 提交于 2021-01-08 11:29:12
文章目录 数据结构章节 SDS 数据结构 1、空间预分配 2、惰性空间释放 3、二进制安全 4、兼容部分C字符串函数 数据结构章节 数据库键总是一个字符串对象 数据库键的值可以是: 字符串对象 列表对象 list object 哈希对象 hash object 集合对象 set object 有序集合对象 sorted set object SDS 数据结构 redis 使用的一种名为简单动态字符串(simple dynamic string , SDS)的抽象类型, 用作redis的默认字符串标识。 struct sdshdr { //记录buf 数组总已使用的字节的数量 //等于SDS所保存的字符串的长度 int len; // 记录buf数组中未使用的字节的数量 int free; // 字节数组,用于保存字符串(字节数组,字符数组,勿混淆) char buf[] } * 如果执行 sdscat(s, " Cluster"); 目前s的空间不足以拼接,遂sdscat 会先扩展s的空间,然后再执行拼接操作。 拼接完成后的SDS如下图: sdscat 不仅对这个SDS 进行了拼接的操作,还为SDS分配了13字节的未使用空间,并且拼接之后的字符串也正好是13字节长, 这不是BUG也不是巧合,她和SDS的空间分配策略有关 普通的C字符串的缺陷: 因为C字符串并不记录自身的长度

探索Redis设计与实现2:Redis内部数据结构详解——dict

怎甘沉沦 提交于 2021-01-07 08:45:33
本文转自互联网 本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号【Java技术江湖】的《探索Redis设计与实现》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 该系列博文会告诉你如何从入门到进阶,Redis基本的使用方法,Redis的基本数据结构,以及一些进阶的使用方法,同时也需要进一步了解Redis的底层数据结构,再接着,还会带来Redis主从复制、集群、分布式锁等方面的相关内容,以及作为缓存的一些使用方法和注意事项,以便让你更完整地了解整个Redis相关的技术体系,形成自己的知识框架。 如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 <!-- more --> 如果你使用过Redis,一定会像我一样对它的内部实现产生兴趣。《Redis内部数据结构详解》是我准备写的一个系列,也是我个人对于之前研究Redis的一个阶段性总结