本发明公开一种轻量级主动过期式数据缓存方法及系统,涉及数据存储技术领域。
背景技术:
数据缓存(datacaching)是当前计算机和通信领域常用的技术之一,在即时通讯、电商、视频直播等场景下都有广泛的应用,主旨是将频繁访问的热数据在寄存器、内存、或高性能的外部存储设备中进行预加载,从而减少对实际存储介质访问次数,最终达到降低整体业务的响应时间并减少物理存储设备或存储服务器压力的目的。
数据缓存常用的设计思路,一般是采用内存池(memorypool)的方式在系统堆中申请大量分块的内存,采用hash表的形式对数据进行组织,因为系统内存容量总是有限,所以往往需要将部分过期数据进行删除,同时当内存满时采用lru算法删除长时间未使用的数据或放到外部缓存中(redis思路)。
目前常用的数据缓存工具,如memcache、redis等,通常以独立服务形式进行提供,一般需要独立的服务器进行部署,对硬件有一定要求;而常见的嵌入式缓存,往往受制于系统本身影响,存储能力较为有限,比较依赖系统内存。
针对当前常见数据缓存实现存在的体量大、cpu资源消耗高、依赖内存较多的问题,满足硬件资源较为紧张前提下,本发明改变传统数据缓存的实现思路,提出一种轻量级主动过期式数据缓存方法及系统,以解决上述问题。
技术实现要素:
本发明针对现有技术的问题,提供一种轻量级主动过期式数据缓存方法及系统,所采用的技术方案为:一种轻量级主动过期式数据缓存方法,所述的方法的具体步骤包括:
s1利用磁盘存储对数据读取;
s2利用磁盘存储将数据写入;
s3采用轮询线程额外处理内存数据的lru切换和过期数据的删除。
所述s1利用磁盘存储对数据读取的具体步骤包括:
s101查询内存存储,如果找到,直接返回;
s102如果未找到,查询磁盘存储,如果未找到,直接返回;
s103如果在磁盘存储部分找到,则同步到内存存储,并返回。
所述s2利用磁盘存储将数据写入的具体步骤包括:
s201查询内存存储和磁盘存储,如果存在则先删除;
s202将数据写入内存存储;
s203如果内存存储已满,则执行lru算法,替换一个数据到磁盘存储。
所述s3采用轮询线程额外处理内存数据的lru切换和过期数据的删除的具体步骤包括:
s201轮询线程根据规则每间隔一段时间遍历每一个内存存储数据;
s202删除过期的内存数据;
s203将数据通过lru算法切换到磁盘存储。
所述s1中的磁盘存储基于b+树实现。
一种轻量级主动过期式数据缓存系统,所述的方法的具体步骤包括数据读取模块、数据写入模块和数据轮询模块:
数据读取模块:利用磁盘存储对数据读取;
数据写入模块:利用磁盘存储将数据写入;
数据轮询模块:采用轮询线程额外处理内存数据的lru切换和过期数据的删除。
所述数据读取模块具体包括查询模块a、查询模块b和同步模块:
查询模块a:查询内存存储,如果找到,直接返回;
查询模块b:如果未找到,查询磁盘存储,如果未找到,直接返回;
同步模块:如果在磁盘存储部分找到,则同步到内存存储,并返回。
所述数据写入模块具体包括查询模块c、存写模块和替换模块:
查询模块c:查询内存存储和磁盘存储,如果存在则先删除;
存写模块:将数据写入内存存储;
替换模块:如果内存存储已满,则执行lru算法,替换一个数据到磁盘存储。
所述数据轮询模块具体包括检测模块、清除模块和切换模块:
检测模块:轮询线程根据规则每间隔一段时间遍历每一个内存存储数据;
清除模块:删除过期的内存数据;
切换模块:将数据通过lru算法切换到磁盘存储。
所述数据读取模块中的磁盘存储基于b+树实现。
本发明的有益效果为:相对于传统的缓存实现方式,本发明进行如下改造:
缓存不完全存储在内存中,而是分别存储在内存和磁盘两个部分;
内存仅存储访问使用较多的数据,使用少的数据存储在磁盘中,从而减少内存的占用;
内存和磁盘两部分存储之间的数据切换同步使用lru+布隆过滤+轮询方式,尽可能减少cpu消耗;
缓存组件本身不需要独立部署,采用动态链接库、jar包等形式嵌入在使用者的进程内部,无额外的维护成本,且无网络通信成本。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明方法的流程图;图2是本发明系统的结构示意图;图3是缓存使用者进程架构图;图4是传统缓存方式架构图。
具体实施方式
下面结合附图和具体实施例对本发明作进一步说明,以使本领域的技术人员可以更好地理解本发明并能予以实施,但所举实施例不作为对本发明的限定。
实施例一:
一种轻量级主动过期式数据缓存方法,所述的方法的具体步骤包括:
s1利用磁盘存储对数据读取;
s2利用磁盘存储将数据写入;
s3采用轮询线程额外处理内存数据的lru切换和过期数据的删除;
进一步的,所述s1利用磁盘存储对数据读取的具体步骤包括:
s101查询内存存储,如果找到,直接返回;
s102如果未找到,查询磁盘存储,如果未找到,直接返回;
s103如果在磁盘存储部分找到,则同步到内存存储,并返回;
进一步的,所述s2利用磁盘存储将数据写入的具体步骤包括:
s201查询内存存储和磁盘存储,如果存在则先删除;
s202将数据写入内存存储;
s203如果内存存储已满,则执行lru算法,替换一个数据到磁盘存储;
进一步的,所述s3采用轮询线程额外处理内存数据的lru切换和过期数据的删除的具体步骤包括:
s201轮询线程根据规则每间隔一段时间遍历每一个内存存储数据;
s202删除过期的内存数据;
s203将数据通过lru算法切换到磁盘存储;
再进一步的,所述s1中的磁盘存储基于b+树实现;
实施例二:
一种轻量级主动过期式数据缓存系统,所述的方法的具体步骤包括数据读取模块、数据写入模块和数据轮询模块:
数据读取模块:利用磁盘存储对数据读取;
数据写入模块:利用磁盘存储将数据写入;
数据轮询模块:采用轮询线程额外处理内存数据的lru切换和过期数据的删除。
进一步的,所述数据读取模块具体包括查询模块a、查询模块b和同步模块:
查询模块a:查询内存存储,如果找到,直接返回;
查询模块b:如果未找到,查询磁盘存储,如果未找到,直接返回;
同步模块:如果在磁盘存储部分找到,则同步到内存存储,并返回。
进一步的,所述数据写入模块具体包括查询模块c、存写模块和替换模块:
查询模块c:查询内存存储和磁盘存储,如果存在则先删除;
存写模块:将数据写入内存存储;
替换模块:如果内存存储已满,则执行lru算法,替换一个数据到磁盘存储。
进一步的,所述数据轮询模块具体包括检测模块、清除模块和切换模块:
检测模块:轮询线程根据规则每间隔一段时间遍历每一个内存存储数据;
清除模块:删除过期的内存数据;
切换模块:将数据通过lru算法切换到磁盘存储。
再进一步的,所述数据读取模块中的磁盘存储基于b+树实现。
相对于传统的缓存实现方式,本发明进行如下改造:
缓存不完全存储在内存中,而是分别存储在内存和磁盘两个部分;
内存仅存储访问使用较多的数据,使用少的数据存储在磁盘中,从而减少内存的占用;
内存和磁盘两部分存储之间的数据切换同步使用lru+布隆过滤+轮询方式,尽可能减少cpu消耗;
缓存组件本身不需要独立部署,采用动态链接库、jar包等形式嵌入在使用者的进程内部,无额外的维护成本,且无网络通信成本;
数据切换同步的流程如下:
将存储层面分为内存存储(memorystore)、磁盘存储(diskstore)、轮询线程(pollthread)三部分,内存存储使用hash表搭配lru进行,一次内存分配不做额外的内存池处理,每次读取时检查数据如果已经过期则删除,如果写入时内存已经满,则将数据同步到磁盘存储;磁盘存储基于b+树实现,用于存储通过内存存储lru替换下的数据;轮询线程用于定期通过lru方式切换内存存储中的部分老数据到磁盘存储中;
数据从内存存储到磁盘存储的查询过程中存在一个访问磁盘的问题,如果对磁盘访问和查询过于频繁,会影响性能,这里增加一个布隆过滤(bloomfilter)用于记录写入到磁盘的数据;
其中内存存储部分可实现基本的缓存操作,磁盘存储可将内存存储通过lru切换下来的数据在当前的磁盘当中缓存,以解决内存的限制,而对内存存储的定时轮询则可以解决传统缓存在针对过期和lru替换过程存在的频繁检测造成的cpu高消耗的问题;缓存本身需要使用内存仅内存存储部分,所以对系统自身的内存依赖较小;
整体流程如下:
数据读取:
(1)查询内存存储,如果找到,直接返回;
(2)如果未找到,查询磁盘存储,如果未找到,直接返回;
(3)如果在磁盘存储部分找到,则同步到内存存储,并返回;
数据写入:
(1)查询内存存储和磁盘存储,如果存在则先删除;
(2)将写入内存存储;
(3)如果内存存储已满,则执行lru算法,替换一个数据到磁盘存储;
数据轮询检测:
(1)轮询线程根据规则每间隔一段时间遍历每一个内存存储数据;
(2)删除过期的内存数据;
(3)将数据通过lru算法切换到磁盘存储。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。