本发明涉及计算机技术领域,具体涉及一种基于fastdfs redis的分布式文件存储系统及方法。
背景技术:
随着互联网的发展,推动着大数据时代的到来。在这过程当中,除了非结构化数据,结构化数据也在以爆炸式的速度增长。结构化数据通常是指大小处于2kb-1mb之间的小文件。文件数据的存储包含文件元数据和文件内容的存储,目前文件元数据的存储通常采用mysql,当数据规模越来越大时,存取性能急剧下降;fastdfs作为一个轻量级的开源分布式文件系统,适合中小型文件的存储,但fastdfs将数据存储在磁盘上,每次访问都需要从磁盘读取数据,多次的io造成了查询性能的降低。为减小磁盘的访问次数,提高文件的读速度,可选的方案有引入redis作为文件缓存服务,但redis是基于内存的数据库,直接利用redis缓存文件会造成内存空间占用过大、查询性能低的问题,从而无法适用于大规模文件数据;此外,使用redis作为缓存服务时,redis提供的6种原生缓存淘汰策略,对于随意性和周期性的查询,缓存命中率不高。
技术实现要素:
有鉴于此,本发明的目的在于提供一种基于fastdfs redis的分布式文件存储系统及方法,实现文件数据更为高效的存储和读写,解决redis缓存文件时字符串长度过长、内存空间占用大的问题,提高了内存空间的利用率,具备良好的缓存命中率。
为实现上述目的,本发明采用如下技术方案:
一种基于fastdfs redis的分布式文件存储系统,包括数据库和中间件;所述中间件包括存储模块、查询模块和删除模块;所述存储模块利用fastdfs集群实现海量文件数据的分布式存储;所述查询模块利用redis集群实现基于分布式缓存的高性能文件查询;所述删除模块提供分布式文件的删除功能。
进一步的,所述存储模块包括文件上传组件,缓存压缩组件和缓存替换组件。
基于fastdfs redis的分布式文件存储系统的文件上传方法,包括以下步骤:
步骤1:根据指定路径获取文件内容和文件元数据信息,将文件上传到fastdfs;
步骤2:判断文件上传是否成功,若失败则抛出异常,结束;
步骤3:将上传成功后返回的fileid与元数据写入redis;
步骤4:判断redis写数据是否成功,若成功,则文件上传成功;
步骤5:判断写redis次数是否小于系统默认设置值,若小于转步骤3;
步骤6:从fastdfs中删除文件,并返回上传失败。
进一步的,所述文件的元数据存储具体为:将元数据中的所有者、文件名、文件类形三个字段拼接而成的字符串设置为键,剩余的字段加上fileid拼接而成的字符串作为键对应的值,以键-值的形式写入redis。
进一步的,所述缓存压缩组件,将待缓存文件使用base64编码,对编码后的文件使用gzip算法压缩,最后将编码压缩后的文件写入redis。
一种基于fastdfs redis的分布式文件存储系统的缓存替换方法,包括以下步骤:
步骤1:使用一个历史队列记录文件的使用次数;
步骤2:将文件索引写入历史访问队列,若该文件的索引已经存在,则对该记录的使用次数加1;若不存在,则将该文件索引写入访问队列中,并且设置使用次数为1;
步骤3:当文件使用次数达到k次时,将编码压缩后的文件写入redis缓存中;
步骤4:判断缓存容量是否小于系统预设的阈值,若是,转步骤6;
步骤5:按照文件使用频率高低,进行缓存的淘汰选择;
步骤6:将编码压缩后的文件数据写入redis。
优选的,所述文件使用频率计算公式如下:
其中
进一步的,所述查询模块根据查询条件,先查询redis,若redis中存在该文件的缓存,则返回经gzip算法解压和base64解码后的文件;否则,利用fileid查询fastdfs获取文件,更新记录的查询次数,判断是否符合缓存替换算法的执行条件。
一种基于fastdfs redis的分布式文件存储系统的删除方法,包括以下步骤:
步骤1:根据删除条件查询redis,获取文件的fileid;
步骤2:判断redis中是否存在文件的缓存,存在则转步骤6;
步骤3:根据fileid,删除fastdfs上保存的文件;
步骤4:判断文件删除是否成功,成功则结束;
步骤5:判断尝试删除次数是否小于系统预设的阈值,是则删除次数加一,转步骤3;否则结束;
步骤6:拷贝文件作为副本;
步骤7:执行同时删除的操作,分别删除redis上的缓存和fastdfs上的文件;
步骤8:判断是否同时删除成功,是则删除成功,结束;
步骤9:判断尝试删除次数是否小于系统预设的阈值,是则删除次数加一,转步骤7;
步骤10:回滚删除操作,将预先保存的副本重新写入中间件中,结束。
本发明与现有技术相比具有以下有益效果:
1、本发明利用fastdfs集群实现海量文件数据的分布式存储,利用redis集群实现基于分布式缓存的高性能文件查询,使得系统具有良好的查询性能。
2、本发明提出一种基于base64和gzip压缩算法的文件压缩缓存策略,解决了redis缓存文件时字符串长度过长、内存空间占用大的问题,提高了内存空间的利用率。
3、本发明设计了一种基于文件使用频率的缓存替换算法,使得系统具备良好的缓存命中率。
附图说明
图1是本发明系统架构示意图;
图2为本发明一实施例中文件上传流程图;
图3为本发明一实施例中缓存写入流程图;
图4为本发明一实施例中查询模块流程图;
图5为本发明一实施例中删除模块流程图。
具体实施方式
下面结合附图及实施例对本发明做进一步说明。
请参照图1,本发明提供一种基于fastdfs redis的分布式文件存储系统,包括数据库和中间件;所述中间件包括存储模块、查询模块和删除模块;所述存储模块利用fastdfs集群实现海量文件数据的分布式存储;所述查询模块利用redis集群实现基于分布式缓存的高性能文件查询;所述删除模块提供分布式文件的删除功能。存储模块包括文件上传组件,缓存压缩组件和缓存替换组件。
参考图2,在本实施例中,文件上传组件实现了利用redis集群存储文件元数据和利用fastdfs集群存储文件;文件的上传包含文件内容和文件元数据的存储,只有两者都保存成功,才能认定文件上传成功。若其中任意一项上传失败,则代表一次文件上传失败。可在系统预设的阈值内多次尝试上传,当达到阈值后,代表文件上传最终失败,具体包括以下步骤:
步骤1:根据指定路径获取文件内容和文件元数据信息,将文件上传到fastdfs;
步骤2:判断文件上传是否成功,若失败则抛出异常,结束;
步骤3:将文件上传成功后返回的fileid与元数据存写入redis;
步骤4:判断redis写数据是否成功,若成功,则文件上传成功;
步骤5:判断写redis次数是否小于系统默认设置值,若小于转步骤3;
步骤6:从fastdfs中删除文件,并返回上传失败。
在本实施例中,文件的元数据存储具体为:将元数据中的所有者、文件名、文件类形三个字段拼接而成的字符串设置为键,剩余的字段加上fileid拼接而成的字符串作为键对应的值,以键-值的形式写入redis。
在本实施例中,缓存压缩组件,将待缓存文件使用base64编码,对编码后的文件进行gzip压缩,最后将编码压缩后的文件写入redis。
参考图3,在本实施例中,缓存替换组件利用文件当前周期使用频率和文件历史使用频率值计算文件最终使用频率值,当文件使用次数达到k次时,将编码压缩后的文件写入redis,若缓存空间已满,根据频率值的高低进行缓存的淘汰选择。
具体的缓存替换方法,包括以下步骤:
步骤1:使用一个历史队列记录文件的使用次数;
步骤2:将文件索引写入历史访问队列,若该文件的索引已经存在,则对该记录的使用次数加1;若不存在,则将该文件索引写入访问队列中,并且设置使用次数为1;
步骤3:当文件使用次数达到k次时,将编码压缩后的文件写入redis缓存中;
步骤4:判断缓存容量是否小于系统预设的阈值,若是,转步骤6;
步骤5:按照文件使用频率高低,进行缓存的淘汰选择;
步骤6:将编码压缩后的文件数据写入redis。
优选的,所述文件使用频率计算公式如下:
其中
参考图4,在本实施例中,所述查询模块根据查询条件,先查询redis,若redis中存在该文件的缓存,则返回经gzip算法解压和base64解码后的文件;否则,利用fileid查询fastdfs获取文件,更新记录的查询次数,判断是否符合缓存替换算法的执行条件。具体包括以下步骤:
步骤1:根据用户输入的查询条件生成key,查询redis。
步骤2:判断redis中是否存在文件,若不存在,转步骤5。
步骤3:更新该记录的查询次数。
步骤4:返回经gzip算法解压和base64解码后的文件。
步骤5:查询redis,获取fileid。
步骤6:根据fileid查询fastdfs,返回文件。
参考图5,在本实施例中,删除模块通过查询操作确定文件存储的位置才能进行删除操作,当删除的文件是热文件时,需要将文件从redis和fastdfs上同步删除;当文件是冷文件时,只需要在fastdfs上删除文件即可。可多次尝试删除,当达到系统预设的阈值时,文件删除最终失败,具体包括以下步骤:
步骤1:根据删除条件查询redis,获取文件的fileid;
步骤2:判断redis中是否存在文件的缓存,存在则转步骤6;
步骤3:根据fileid,删除fastdfs上保存的文件;
步骤4:判断文件删除是否成功,成功则结束;
步骤5:判断尝试删除次数是否小于系统预设的阈值,是则删除次数加一,转步骤3;否则结束;
步骤6:拷贝文件作为副本;
步骤7:执行同时删除的操作,分别删除redis上的缓存和fastdfs上的文件;
步骤8:判断是否同时删除成功,是则删除成功,结束;
步骤9:判断尝试删除次数是否小于系统预设的阈值,是则删除次数加一,转步骤7;
步骤10:回滚删除操作,将预先保存的副本重新写入中间件中,结束。
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。
1.一种基于fastdfs redis的分布式文件存储系统,其特征在于,包括数据库和中间件;所述中间件包括存储模块、查询模块和删除模块;所述存储模块利用fastdfs集群实现海量文件数据的分布式存储;所述查询模块利用redis集群实现基于分布式缓存的高性能文件查询;所述删除模块提供分布式文件的删除功能。
2.根据权利要求1所述的基于fastdfs redis的分布式文件存储系统,其特征在于,所述存储模块包括文件上传组件,缓存压缩组件和缓存替换组件。
3.根据权利要求2所述的基于fastdfs redis的分布式文件存储系统的文件上传方法,其特征在于,包括以下步骤:
步骤1:根据指定路径获取文件内容和文件元数据信息,将文件上传到fastdfs;
步骤2:判读文件是否上传成功,若失败则抛出异常,结束;
步骤3:将上传成功后返回的fileid与元数据写入redis;
步骤4:判断redis写数据是否成功,若成功,则文件上传成功;
步骤5:判断写redis次数是否小于系统默认设置值,若小于转步骤3;
步骤6:从fastdfs中删除文件,并返回上传失败。
4.根据权利要求3所述的基于fastdfs redis的分布式文件存储系统的文件上传方法,其特征在于,所述文件的元数据存储具体为:将元数据中的所有者、文件名、文件类形三个字段拼接而成的字符串设置为键,剩余的字段加上fileid拼接而成的字符串作为键对应的值,以键-值的形式写入redis。
5.根据权利要求2所述的基于fastdfs redis的分布式文件存储系统,其特征在于,所述缓存压缩组件,将待缓存文件使用base64编码,对编码后的文件使用gzip算法压缩,最后将编码压缩后的文件写入redis。
6.根据权利要求2所述的基于fastdfs redis的分布式文件存储系统的缓存替换方法,其特征在于,包括以下步骤:
步骤1:使用一个历史队列记录文件的使用次数;
步骤2:将文件索引写入历史访问队列,若该文件的索引已经存在,则对该记录的使用次数加1;若不存在,则将该文件索引写入访问队列中,并设置使用次数为1;
步骤3:当文件使用次数达到k次时,将编码压缩后的文件写入redis缓存中;
步骤4:判断缓存容量是否小于系统预设的阈值,若是,转步骤6;
步骤5:按照文件使用频率高低,进行缓存的淘汰选择;
步骤6:将编码压缩后的文件数据写入redis。
7.根据权利要求6所述的基于fastdfs redis的分布式文件存储系统的缓存替换方法,其特征在于,所述文件使用频率计算公式如下:
其中
8.根据权利要求1所述的基于fastdfs redis的分布式文件存储系统,其特征在于,所述查询模块根据查询条件,先查询redis,若redis中存在该文件的缓存,则返回经gzip算法解压和base64解码后的文件;否则,利用fileid查询fastdfs获取文件,更新记录的查询次数,判断是否符合缓存替换算法的执行条件。
9.根据权利要求1所述的基于fastdfs redis的分布式文件存储系统的删除方法,其特征在于,包括以下步骤:
步骤1:根据删除条件查询redis,获取文件的fileid;
步骤2:判断redis中是否存在文件的缓存,存在则转步骤6;
步骤3:根据fileid,删除fastdfs上保存的文件;
步骤4:判断文件删除是否成功,成功则结束;
步骤5:判断尝试删除次数是否小于系统预设的阈值,是则删除次数加一,转步骤3;否则结束;
步骤6:拷贝文件作为副本;
步骤7:执行同时删除的操作,分别删除redis上的缓存和fastdfs上的文件;
步骤8:判断是否同时删除成功,是则删除成功,结束;
步骤9:判断尝试删除次数是否小于系统预设的阈值,是则删除次数加一,转步骤7;
步骤10:回滚删除操作,将预先保存的副本重新写入中间件中,结束。
技术总结