发明内容
本发明所要解决的技术问题是针对现有技术存在的上述问题,提供了一种提高缓存有效容量的只读缓存的去冗余系统、只读缓存的去冗余方法和缓存的去冗余方法。
为解决上述问题,本发明的一种技术方案是:
一种只读缓存的去冗余系统,包括主控模块、若干用于存储数据的数据块和若干用于索引数据块的索引模块,主控模块分别与数据块和索引模块相连,数据块与索引模块一一对应,索引模块内设有用于存储数据块访问记录的缓存替换信息单元和用于存储低速存储介质上访问数据地址的数据地址标签单元,所述索引模块内还设有用于存储数据块哈希值的数据块哈希值单元,主控模块计算数据块的哈希值并将哈希值写入数据块哈希值单元中存储,所述数据地址标签单元内设有多个的数据地址标签,同一数据地址标签单元中所有的数据地址标签在低速存储介质上指代的数据内容相同,同一数据地址标签单元中所有的数据地址标签在缓存中均指代对应的同一数据块。
优选地,所述缓存替换信息单元内存储有数据块的访问记录和数据冗余度,所述数据冗余度为数据地址标签单元中有效数据地址标签的个数。
相比较于现有技术,本发明的只读缓存的去冗余系统通过计算比较每个数据块的哈希值,寻找并合并冗余数据,同时给每个数据块增加了多个数据地址标签,这些数据标签用于存储数据内容相同的数据块所对应的数据使用者在访问低速存储介质时使用的数据地址,以达到对应不同数据地址的冗余数据块在缓存中共享一个数据块的目的,节省了缓存的存储空间。
本发明的另一种技术方案是:
一种只读缓存的去冗余方法,所述方法基于上述提及的去冗余系统,所述方法包括如下步骤:
a)主控模块读取数据时,根据读取的访问数据地址,搜索只读缓存中所有数据地址标签单元中的数据地址标签,若数据地址标签单元中包含所述访问数据地址,则读取访问数据地址对应数据块中的数据并将数据返回到主控模块,同时更新缓存替换信息单元中的替换信息,否则,进入步骤b;
b)从低速存储介质中读取所述访问数据地址对应的访问数据并将数据返回到主控模块,同时主控模块计算访问数据的哈希值;
c)将访问数据的哈希值与缓存中所有数据块哈希值单元中的哈希值进行比较,若缓存中包含访问数据的哈希值,则将所述访问数据地址存储到哈希值相同的索引模块的数据地址标签单元中,同时更新缓存替换信息单元中的替换信息,否则,进入步骤d;
d)检测缓存是否已满,若缓存未满,将所述访问数据写入缓存的数据块中,进入步骤e,否则,根据缓存替换算法选择需要被替换的数据块,将访问数据写入需要被替换的数据块中,进入步骤e;
e)更新与步骤d中数据块对应的索引模块,将所述访问数据地址存储到数据地址标签单元中,更新缓存替换信息单元中的替换信息,并将步骤b中计算得到的哈希值写入数据块哈希值单元中存储。
优选地,所述更新缓存替换信息单元中的替换信息具体为:更新数据块的访问记录和数据冗余度,所述数据冗余度为数据地址标签单元中有效数据地址标签的个数。
优选地,所述步骤d中的缓存替换算法具体为:将缓存中所有数据块根据数据冗余度从低到高进行排序,选择数据冗余度相同且数据冗余度最低的数据块,采用LRU算法计算出需要被替换的数据块。
优选地,所述哈希值是采用哈希函数计算得到,哈希函数为MD5、SHA或SHA256中的一种。
相比较于现有技术,本发明的只读缓存的去冗余方法通过数据块哈希值比较寻找并合并冗余数据,同时给每个数据块增加了多个数据地址标签,这些数据标签用于存储数据内容相同的数据块所对应的数据使用者在访问低速存储介质时使用的数据地址,以达到对应不同数据地址的冗余数据块在缓存中共享一个数据块的目的,节省了缓存的存储空间,同时结合数据的冗余度优化了缓存替换算法。
本发明的再一种技术方案是:
一种缓存的去冗余方法,所述方法基于权利要求1所述的去冗余系统,所述方法包括操作类型判断步骤、读操作去冗余步骤和写操作步骤,具体为:
操作类型判断步骤:判断主控模块的操作类型,若是读操作,则进入读操作去冗余步骤,若是写操作,则进入写操作步骤;
读操作去冗余步骤:根据读操作的访问数据地址,判断访问数据地址是否已保存在只读缓存或读写缓存中,若访问数据地址均不在只读缓存和读写缓存中,则进入步骤A,若访问数据地址已保存在读写缓存中存储,则进入步骤B,若访问数据地址已保存在只读缓存中,则进入步骤C,否则,返回操作类型判断步骤;
写操作步骤:根据写操作的访问数据地址,判断访问数据地址是否已保存在只读缓存和读写缓存中,若访问数据地址均不在只读缓存和读写缓存中,则进入步骤B,若访问数据地址已保存在读写缓存中存储,则进入步骤B,若访问数据地址已保存在只读缓存中,则进入步骤D,否则,返回操作类型判断步骤;
A)从低速存储介质中读取所述访问数据地址对应的访问数据并将数据返回到主控模块,同时主控模块计算访问数据的哈希值;将访问数据的哈希值与只读缓存中所有数据块哈希值单元中的哈希值进行比较,若只读缓存中包含访问数据的哈希值,则将所述访问数据地址存储到哈希值相同的索引模块的数据地址标签单元中,同时更新缓存替换信息单元中的替换信息,返回操作类型判断步骤,否则,进入步骤A1;
A1)检测只读缓存是否已满,若缓存未满,将所述访问数据写入缓存的数据块中,进入步骤A2,否则,根据缓存替换算法选择需要被替换的数据块,将访问数据写入需要被替换的数据块中,进入步骤A2;
A2)更新与步骤A1中数据块对应的索引模块,将所述访问数据地址存储到数据地址标签单元中,更新缓存替换信息单元中的替换信息,并将步骤A中计算得到的哈希值写入数据块哈希值单元中存储,返回操作类型判断步骤;
B)由读写缓存处进行读写访问,返回操作类型判断步骤;
C)根据读取的访问数据地址,读取访问数据地址对应数据块中的数据并将数据返回到主控模块,同时更新缓存替换信息单元中的替换信息,返回操作类型判断步骤;
D)在只读缓存中删除写操作地址对应的数据地址标签,返回步骤B。
优选地,所述更新缓存替换信息单元中的替换信息具体为:更新数据块的记录和数据冗余度,所述数据冗余度为数据地址标签单元中有效数据地址标签的个数。
优选地,所述步骤A1中的缓存替换算法具体为:将缓存中所有数据块根据数据冗余度从低到高进行排序,选择数据冗余度相同且数据冗余度最低的数据块,采用LRU算法计算出需要被替换的数据块。
相比较于现有技术,本发明的缓存的去冗余方法适用于缓存的读操作和写操作,通过读写操作的区分及访问地址的存储位置来判断是否应用只读缓存去冗余方法,针对于只读缓存,使用数据块哈希值比较寻找并合并冗余数据,同时给每个数据块增加了多个数据地址标签,以达到对应不同数据地址的冗余数据块在缓存中共享一个数据块的目的,节省了缓存的存储空间,同时结合数据的冗余度优化了缓存替换算法,针对于读写缓存则采用普通缓存方式,该方法尤其适合文件和磁盘等需要支持读写操作的缓存。
具体实施方式
下面结合附图和实施例进一步详细说明本发明,但本发明的保护范围并不限于此。
参照图1,本发明的只读缓存的去冗余系统,包括主控模块、若干用于存储数据的数据块和若干用于索引数据块的索引模块,主控模块分别与数据块和索引模块相连,数据块与索引模块一一对应,即索引模块1用于索引数据块1,索引模块N用于索引数据块N。索引模块和数据块存储于只读缓存中,用于提高光驱等只读设备的访问性能。索引模块内设有缓存替换信息单元、数据地址标签单元和数据块哈希值单元,缓存替换信息单元、数据地址标签单元和数据块哈希值单元用于提高只读缓存的有效容量。
数据块哈希值单元用于存储数据块哈希值,主控模块在读取访问时,会计算每个数据块的哈希值并将哈希值写入与该数据块对应的数据块哈希值单元中存储,通过每个数据块的哈希值可以识别只读缓存中内容相同的冗余数据块。数据块哈希值单元给缓存中每个数据块增加一个字段用于存储数据内容的哈希值,哈希值用于快速判断不同数据块的数据内容是否相同。哈希值的计算方法可以使用通用的哈希函数如MD5(Message Digest Algorithm MD5)、SHA(Secure HashAlgorithm)等,将大块的数据通过数学运算得到一个数据量很小的哈希值。比如使用一个256位的二进制数来存储一个8K字节数据块的哈希值,通过哈希值的比较,缓存可以快速的判断两个数据块是否包含完全一样的数据。如果两个数据块的哈希值不同,那么这两个数据块的数据内容必然不同,如果两个数据块的哈希值相同,那么这两个数据块有很高的概率包含相同的数据。根据实际应用的要求,可以选择是否对哈希值相同的数据块进行完整数据比较来确定数据内容是否相同,如果采用SHA256等用于加密应用的哈希函数,两个不同数据块产生同样哈希值的概率远远小于硬件存储设备数据出错的概率,因此对大多数应用将不需要再进行完整数据比较。
数据地址标签单元用于存储低速存储介质上访问数据地址,数据地址标签单元内设有多个的数据地址标签,同一数据地址标签单元中所有的数据地址标签在低速存储介质上指代的数据内容相同,同一数据地址标签单元中所有的数据地址标签在缓存中均指代对应的同一数据块。缓存的每个数据块相对于现有技术增加了多个数据地址标签,这些数据标签用于存储数据内容相同的数据块所对应的数据使用者在访问低速存储介质时使用的数据地址。由于数据块的容量通常远大于数据地址标签对存储空间的占用,并且合并了内容相同的冗余数据块,这样的设计就能达到对应不同数据地址的冗余数据块在缓存中共享一个数据块的目的,节省了缓存的存储空间。
缓存替换信息单元用于存储数据块访问记录等,缓存替换信息单元内存储有数据块的访问记录和数据冗余度,访问记录包括访问频次、访问时间等,其中数据冗余度为数据地址标签单元中数据地址标签的有效存储个数,即存储的访问数据地址的个数。根据缓存替换信息单元的替换信息,优化了传统的缓存替换算法。如果缓存的存储空间已经完全被数据块占用,再分配新的数据块到缓存时就需要用新的数据块替换掉一个原有的数据块,缓存替换算法用于在缓存中选择相对不重要的数据块作为被替换的对象。使用本发明提出的去冗余缓存设计之后,可以根据数据块的数据冗余度来判断数据块的重要性,数据冗余度指某个数据块对应的不同数据地址的数量,该值越大,就有越多的地址包含该数据块的数据,其数据冗余度和相对重要性就越高。因此,缓存替换算法需要优先选择冗余度低的数据块作为被替换的对象。
参照图1-2,本发明的一种只读缓存的去冗余方法,所述方法基于上述提及的去冗余系统,所述方法包括如下步骤:
a)主控模块读取数据时,根据读取的访问数据地址,搜索只读缓存中所有数据地址标签单元中的数据地址标签,若数据地址标签单元中包含所述访问数据地址,则读取访问数据地址对应数据块中的数据并将数据返回到主控模块,同时更新缓存替换信息单元中的替换信息,否则,进入步骤b;
b)从低速存储介质中读取所述访问数据地址对应的访问数据并将数据返回到主控模块,同时主控模块计算访问数据的哈希值;
c)将访问数据的哈希值与缓存中所有数据块哈希值单元中的哈希值进行比较,若缓存中包含访问数据的哈希值,则将所述访问数据地址存储到哈希值相同的索引模块的数据地址标签单元中,同时更新缓存替换信息单元中的替换信息,否则,进入步骤d;
d)检测缓存是否已满,若缓存未满,将所述访问数据写入缓存的数据块中,进入步骤e,否则,根据缓存替换算法选择需要被替换的数据块,将访问数据写入需要被替换的数据块中,进入步骤e;
e)更新与步骤d中数据块对应的索引模块,将所述访问数据地址存储到数据地址标签单元中,更新缓存替换信息单元中的替换信息,将缓存中所有数据块根据数据冗余度从低到高进行排序,选择数据冗余度相同且数据冗余度最低的数据块,采用LRU(Least Recently Used)算法计算出需要被替换的数据块,并将步骤b中计算得到的哈希值写入数据块哈希值单元中存储。
上述步骤中提及的更新缓存替换信息单元中的替换信息具体为:更新数据块的访问记录和数据冗余度,所述数据冗余度为数据地址标签单元中有效数据地址标签的个数。其中,哈希值是采用哈希函数计算得到,哈希函数为MD5、SHA或SHA256中的一种。
参照图3的缓存结构框图,本发明的一个比较简单的应用,该应用的场景是为只读光盘驱动器增加一个高速读缓存,对于同一数据地址,数据使用者只对数据进行读取操作。该实例中的低速存储介质指光盘驱动器,缓存的存储介质使用操作系统管理的动态内存。该实例假设只读设备数据访问的地址为20位,该缓存分为256个缓存区域,每个缓存区域包含64个数据块。每个数据块的大小是4K字节,每个数据块哈希值为256位,那么整个缓存的数据块容量总和是64M字节。数据使用者访问缓存时首先定位缓存区域,缓存区域一般由数据地址的高8位确定,数据地址标签包含数据地址的低12位,每个数据块最多可以对应四个数据地址标签,使用四个数据地址标签来存储该数据块对应的访问数据地址。缓存替换信息包括最近最少使用(LRU)算法需要使用的数据块访问相对时间信息以及数据块的冗余度,数据冗余度等于数据块对应的有效数据地址标签的个数,其值为0至4。在使用缓存替换算法选择需要被替换的数据块时,首先在数据冗余度为0的数据块中使用LRU算法选择需要被替换的数据块,如果没有数据冗余度为0的数据块,则在数据冗余度为1的数据块中选择,以此类推。这样的缓存替换算法将优先保留数据冗余度高的数据块,以便覆盖更多的数据地址,从而提高缓存的有效容量。
参照图2-3,本实例只读缓存的去冗余方法,包括如下步骤:
a)主控模块读取数据时,根据读取的访问数据地址的高8位确定缓存区域,搜索缓存区域中所有数据地址标签单元中的数据地址标签,若数据地址标签单元中包含所述访问数据地址,则读取访问数据地址对应数据块中的数据并将数据返回到主控模块,同时更新缓存替换信息单元中的替换信息,否则,进入步骤b;
b)从低速存储介质中读取所述访问数据地址对应的访问数据并将数据返回到主控模块,同时主控模块计算访问数据的哈希值;
c)将访问数据的哈希值与缓存区域中所有数据块哈希值单元中的哈希值进行比较,若缓存区域中包含访问数据的哈希值,检测该哈希值对应的数据块已有有效的数据地址标签,数据地址标签单元中数据地址标签是否已满,若已经有四个有效的数据地址标签了,则随机删除一个已有数据地址标签,替换为当前访问数据地址,若未满,则将所述访问数据地址存储到哈希值相同的索引模块的数据地址标签单元中,同时更新缓存替换信息单元中的替换信息,若缓存中不包含访问数据的哈希值,进入步骤d;
d)检测缓存区域是否已满,若缓存未满,将所述访问数据写入缓存区域的数据块中,进入步骤e,否则,根据缓存替换算法选择需要被替换的数据块,将访问数据写入需要被替换的数据块中,进入步骤e;
e)更新与步骤d中数据块对应的索引模块,将所述访问数据地址存储到数据地址标签单元中,更新缓存替换信息单元中的替换信息,将缓存区域中所有数据块根据数据冗余度从低到高进行排序,选择数据冗余度相同且数据冗余度最低的数据块中,采用LRU算法计算出需要被替换的数据块,并将步骤b中计算得到的哈希值写入数据块哈希值单元中存储。
参照图4-5,本发明的另一技术方案:缓存的去冗余方法,所述方法包括操作类型判断步骤、读操作去冗余步骤和写操作步骤,该方法主要针对硬盘文件缓存,并将硬盘文件缓存区分为只读缓存和读写缓存两种。采用该方法进行缓存时,具有如下特点:其一,需要支持对数据的写操作;其二,文件的大小是可变的,而不是固定的大小;其三,数据读取的地址是文件的路径和文件名而不是一个固定长度的数据地址。本文中为了简化说明,在此设计实例中我们假设操作系统可以将文件的路径和文件名通过一个表格映射为一个20位的地址。
本发明的缓存的去冗余方法具体为:
操作类型判断步骤:判断主控模块的操作类型,若是读操作,则进入读操作去冗余步骤,若是写操作,则进入写操作步骤;
读操作去冗余步骤:根据读操作的访问数据地址,判断访问数据地址是否已保存在只读缓存或读写缓存中,若访问数据地址均不在只读缓存和读写缓存中,则进入步骤A,若访问数据地址已保存在读写缓存中存储,则进入步骤B,若访问数据地址已保存在只读缓存中,则进入步骤C,否则,返回操作类型判断步骤;
写操作步骤:根据写操作的访问数据地址,判断访问数据地址是否已保存在只读缓存和读写缓存中,若访问数据地址均不在只读缓存和读写缓存中,则进入步骤B,若访问数据地址已保存在读写缓存中存储,则进入步骤B,若访问数据地址已保存在只读缓存中,则进入步骤D,否则,返回操作类型判断步骤;
A)从低速存储介质中读取所述访问数据地址对应的访问数据并将数据返回到主控模块,同时主控模块计算访问数据的哈希值;将访问数据的哈希值与只读缓存中所有数据块哈希值单元中的哈希值进行比较,若只读缓存中包含访问数据的哈希值,则将所述访问数据地址存储到哈希值相同的索引模块的数据地址标签单元中,同时更新缓存替换信息单元中的替换信息,返回操作类型判断步骤,否则,进入步骤A1;
A1)检测只读缓存是否已满,若缓存未满,将所述访问数据写入缓存的数据块中,进入步骤A2,否则,根据缓存替换算法选择需要被替换的数据块,将访问数据写入需要被替换的数据块中,进入步骤A2;
A2)更新与步骤A1中数据块对应的索引模块,将所述访问数据地址存储到数据地址标签单元中,更新缓存替换信息单元中的替换信息,并将步骤A中计算得到的哈希值写入数据块哈希值单元中存储,返回操作类型判断步骤;
B)由读写缓存处进行读写访问,返回操作类型判断步骤;
C)根据读取的访问数据地址,读取访问数据地址对应数据块中的数据并将数据返回到主控模块,同时更新缓存替换信息单元中的替换信息,返回操作类型判断步骤;
D)在只读缓存中删除写操作地址对应的数据地址标签,返回步骤B。
其中,更新缓存替换信息单元中的替换信息具体为:更新数据块的访问记录和数据冗余度,所述数据冗余度为数据地址标签单元中有效数据地址标签的个数。步骤A1中的缓存替换算法具体为:将缓存中所有数据块根据数据冗余度从低到高进行排序,选择数据冗余度相同且数据冗余度最低的数据块中,采用LRU算法计算出需要被替换的数据块。
参照图4,本发明的缓存的去冗余方法的缓存结构框图,在利用本发明的方法消除冗余时,把文件分为两类,第一类是有大量读操作,但是很少有写操作的文件,该类文件拥有比较稳定的冗余性。比如在硬盘用于存储多个虚拟机用户的应用软件时,同一个软件的文件在不同用户的存储空间中实际上包含同样的内容,并且,这些软件的大部分文件是不需要更改的。第二类文件是有大量的写操作的文件,比如用户配置信息等,这类文件通常只有很少的冗余性,并且其内容多变,难于在缓存中实现高效的去冗余。基于以上分类,本发明将第一类文件缓存于本发明提出的去冗余缓存中,并且只支持读操作,由图4中的只读缓存完成该功能,只读缓存的设计与本发明中只读缓存的去冗余方法相同。第二类文件缓存于不带去冗余功能的传统缓存中,由图4中的读写缓存完成该功能。并且,只读缓存和读写缓存的内容具有互斥性,同一数据地址的文件只能在两种缓存中的一个出现。
本发明的缓存的去冗余方法适用于缓存的读操作和写操作,对于只读缓存和读写缓存都不包括的数据按照第一类文件处理,并将其存储于只读缓存中,对于有任何写操作的文件,都按照第二类文件处理,由读写缓存完成数据访问。通过读写操作的区分及访问地址的存储位置来判断是否应用缓存去冗余方法,针对与只读缓存,使用数据块哈希值比较寻找并合并冗余数据,同时给每个数据块增加了多个数据地址标签,已达到对应不同数据地址的冗余数据块在缓存中共享一个数据块的目的,节省了缓存的存储空间,同时结合数据的冗余度优化了缓存替换算法,针对于读写缓存则采用普通缓存方式,该方法尤其适合文件类缓存。
上述说明中,凡未加特别说明的,均采用现有技术中的技术手段。