浅谈Redis(2)

经历了上次的一些简单的数据类型的介绍,相信小伙伴对于Redis中的数据类型有了相应的了解,我们这次则继续深入讲解,希望我的小伙伴能够继续学习下去哦~

Redis是一个开源的使用ANSI C语言编写的。经过上篇文章的简单介绍Redis中的5种基本的存储类型,相信大家能够大致的知道每一种数据类型的大致使用方法,但是,我们要的不仅仅是使用哦,我们要追根问底,干倒这颗大树再说。

Redis中的基本类型String的实现,可以说是最简单的一个实现方式。底层是使用的SDS进行实现的,SDS是一种结构。

这里是使用Java类型来表达下所谓的SDS结构,我们可以看到的是了解到这里面是什么情况。当我们Redis客户端执行SET name Redis;底层就会产生两个SDS数据结构,name以及redis就都会产生一个SDS数据结构。

这上面显示的就是Redis在SDS中存储的形式,这里面就是能够很好的看出我们存储的字符串在实际的存储空间里面是什么样子的,后面的结束字符是从C那边过来的,这里显示是占用一个空间的单位,但是实际上在显示字符大小的时,是不计在内的。同时,这里面的存储虽然是从C字符串过来的,但是与C字符串还是有很大的区别。

我们知道,C字符串在存储的时候,是不记录自身长度的。也就是说在自己的空间内部,只有自身的字符信息,不会有其他额外的信息,所以在寻找它长度问题的时候,就需要进行遍历,则时间复杂度是O(n),而对于SDS这种结构而言,我们可以直接去寻找他的长度,则时间复杂度是O(1)。设置以及更新是由SDS自身的api执行的,所以不用担心执行的时间方面。从这方面,我们就可以看出Redis为了加快执行速度下的功夫。

当然,Redis不仅仅在数据结构上面下了功夫,还在其他方面进行很好的加速存储的功能,如C语言中存储“Redis MongonDB”。

上面这幅图片代表了字符在C语言中存储的位置,我们知道C语言中如果两个字符串进行连接的话,有可能会造成缓冲区溢出的情况出现,所以在处理字符串连接的时候就需要进行处理,否则很可能造成缓冲区溢出,如现在将S1换成“Redis Cluster”,则此时就会将原本的S2替换了。

而这时候使用SDS数据类型的话,我们就可以很好的避免这种情况发生,在连接字符串的时候,SDS的API首先会对其剩余空间进行一个检测,当满足剩余空间可以放下,API就不进行扩容的准备,反之,则对其进行扩容,这样能够很好的避免缓冲区溢出的问题。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180615G1V7XZ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券