Redis中常用数据类型的底层数据结构:

1. redis是一种键值(key-value)数据库,通常作为内存数据库来使用。需要通过 "键" 来查询 "值"。

2.在Redis中,键的类型为字符串,为了方便多种数据类型的存储方式,"值" 的数据类型有很多,常用的数据类型有 "字符串(String)","列表(List)","字典(hash)","集合(set)","有序集合(sortSet)"。

3.***在Redis中,有一种特殊的数据结构---压缩列表,它是Redis自己实现的数据结构。利用连续的内存空间存储数据。可以将它当作特殊的数组,因为在数组中,要求每一个元素所占用的空间是相同的,例如:如果数组中存储的是字符串类型,那么数组中的每个元素所占用的空间,取决于最长的字符串元素。但是压缩列表不一样,它允许存储的数据大小不同。并且还可以支持不同数据类型的存储。所以它的 "压缩---节省空间,也是相对于普通的数组而言"。示意图如下:

4.列表(List)的内部实现:

列表这种数据类型支持存储一组数据,它的实现方式有两种:(1)压缩列表实现,(2)双向循环链表实现

当List中的数据量比较少的时候,List可以采用压缩列表的形式实现(必须满足下面两种情况):

(1)列表中保存的单个数据小于64字节,(2)列表中数据个数小于512个。

当列表中的数据量比较大时,就需要通过双向循环链表来实现了。

5.字典(hash)的内部实现:

字典类型用来存储一组数据对,字典类型的实现也有两种方式:(1)压缩列表实现,(2)散列表实现

当满足下面两种情况时,通过压缩列表实现。

(1)字典中保存的键和值数据大小,都要小于64字节。(2)字典中数据个数小于512个。

如果大于512个,需要使用散列表实现。Redis的散列表底层采用的是MurmurHash2这种hash算法,这种算法的有点是:运算速度快,随机性好,即使输入的键是有规律的,经过hash算法计算之后,hash值依然可以均匀分布。

同时Redis中的散列表对于Hash冲突问题,使用链表法来解决。并且还支持动态的扩容缩容功能。随着hash表中不断的添加数据,扩容因子也不断的增大,当>=1时,进行扩容操作,扩容为原来的2倍。当字典中的数据不断减少时,扩容因子也不断地减小,当<0.1时,字典进行缩容操作,缩小为当前字典中,数据个数的大约2倍左右。

6.集合(Set):

set集合存储一组不重复的数据,有两种实现方法:(1)有序数组实现,(2)散列表实现。

当存储的数据都是整数,并且存储的元素个数小于512个时,通过有序数组实现,否则通过散列表实现。

7.有序集合(SortSet):

Redis中的有序集合存储的是一组数据,并且每个数据都附带一个分数。有两种实现方式:(1)压缩列表,(2)跳表

数据大小都小于64字节,并且元素的个数小于128个时,使用压缩列表实现。

否则通过数据得分的大小,我们将数据组织成跳表,所以跳表中的数据层应该是从小到大有序排列的。那么我们就可以利用元素的分数,进行单个数据的快速查找,和数据的区间查找。

8. Redis的持久化操作:

将数据持久化到硬盘,有两种解决思路:

(1)抛弃数据原有的存储结构,仅仅将数据存储到硬盘上。Redis也是利用这种方法来实现数据的持久化的。这种方法有一定的弊端:当数据从硬盘加载到内存中时,因为要构建原有的存储结构,所以需要更多的时间。

(2)第二种是将数据本身和存储结构一起写入到硬盘中,这样会加快读取硬盘数据的速度,同样也会消耗更多的存储空间。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值