Redis底层实现

Redis数据库实现。

Redis是一个key-value数据库这个不必多说,而实现key-value映射的数据结构想必大家也有想到,hash表,对就是它!hash表在Redis中被封装了一下,成为字典。

数据类型String的底层实现。

String的底层实现可以是long(查出来写作int)、SDS(查出来写作Raw)、Embstr编码的简单动态字符串(查出来写作Embstr)。

解释如下:
1.当string对象存的是整数值,并且整数值可以有long类型表示,底层就使用Redis_Encoding_int编码。(真正底层用的是long来存)
2.当string对象存的是长度大于32字节的字符串,使用Redis_Encoding_raw编码(底层是SDS)
3.当string对象存的是长度小于等于32字节的字符串,使用Redis_Encoding_embstr编码(底层是Embstr)
SDS(sample dynamic String简单动态字符串)
SDS实现也很简单,就是一个结构体,里面封装了一个字符数组,一个len变量表示字符数组已经使用的长度,一个free变量,表示还没有使用的长度。

List底层实现。

1.当列表键只包含少量的列表项,并且每个列表项要么是整数值,要么是长度较短的字符串,那么Redis会用压缩列表来做list的底层实现。(其中的标准是,列表项小于512,每个列表项的值的长度小于64个字节,当然这只是默认值,这个值是可以手动修改的)
2.当一个列表包含了数量较多的元素时,又或者列表中元素都是较长的字符串时,List底层实现使用的是链表

Hash底层实现。

1.当一个hash键只包含少量键值对,并且键值对的键和值要么是小整数,要么是长度较短的字符串,则Redis用压缩列表来做hash的底层实现。(其中的标准是,键值对个数小于512,并且每个键值对的键和值的长度都小于64个字节,当然这只是默认值,这个值是可以手动修改的)
2.当一个hash键包含的键值对较多,又或者键值对中的元素都是较长的字符串时,hash键的底层实现是字典(封装过的hash表)

Set底层实现。

1.当一个集合只包含整数值元素,并且这个集合数量不多的时候,Redis使用intset整数集合来作为集合键的底层实现。(其中的标准是,集合元素个数小于512,并且每个集合元素都是整数,当然这只是默认值,这个值是可以手动修改的)
2.当不满足使用intset整数集合作为底层实现的条件之后,就只有**ht字典(hash表)**来作为底层实现。

zset底层实现。

1.当一个有序集合元素数量不多的时候,并且元素长度都比较短的时候,Redis使用ZipList压缩列表来作为集合键的底层实现。(其中的标准是,集合元素个数小于128,并且每个集合元素长度小于64字节,当然这只是默认值,这个值是可以手动修改的)
2.如果一个有序列表包含的元素较多,又或者元素都是较长的字符串时,有序列表的底层实现是skipList(跳跃表和hash表结合使用)

最后以一图概之

Redis对象类型底层实现
图片出自《Redis设计与实现》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值