本发明实施例涉及数据压缩的技术领域,尤其涉及一种数据压缩的方法及装置。
背景技术:
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站更快的运行速度。因此,Memcached内存存储的密度有助于提高Memcached数据访问的性能。
技术实现要素:
本发明实施例的目的在于提出一种数据压缩的方法及装置,旨在解决如何利用数据压缩增加Memcached内存存储密度的问题。
为达此目的,本发明实施例采用以下技术方案:
第一方面,一种数据压缩的方法,所述方法包括:
根据待压缩的slab类中的存储对象获取已存储且未被压缩的数据;
根据预设压缩函数对所述已存储且未被压缩的数据进行压缩;
申请与所述压缩后的数据大小对应的存储对象,存储所述压缩后的数据,在新分配的存储对象中标识所述压缩后的数据为已压缩。
优选地,所述方法还包括:
设置压缩尝试次数,若压缩后的数据因内存空间不足无法存储,则增加压缩尝试次数,并进行下一次压缩尝试。
优选地,所述方法还包括:
释放所述压缩前的数据对象占用的存储对象,将所述存储压缩后数据的存储对象插入哈希表和LRU链表中进行查找与管理。
优选地,所述根据待压缩的slab类数据中的存储对象获取已存储且未被压缩的数据之前,还包括:
在启动数据压缩功能的情况下,判断上次压缩时是否为暂停压缩;
若是,则从上次暂停压缩的slab类位置上继续压缩;
若否,则从后往前对每个slab类中的数据进行压缩。
优选地,所述方法还包括:
若压缩数量为0,且压缩线程睡眠时间小于最大时间,则睡眠时间增加N秒;若压缩数量不为0,则将所述压缩线程睡眠时间减半,若减半后的压缩线程睡眠时间小于最小时间,则将所述压缩线程睡眠时间设置为最小时间。
第二方面,一种数据压缩的装置,所述装置包括:
获取模块,用于根据待压缩的slab类中的存储对象获取已存储且未被压缩的数据;
压缩模块,用于根据预设压缩函数对所述已存储且未被压缩的数据进行压缩;
分配模块,用于申请与所述压缩后的数据大小对应的存储对象,存储所述压缩后的数据,在新分配的存储对象中标识所述压缩后的数据为已压缩。
优选地,所述装置还包括:
增加模块,用于设置压缩尝试次数,若压缩后的数据因内存空间不足无法存储,则增加压缩尝试次数,并进行下一次压缩尝试。
优选地,所述装置还包括:
释放模块,用于释放所述压缩前的数据占用的存储对象,将所述存储压缩后数据的存储对象插入哈希表和LRU链表中进行查找与管理。
优选地,所述装置还包括:
判断模块,用于在根据待压缩的slab类中的存储对象获取已存储且未被压缩的数据之前,在启动数据压缩功能的情况下,判断上次压缩时是否为暂停压缩;若是,则从上次暂停压缩的slab类位置上继续压缩;若否,则从后往前对每个slab类中的数据进行压缩。
优选地,所述装置还包括:
设置模块,用于若压缩数量为0,且压缩线程睡眠时间小于最大时间,则睡眠时间增加N秒;若压缩数量不为0,则将所述压缩线程睡眠时间减半,若减半后的压缩线程睡眠时间小于最小时间,则将所述压缩线程睡眠时间设置为最小时间。
本发明实施例提供一种数据压缩的方法及装置,根据待压缩的slab类数据中的存储对象获取已存储且未被压缩的数据;根据预设压缩函数对所述已存储且未被压缩的数据进行压缩,并将压缩后的数据存储在全局缓存区中;申请与所述压缩后的数据大小对应的存储对象,为所述压缩后的数据分配新的存储对象,在新分配的存储对象中标识所述压缩后的数据为已压缩,采用批量压缩的方式对Memcached中存储的数据进行压缩以及对象存储slab类型的切换,根据压缩情况动态改变压缩线程的休眠情况,能够识别和处理特殊或者已经被压缩过的存储对象,使得数据压缩线程对Memcached的slab延迟影响较小;压缩使得Memcached存储对象数量明显提高,达到相同命中率只需标准Memcached70%的内存空间;当内存与Memcached工作集的比值在一定范围内,使用压缩可以显著降低延迟,提升系统性能。
附图说明
图1是本发明实施例提供的一种数据压缩的方法的流程示意图;
图2是本发明实施例提供的一种slab类数据结构示意图;
图3是本发明实施例提供的一种压缩前后的对象数量对比图;
图4是本发明实施例提供的一种未压缩情况下的各slab类中对象分布情况;
图5是本发明实施例提供的一种压缩情况下的各slab类中对象分布情况;
图6是本发明实施例提供的一种在相同测试集的情况下Memcached命中率的情况对比;
图7是本发明实施例提供的一种将Memcached置于整体系统之中得到的访问延迟测试结果示意图;
图8是本发明实施例提供的另一种将Memcached置于整体系统之中得到的访问延迟测试结果示意图;
图9是本发明实施例提供的一种在不同的slab类中Memcached未压缩和压缩的延迟效果对比;
图10是本发明实施例提供的另一种数据压缩的方法的流程示意图;
图11是本发明实施例提供的另一种数据压缩的方法的流程示意图;
图12是本发明实施例提供的一种数据压缩的装置的功能模块示意图;
图13是本发明实施例提供的一种数据压缩的系统的结构示意图。
具体实施方式
下面结合附图和实施例对本发明实施例作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明实施例,而非对本发明实施例的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明实施例相关的部分而非全部结构。
参照图1,图1是本发明实施例提供的一种数据压缩的方法的流程示意图。
在图1中,所述数据压缩的方法包括:
步骤101,根据待压缩的slab类中的存储对象获取已存储且未被压缩的数据;
具体的,参考图2,图2是本发明实施例提供的一种slab类数据结构示意图。如图2所示,内存由不同类型的slab类负责管理,不同的slab类负责分配不同大小的内存块(chunk)。在图2中,slab_id=1的slab类就负责分配88bytes的chunk。chunk用于存储数据对象。数据对象由键(key)和值value组成。
步骤102,根据预设压缩函数对所述已存储且未被压缩的数据进行压缩;
具体的,压缩后的数据存储在全局缓存区中;
步骤103,申请与所述压缩后的数据大小对应的存储对象,存储所述压缩后的数据,在新分配的存储对象中标识所述压缩后的数据为已压缩。
优选地,所述方法还包括:
设置压缩尝试次数,若压缩后的数据因内存空间不足无法存储,则增加压缩尝试次数,并进行下一次压缩尝试。
优选地,所述方法还包括:释放所述压缩前的数据占用的存储对象,将所述存储压缩后数据的存储对象插入哈希表和LRU链表中进行查找与管理。
具体的,对由slab_id指定的slab类进行批量数据压缩操作,每趟压缩的数量为1000个(可以更改);
每次压缩数据的过程进行5次尝试(尝试次数也可更改),跳过用于Memcached爬虫的伪存储对象(不包含存储的数据,数据大小为0)和已经压缩过的存储对象(flag的值含有ITEM_COMPRESSED);
使用压缩函数对未压缩存储对象中的数据进行压缩,暂存于全局缓存区中。如果压缩后的对象因空间不足无法存储,增加尝试次数,进行下一次尝试;
根据函数返回的压缩后的数据大小申请内存分配,用于存储已压缩数据。如果内存分配失败,则退出本次尝试;
设置新分配的压缩后存储对象的相关属性,其中,已经压缩的存储对象的标志(flag)会被设置含有ITEM_COMPRESSED,不仅在传输协议中用于区别已压缩数据和未压缩数据,而且在压缩过程中可以跳过已经压缩的存储对象;
释放压缩前的数据占用的存储对象,将存储压缩后数据的存储对象插入哈希表和LRU链表中进行查找与管理。
如果本次slab类中的压缩数量为0,则结束本次批量压缩过程。
在对象数量、对象分布情况、命中率、系统延迟、延迟提速等参数测试,比较数据压缩前后的Memcached性能有明显效果。
图3是压缩前后的对象数量对比图、图4是未压缩情况下的各slab类中对象分布情况、图5压缩情况下的各slab类中对象分布情况,从图3看出数据压缩使得Memcached存储的对象数量上升。图5中的对象分布情况也比图4更加集中。图6是在相同测试集的情况下,Memcached命中率的情况对比,压缩比非压缩效果明显提升。图7是将Memcached置于整体系统之中得到的访问延迟测试结果,明显优于非压缩。图8是由图7得到,延迟加速比为未压缩延迟和压缩延迟的比值,其中当Memcached内存和工作集的比值在两条虚线标注的范围内使用压缩提升效果明显。图9展示的是在不同的slab类中,Memcached未压缩和压缩的延迟效果对比。
本发明实施例提供一种数据压缩的方法,根据待压缩的slab类数据中的存储对象获取已存储且未被压缩的数据;根据预设压缩函数对所述已存储且未被压缩的数据进行压缩,并将压缩后的数据存储在全局缓存区中;申请与所述压缩后的数据大小对应的存储对象,为所述压缩后的数据分配新的存储对象,在新分配的存储对象中标识所述压缩后的数据为已压缩,采用批量压缩的方式对Memcached中存储的数据进行压缩以及对象存储slab类型的切换,根据压缩情况动态改变压缩线程的休眠情况,能够识别和处理特殊或者已经被压缩过的存储对象,使得数据压缩线程对Memcached的slab延迟影响较小;压缩使得Memcached存储对象数量明显提高,达到相同命中率只需标准Memcached70%的内存空间;当内存与Memcached工作集的比值在一定范围内,使用压缩可以显著降低延迟,提升系统性能。
参照图10,图10是本发明实施例提供的另一种数据压缩的方法的流程示意图。
步骤1001,在启动数据压缩功能的情况下,判断上次压缩时是否为暂停压缩;
步骤1002,若是,则从上次暂停压缩的slab类位置上继续压缩;
步骤1003,若否,则从后往前对每个slab类中的数据进行压缩;
其中,因为slab类有大有小,从后往前压缩是指先压缩大的slab类,然后再压缩小的slab类,能够快速释放空间。
步骤1004,根据待压缩的slab类数据中的存储对象获取已存储且未被压缩的数据;
步骤1005,根据预设压缩函数对所述已存储且未被压缩的数据进行压缩,并将压缩后的数据存储在全局缓存区中;
步骤1006,申请与所述压缩后的数据大小对应的存储对象,为所述压缩后的数据分配新的存储对象,在新分配的存储对象中标识所述压缩后的数据为已压缩。
参照图11,图11是本发明实施例提供的另一种数据压缩的方法的流程示意图。
步骤1101,根据待压缩的slab类数据中的存储对象获取已存储且未被压缩的数据;
步骤1102,根据预设压缩函数对所述已存储且未被压缩的数据进行压缩,并将压缩后的数据存储在全局缓存区中;
步骤1103,申请与所述压缩后的数据大小对应的存储对象,为所述压缩后的数据分配新的存储对象,在新分配的存储对象中标识所述压缩后的数据为已压缩;
步骤1104,若压缩数量为0,且压缩线程睡眠时间小于最大时间,则睡眠时间增加N秒,若压缩数量不为0,则将所述压缩线程睡眠时间减半,若减半后的压缩线程睡眠时间小于最小时间,则将所述压缩线程睡眠时间设置为最小时间。
具体的,流程如下:
参考图12,图12是本发明实施例提供的一种数据压缩的装置的功能模块示意图。
获取模块1201,用于根据待压缩的slab类数据中的存储对象获取已存储且未被压缩的数据;
存储模块1202,用于根据预设压缩函数对所述已存储且未被压缩的数据进行压缩,并将压缩后的数据存储在全局缓存区中;
分配模块1203,用于申请与所述压缩后的数据大小对应的存储对象,存储所述压缩后的数据,在新分配的存储对象中标识所述压缩后的数据为已压缩。
优选地,所述装置还包括:
增加模块,用于设置压缩尝试次数,若压缩后的数据因内存空间不足无法存储,则增加压缩尝试次数,并进行下一次压缩尝试。
优选地,所述装置还包括:
释放模块,用于释放所述压缩前的数据占用的存储对象,将所述存储压缩后数据的存储对象插入哈希表和LRU链表中进行查找与管理。
优选地,所述装置还包括:
判断模块,用于在根据待压缩的slab类中的存储对象获取已存储且未被压缩的数据之前,在启动数据压缩功能的情况下,判断上次压缩时是否为暂停压缩;若是,则从上次暂停压缩的slab类位置上继续压缩;若否,则从后往前对每个slab类中的数据进行压缩。
优选地,所述装置还包括:
设置模块,用于若压缩数量为0,且压缩线程睡眠时间小于最大时间,则睡眠时间增加N秒,若压缩数量不为0,则将所述压缩线程睡眠时间减半,若减半后的压缩线程睡眠时间小于最小时间,则将所述压缩线程睡眠时间设置为最小时间。
本发明实施例提供一种数据压缩的装置,根据待压缩的slab类数据中的存储对象获取已存储且未被压缩的数据;根据预设压缩函数对所述已存储且未被压缩的数据进行压缩,并将压缩后的数据存储在全局缓存区中;申请与所述压缩后的数据大小对应的存储对象,为所述压缩后的数据分配新的存储对象,在新分配的存储对象中标识所述压缩后的数据为已压缩,采用批量压缩的方式对Memcached中存储的数据进行压缩以及对象存储slab类型的切换,根据压缩情况动态改变压缩线程的休眠情况,能够识别和处理特殊或者已经被压缩过的存储对象,使得数据压缩线程对Memcached的slab延迟影响较小;压缩使得Memcached存储对象数量明显提高,达到相同命中率只需标准Memcached70%的内存空间;当内存与Memcached工作集的比值在一定范围内,使用压缩可以显著降低延迟,提升系统性能。
参考图13,图13是本发明实施例提供的一种Memcached系统结构图。
Memcached是一个被互联网网站广泛使用的全内存键值对象存储系统,作为前端服务器应用层和后端数据库之间的数据缓存层,查询以及访问数据库的速度得到了极大地提升,如图13。通过利用Memcached,数据中心服务器的空闲内存可以用来加速对频繁访问信息的获取。Memcached在网站加速方面具有重要应用:将内存缓存系统置于网站前端应用程序和后端数据库之间,用于缓存数据库的访问结果,减少数据库访问次数和访问延迟。例如,Facebook、YouTube、Wikipedia、Yahoo等等都在使用memcached来支持他们每天数亿级的页面访问。内存缓存系统也可以作为Hadoop、MapReduce甚至虚拟机的加速系统。
应用方式:
在Memcached服务器中对数据进行压缩和解压缩。
在Memcached服务器进行压缩,在应用服务器中进行解压缩。
以上结合具体实施例描述了本发明实施例的技术原理。这些描述只是为了解释本发明实施例的原理,而不能以任何方式解释为对本发明实施例保护范围的限制。基于此处的解释,本领域的技术人员不需要付出创造性的劳动即可联想到本发明实施例的其它具体实施方式,这些方式都将落入本发明实施例的保护范围之内。