加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

深入了解一下Redis的内存模型!

发布时间:2019-03-17 06:46:40 所属栏目:编程 来源:编程迷思
导读:一、媒介 Redis是今朝最火爆的内存数据库之一,通过在内存中读写数据,大大进步了读写速率,可以说Redis是实现网站高并发不行或缺的一部门。 我们行使Redis时,会打仗Redis的5种工具范例(字符串、哈希、列表、荟萃、有序荟萃),富厚的范例是Redis相对付M

就今朝的实现来说,Redis处事器在初始化时,会建设10000个字符串工具,值别离是0~9999的整数值;当Redis必要行使值为0~9999的字符串工具时,可以直接行使这些共享工具。10000这个数字可以通过调解参数REDIS_SHARED_INTEGERS(4.0中是OBJ_SHARED_INTEGERS)的值举办改变。

共享工具的引用次数可以通过object refcount呼吁查察,如下图所示。呼吁执行的功效页佐证了只有0~9999之间的整数会作为共享工具。

(3.5)ptr

ptr指针指向详细的数据,如前面的例子中,set hello world,ptr指向包括字符串world的SDS。

(3.6)总结

综上所述,redisObject的布局与工具范例、编码、内存接纳、共享工具都有相关;一个redisObject工具的巨细为16字节:

4bit+4bit+24bit+4Byte+8Byte=16Byte。

4、SDS

Redis没有直接行使C字符串(即以空字符’’末了的字符数组)作为默认的字符串暗示,而是行使了SDS。SDS是简朴动态字符串(Simple Dynamic String)的缩写。

(1)SDS布局

sds的布局如下:

个中,buf暗示字节数组,用来存储字符串;len暗示buf已行使的长度,free暗示buf未行使的长度。下面是两个例子。

通过SDS的布局可以看出,buf数组的长度=free+len+1(个中1暗示字符串末了的空字符);以是,一个SDS布局占有的空间为:free所占长度+len所占长度+ buf数组的长度=4+4+free+len+1=free+len+9。

(2)SDS与C字符串的较量

SDS在C字符串的基本上插手了free和len字段,带来了许多甜头:

  •  获取字符串长度:SDS是O(1),C字符串是O(n) 
  •  缓冲区溢出:行使C字符串的API时,假如字符串长度增进(如strcat操纵)而健忘从头分派内存,很轻易造成缓冲区的溢出;而SDS因为记录了长度,响应的API在也许造成缓冲区溢出时会自动从头分派内存,杜绝了缓冲区溢出。 
  •  修改字符串时内存的重分派:对付C字符串,假如要修改字符串,必必要从头分派内存(先开释再申请),由于假如没有从头分派,字符串长度增大时会造成内存缓冲区溢出,字符串长度减小时会造成内存泄漏。而对付SDS,因为可以记录len和free,因此扫除了字符串长度和空间数组长度之间的关联,可以在此基本长举办优化:空间预分派计策(即分派内存时比现实必要的多)使得字符串长度增大时从头分派内存的概率大大减小;惰性空间开释计策使得字符串长度减小时从头分派内存的概率大大减小。 
  • 存取二进制数据:SDS可以,C字符串不行以。由于C字符串以空字符作为字符串竣事的标识,而对付一些二进制文件(如图片等),内容也许包罗空字符串,因此C字符串无法正确存取;而SDS以字符串长度len来作为字符串竣事标识,因此没有这个题目。 

另外,因为SDS中的buf如故行使了C字符串(即以’’末了),因此SDS可以行使C字符串库中的部门函数;可是必要留意的是,只有当SDS用来存储文本数据时才可以这样行使,在存储二进制数据时则不可(’’不必然是末了)。

(3)SDS与C字符串的应用

Redis在存储工具时,一致行使SDS取代C字符串。譬喻set hello world呼吁,hello和world都是以SDS的情势存储的。而sadd myset member1 member2 member3呼吁,岂论是键(”myset”),照旧荟萃中的元素(”member1”、 ”member2”和”member3”),都是以SDS的情势存储。除了存储工具,,SDS还用于存储各类缓冲区。

只有在字符串不会改变的环境下,如打印日记时,才会行使C字符串。

五、Redis的工具范例与内部编码

前面已经说过,Redis支持5种工具范例,而每种布局都有至少两种编码;这样做的甜头在于:一方面接口与实现疏散,当必要增进或改变内部编码时,用户行使不受影响,另一方面可以按照差异的应用场景切换内部编码,进步服从。

Redis各类工具范例支持的内部编码如下图所示(图中版本是Redis3.0,Redis后头版本中又增进了内部编码,略过不提;本章所先容的内部编码都是基于3.0的):

深入相识一下Redis的内存模子!

关于Redis内部编码的转换,都切合以下纪律:编码转换在Redis写入数据时完成,且转换进程不行逆,只能从小内存编码向大内存编码转换。

1、字符串

(1)轮廓

字符串是最基本的范例,由于全部的键都是字符串范例,且字符串之外的其他几种伟大范例的元素也是字符串。

字符串长度不能高出512MB。

(2)内部编码

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读