一种数据缓存方法.pdf

上传人:111****11 文档编号:1312266 上传时间:2018-04-14 格式:PDF 页数:10 大小:4.02MB
返回 下载 相关 举报
摘要
申请专利号:

CN201210209630.0

申请日:

2012.06.20

公开号:

CN103514106A

公开日:

2014.01.15

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 12/08申请日:20120620|||公开

IPC分类号:

G06F12/08

主分类号:

G06F12/08

申请人:

北京神州泰岳软件股份有限公司

发明人:

王洪泽

地址:

100089 北京市海淀区万泉庄路28号万柳新贵大厦A座6层601室

优先权:

专利代理机构:

北京市隆安律师事务所 11323

代理人:

权鲜枝

PDF下载: PDF下载
内容摘要

本发明公开了一种数据缓存方法。该方法包括:将放入缓存的数据进行序列化处理;将缓存分为两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;将数据插入到缓存时,先将数据放到冷区;当缓存中的数据被命中时,如果该数据是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果该数据是热区数据,将其转移热区链表的首部。本发明的技术方案有效提高了对热数据的缓存效率。

权利要求书

1.  一种数据缓存方法,其特征在于,该方法包括:
将放入缓存的数据进行序列化处理;
在缓存中划分出两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;
将数据插入到缓存时,先将数据放到冷区;
当缓存中的数据被命中时,如果该数据是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果该数据是热区数据,将其转移热区链表的首部。

2.
  根据权利要求1所述的方法,其特征在于,该方法进一步包括:
当冷区满时,先判断热区是否有一定的空闲区域,是则将从冷区链表首部起不大于该空闲区域的一定量的数据转移到热区的尾部,否则删除从冷区链表尾部起的一定量的数据;
当热区满时,先判断冷区是否有一定的空闲区域,是则将从热区链表尾部起不大于该空闲区域的一定量的数据转移到冷区的首部,否则删除从热区链表尾部起的一定量的数据。

3.
  根据权利要求2所述的方法,其特征在于,
热区/冷区存储数据的引用,数据的实际缓存内容存储到一个字典中;
则上述删除从热区/冷区链表尾部起的一定量的数据具体包括:
删除该数据在热区/冷区中的引用,并删除该数据在所述字典中的对应内容。

4.
  根据权利要求1所述的方法,其特征在于,所述将放入缓存的数据的进行序列化处理包括:
对于字符串数据,如果都是ASCII字符,每个字符占一个字节,如果包含除ASCII以外的字符,则用UNICODE编码;
对于长整型数据,如果长度不够8个字节,则保留其实际数字需要的字节数。

5.
  根据权利要求1至4中任一项所述的方法,其特征在于,该方法进一步包括:
每隔设定时间将热区中的数据持久化到磁盘中,然后将热区数据的更新 情况记录到日志文件中;
当缓存数据丢失时,用所述磁盘中的数据恢复热区数据,并读取日志文件内容,从恢复的热区数据中删除日志文件中所记录的发生更新的数据。

6.
  根据权利要求5所述的方法,其特征在于,所述将热区中的数据持久化到磁盘中,将热区数据的更新情况记录到日志文件中包括:
将热区数据的引用读到一个热区数据列表中;
将热区数据列表中的引用所对应的数据写到磁盘文件中,将这期间的热区数据的更新情况记录在第一哈希表中;
将第一哈希表中内容写到日志文件中,并将热区数据的后续更新情况记录到日志文件。

7.
  根据权利要求6所述的方法,其特征在于,
所述将热区数据列表中的引用所对应的数据写到磁盘文件包括:将热区数据列表中的引用所对应的数据先写到第二磁盘文件中,写入完成后将第二磁盘文件和第一磁盘文件的文件名互换;
当缓存数据丢失时,用当前第一磁盘文件中的数据恢复热区数据。

8.
  根据权利要求6所述的方法,其特征在于,所述将热区数据的引用读到一个热区数据列表中包括:对热区加锁,然后将热区数据的引用读到一个热区数据列表中;
该方法进一步包括:在将热区数据的引用读到一个热区数据列表期间,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将所访问的数据的标识记录到第二哈希表中;
在将热区数据列表中的引用所对应的数据写到磁盘文件中之前,遍历第二哈希表,将其中所记录的数据从热区数据列表中删除。

说明书

一种数据缓存方法
技术领域
本发明涉及网络通信技术领域,特别涉及一种数据缓存方法。
背景技术
随着即时通讯产品用户数量的增长和用户活跃度的提升,即时通讯产品的好友数量成几何倍数的增长,系统对数据访问的压力必然越来越大,而其中的对数据库大量并发随机访问通常是系统的瓶颈,因为用户获取其所有好友的相关数据是一种很随机的访问,数据库对磁盘的随机IO读取能力受到磁盘本身随机读写能力的限制。
因此只有想办法确定热数据,并缓存尽可能多的热数据(热数据是指被访问次数较多的数据,也可以称为活跃数据,相对地,非活跃数据称为冷数据),才可以减少业务对数据库的访问。
发明内容
有鉴于此,本发明提供了一种数据缓存方法,该方法提高了对热数据的缓存效率。
为达到上述目的,本发明的技术方案是这样实现的:
本发明公开了一种数据缓存方法,该方法包括:
将放入缓存的数据进行序列化处理;
在缓存中划分出两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;
将数据插入到缓存时,先将数据放到冷区;
当缓存中的数据被命中时,如果该数据是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果该数据是热区数据,将其转移热区链表的首部。
该方法进一步包括:
当冷区满时,先判断热区是否有一定的空闲区域,是则将从冷区链表首 部起不大于该空闲区域的一定量的数据转移到热区的尾部,否则删除从冷区链表尾部起的一定量的数据;
当热区满时,先判断冷区是否有一定的空闲区域,是则将从热区链表尾部起不大于该空闲区域的一定量的数据转移到冷区的首部,否则删除从热区链表尾部起的一定量的数据。
在上述方法中,热区/冷区存储数据的引用,数据的实际缓存内容存储到一个字典中;
则上述删除从热区/冷区链表尾部起的一定量的数据具体包括:
删除该数据在热区/冷区中的引用,并删除该数据在所述字典中的对应内容。
所述将放入缓存的数据的进行序列化处理包括:
对于字符串数据,如果都是ASCII字符,每个字符占一个字节,如果包含除ASCII以外的字符,则用UNICODE编码;
对于长整型数据,如果长度不够8个字节,则保留其实际数字需要的字节数。
所述将放入缓存的数据的进行序列化处理还包括:将缓存对象的元数据全部剔除,只保留对象字段的编号。
该方法进一步包括:
每隔设定时间将热区中的数据持久化到磁盘中,然后将热区数据的更新情况记录到日志文件中;
当缓存数据丢失时,用所述磁盘中的数据恢复热区数据,并读取日志文件内容,从恢复的热区数据中删除日志文件中所记录的发生更新的数据。
所述将热区中的数据持久化到磁盘中,将热区数据的更新情况记录到日志文件中包括:
将热区数据的引用读到一个热区数据列表中;
将热区数据列表中的引用所对应的数据写到磁盘文件中,将这期间的热区数据的更新情况记录在第一哈希表中;
将第一哈希表中内容写到日志文件中,并将热区数据的后续更新情况记录到日志文件。
所述将热区数据列表中的引用所对应的数据写到磁盘文件包括:将热区数据列表中的引用所对应的数据先写到第二磁盘文件中,写入完成后将第二磁盘文件和第一磁盘文件的文件名互换;
当缓存数据丢失时,用当前第一磁盘文件中的数据恢复热区数据。
所述将热区数据的引用读到一个热区数据列表中包括:对热区加锁,然后将热区数据的引用读到一个热区数据列表中;
该方法进一步包括:在将热区数据的引用读到一个热区数据列表期间,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将所访问的数据的标识记录到第二哈希表中;
在将热区数据列表中的引用所对应的数据写到磁盘文件中之前,遍历第二哈希表,将其中所记录的数据从热区数据列表中删除。
由上述可见,本发明这种,将放入缓存的数据进行序列化处理;将缓存分为两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;将数据插入到缓存时,先将数据放到冷区;当缓存中的数据被命中时,如果是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果是热区数据,将其转移热区链表的首部的技术方案,由于将放入缓存的数据进行了序列化处理,减少了数据对缓存的占用,提高了缓存的存储能力,并且实现了冷热数据的分离,避免了由于大量的随机访问使得热数据被淘汰。
附图说明
图1是本发明实施例中的应用访问数据的流程示意图;
图2是本发明实施例中的双向链表结构的示意图;
图3是本发明实施例中的持久化的一个流程示意图;
图4是本发明实施例中服务重启时热区数据的恢复流程图。
具体实施方式
本发明的核心思想是:将放入缓存的数据进行序列化处理,减少占用的 内存,以尽可能多地缓存数据,并采用一种新的缓存管理方法实现冷热数据的分离,避免由于大量的随机访问使得热数据被淘汰。
此外,数据缓存后,由于服务异常启动后,内存缓存丢失,大量的业务访问会“穿透”缓存直接访问数据库。
对此,本发明中进一步定期将缓存的热数据持久化到磁盘形成一个dmp文件,然后将缓存的更新情况记录到日志(log)文件中。如果服务重启,则用dmp文件恢复缓存中的热区数据,并读取log文件(记录了持久化后对缓存的修改),将log文件中对应的修改记录从恢复后的缓存中删除,即可保证缓存的正确性。
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
1、将缓存数据序列化
将缓存数据按字段序列化到字节数据中,具体有如下特点:
对于字符串(string)数据,如果都是ASCII字符,每个字符占一个字节,如果包含除ASCII以外的字符,如中文等特殊字符,则用UNICODE编码,而不是UTF-8编码,因为UNICODE对中文编码是2字节,UTF-8通常是3字节;
对于长整型(long)数据,如果长度不够8个字节,则保留其实际数字需要的字节数。
这样即可高效地完成序列化,将缓存对象的元数据全部剔除,只保留对象字段的编号,占1-2字节,并且序列化后的字节数据会相当小。
图1是本发明实施例中的应用访问数据的流程示意图。如图1所示,当应用从缓存获取不到数据时访问数据库获取数据,同时该数据被序列化(缓存可以通过调用外部工具生成的缓存类对数据进行序列化)后插入到缓存中,当应用再次获取同一数据时,从缓存中获取该数据的序列化缓存,反序列化后返回给应用。
2、新的缓存管理方法
本发明中给出了一种近似的最近最少使用(LRU,Least Recently Used)算法,因为绝对的LRU算法实现代价太大,不适合在实际环境使用。本发明 中的近似LRU算法的为:
在缓存中划分出两个区域,称为冷区和热区(例如冷区占总缓存的1/3,热区占总缓存的2/3),冷区和热区都采用双向链表结构,包括多个节点,图2是本发明实施例中的双向链表结构的示意图;将数据插入到缓存时,先将数据放到冷区;当缓存中的数据被命中时,如果是冷区数据,判断该数据是否已命中了预设次数(如3次),是则将其转移到热区的尾部,否则将其转移到冷区链表的首部(具体来说将该数据从原冷区链表位置删除,将其转移到冷区链表的首部,相应修改各个相关数据中的链表指针),如果是热区数据,将其转移到热区链表的首部(具体来说将数据从原冷区链表位置删除,将其转移到热区链表的首部,相应修改各个相关数据中的链表指针);
当冷区满时,先判断热区是否有一定的空闲区域(例如500个空闲节点),是则将从冷区链表首部起不大于该空闲区域的一定量(例如300个)的数据转移到热区的尾部,否则删除从冷区链表尾部的一定量(例如300个)的数据;
当热区满时,先判断冷区是否有一定的空闲区域,是则将从热区链表尾部起不大于该空闲区域的一定量的数据转移到冷区的首部,否则删除从热区链表尾部起的一定量的数据。
这种做法,使得经常被访问的数据被放到热区或冷区靠近首部的位置,不易被淘汰。
在本发明的一个实施例中,热区/冷区只存储数据的引用,数据的实际缓存内容存储到一个字典中,即数据的实际内容存储在缓存中的一个字典中;因此,删除从热区/冷区链表尾部起的一定量的数据时,除了删除该数据在热区/冷区中的引用,还要删除其在所述字典中的对应内容。
3、持久化方法
每隔设定时间(例如1小时)将热区中的数据持久化到磁盘中,然后将热区数据的更新情况记录到日志文件中;当缓存数据丢失时,用磁盘中的数据恢复热区数据,并读取日志文件内容,从恢复的热区数据中删除日志文件中所记录的发生更新的数据。
其中,将热区中的数据持久化到磁盘中,将热区数据的更新情况记录到 日志文件中具体为:
将热区数据的引用读到一个热区数据列表中;
将热区数据列表中的引用所对应的数据写到磁盘文件中,将这期间的热区数据的更新情况记录在第一哈希表中;
将第一哈希表中内容写到日志文件中,并将热区数据的后续更新情况记录到日志文件。
将热区数据列表中的引用所对应的数据写到磁盘文件具体为:将热区数据列表中的引用所对应的数据先写到第二磁盘文件中,写入完成后将第二磁盘文件和第一磁盘文件的文件名互换,即将第二磁盘文件重命名为第一磁盘文件,而将原第一磁盘文件重命名为第二磁盘文件;
当缓存数据丢失时,用当前第一磁盘文件中的数据恢复热区数据。
将热区数据的引用读到一个热区数据列表中包括:对热区加锁,然后将热区数据的引用读到一个热区数据列表中;
进一步地,在将热区数据的引用读到一个热区数据列表期间,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将所访问的数据的标识记录到第二哈希表中;在将热区数据列表中的引用所对应的数据写到磁盘文件中之前,遍历第二哈希表,将其中所记录的数据从热区数据列表中删除。
图3是本发明实施例中的持久化的一个流程示意图。本例中以缓存的数据为即时通讯用户的数据,热区和冷区只缓存数据的引用(这里为用户的Id),数据的实际内容缓存到一个字典中为例,下面参考图3对本发明中的持久化方案举例说明:
定期将缓存的热区数据持久化到磁盘,持久化的过程包括如下步骤:
S11,对缓存中的热区数据引用加锁;
S12,将加锁的热区数据引用读到热区数据列表HotList中,在该过程中,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将对应的用户Id记录到第二Hash表中。将加锁的热区数据引用读到热区数据列表的这个过程非常快,是毫秒级别的,但是为了防止期间有数据读取或修改可能会锁争用(毫秒级别也可能产生数十个业务访问),用一个标记,使 得这些读的业务直接返回空数据,即没有查到缓存,写的访问则将对应的用户Id记录到内存的一个第二Hash表中(保证Id不重复,以减少后续操作)。
S13,遍历第二Hash表,并将其中所记录用户Id从HotList中删除。
S14,将HotList中的用户Id所指示的字典中的数据写到磁盘文件UserCacheBak.dmp,并将期间对缓存的修改记录到第一Hash表中。
S15,写完UserCacheBak.dmp文件后,将其重命名为UserCache.dmp,而将原UserCache.dmp重命名为UserCacheBak.dmp。这个UserCache.dmp即作为最终的持久化文件。因为可能会遇到写UserCacheBak.dmp文件时,服务维护性重启或异常重启的极少数情况,这样缓存文件就会不完整,所以要待其写好后再以重命名文件的方式形成最终的持久化文件。
S16,重写日志文件,即先清空日志文件,然后把第一Hash表中记录的(写UserCacheBak.dmp过程中产生的修改记录的)用户Id写到日志文件,之后后台线程会记录相应修改的用户Id到日志文件,这样可以使日志保持最小化的情况下,确保缓存的正确性。
服务重启时,热区数据的恢复如图4所示。
图4是本发明实施例中服务重启时热区数据的恢复流程图。如图4所示,包括如下步骤:
S21,在磁盘中检查是否存在UserCache.dmp文件;
S22,若存在,则使用UserCache.dmp恢复热区数据;
S23,读取日志文件,将日志文件中记录的用户Id对应的修改记录从恢复的热区数据中删除。可用UserCache.dmp将上一次Dump时缓存的热区数据恢复,并读取日志文件(记录了持久化后对缓存的修改),把其中记录的用户Id对应的修改记录从恢复后的缓存删除,即可保证缓存的正确性。当服务重启时,所有的热区数据基本都会恢复,即可保证大量的业务访问能够命中缓存。
综上所述,本发明的技术方案提高了缓存的数量及命中率,有效降低了MySQL数据库一半以上的CPU占用;并且实现了缓存的持久化功能,可以保证在缓存服务在异常重启后缓存中的热区数据不会丢失,从而不会使得大量业务访问直接“穿透”缓存到数据库
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

一种数据缓存方法.pdf_第1页
第1页 / 共10页
一种数据缓存方法.pdf_第2页
第2页 / 共10页
一种数据缓存方法.pdf_第3页
第3页 / 共10页
点击查看更多>>
资源描述

《一种数据缓存方法.pdf》由会员分享,可在线阅读,更多相关《一种数据缓存方法.pdf(10页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN103514106A43申请公布日20140115CN103514106A21申请号201210209630022申请日20120620G06F12/0820060171申请人北京神州泰岳软件股份有限公司地址100089北京市海淀区万泉庄路28号万柳新贵大厦A座6层601室72发明人王洪泽74专利代理机构北京市隆安律师事务所11323代理人权鲜枝54发明名称一种数据缓存方法57摘要本发明公开了一种数据缓存方法。该方法包括将放入缓存的数据进行序列化处理;将缓存分为两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;将数据插入到缓存时,先将数据放到冷区;当缓存中的数据被命中时。

2、,如果该数据是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果该数据是热区数据,将其转移热区链表的首部。本发明的技术方案有效提高了对热数据的缓存效率。51INTCL权利要求书2页说明书5页附图2页19中华人民共和国国家知识产权局12发明专利申请权利要求书2页说明书5页附图2页10申请公布号CN103514106ACN103514106A1/2页21一种数据缓存方法,其特征在于,该方法包括将放入缓存的数据进行序列化处理;在缓存中划分出两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;将数据插入到缓存时,先将数据放到冷区;当缓存中的数据被。

3、命中时,如果该数据是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果该数据是热区数据,将其转移热区链表的首部。2根据权利要求1所述的方法,其特征在于,该方法进一步包括当冷区满时,先判断热区是否有一定的空闲区域,是则将从冷区链表首部起不大于该空闲区域的一定量的数据转移到热区的尾部,否则删除从冷区链表尾部起的一定量的数据;当热区满时,先判断冷区是否有一定的空闲区域,是则将从热区链表尾部起不大于该空闲区域的一定量的数据转移到冷区的首部,否则删除从热区链表尾部起的一定量的数据。3根据权利要求2所述的方法,其特征在于,热区/冷区存储数据的引用,数据的。

4、实际缓存内容存储到一个字典中;则上述删除从热区/冷区链表尾部起的一定量的数据具体包括删除该数据在热区/冷区中的引用,并删除该数据在所述字典中的对应内容。4根据权利要求1所述的方法,其特征在于,所述将放入缓存的数据的进行序列化处理包括对于字符串数据,如果都是ASCII字符,每个字符占一个字节,如果包含除ASCII以外的字符,则用UNICODE编码;对于长整型数据,如果长度不够8个字节,则保留其实际数字需要的字节数。5根据权利要求1至4中任一项所述的方法,其特征在于,该方法进一步包括每隔设定时间将热区中的数据持久化到磁盘中,然后将热区数据的更新情况记录到日志文件中;当缓存数据丢失时,用所述磁盘中的。

5、数据恢复热区数据,并读取日志文件内容,从恢复的热区数据中删除日志文件中所记录的发生更新的数据。6根据权利要求5所述的方法,其特征在于,所述将热区中的数据持久化到磁盘中,将热区数据的更新情况记录到日志文件中包括将热区数据的引用读到一个热区数据列表中;将热区数据列表中的引用所对应的数据写到磁盘文件中,将这期间的热区数据的更新情况记录在第一哈希表中;将第一哈希表中内容写到日志文件中,并将热区数据的后续更新情况记录到日志文件。7根据权利要求6所述的方法,其特征在于,所述将热区数据列表中的引用所对应的数据写到磁盘文件包括将热区数据列表中的引用所对应的数据先写到第二磁盘文件中,写入完成后将第二磁盘文件和第。

6、一磁盘文件的文件名互换;权利要求书CN103514106A2/2页3当缓存数据丢失时,用当前第一磁盘文件中的数据恢复热区数据。8根据权利要求6所述的方法,其特征在于,所述将热区数据的引用读到一个热区数据列表中包括对热区加锁,然后将热区数据的引用读到一个热区数据列表中;该方法进一步包括在将热区数据的引用读到一个热区数据列表期间,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将所访问的数据的标识记录到第二哈希表中;在将热区数据列表中的引用所对应的数据写到磁盘文件中之前,遍历第二哈希表,将其中所记录的数据从热区数据列表中删除。权利要求书CN103514106A1/5页4一种数据缓。

7、存方法技术领域0001本发明涉及网络通信技术领域,特别涉及一种数据缓存方法。背景技术0002随着即时通讯产品用户数量的增长和用户活跃度的提升,即时通讯产品的好友数量成几何倍数的增长,系统对数据访问的压力必然越来越大,而其中的对数据库大量并发随机访问通常是系统的瓶颈,因为用户获取其所有好友的相关数据是一种很随机的访问,数据库对磁盘的随机IO读取能力受到磁盘本身随机读写能力的限制。0003因此只有想办法确定热数据,并缓存尽可能多的热数据(热数据是指被访问次数较多的数据,也可以称为活跃数据,相对地,非活跃数据称为冷数据),才可以减少业务对数据库的访问。发明内容0004有鉴于此,本发明提供了一种数据缓。

8、存方法,该方法提高了对热数据的缓存效率。0005为达到上述目的,本发明的技术方案是这样实现的0006本发明公开了一种数据缓存方法,该方法包括0007将放入缓存的数据进行序列化处理;0008在缓存中划分出两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;0009将数据插入到缓存时,先将数据放到冷区;0010当缓存中的数据被命中时,如果该数据是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果该数据是热区数据,将其转移热区链表的首部。0011该方法进一步包括0012当冷区满时,先判断热区是否有一定的空闲区域,是则将从冷区链表首部起不大于该空。

9、闲区域的一定量的数据转移到热区的尾部,否则删除从冷区链表尾部起的一定量的数据;0013当热区满时,先判断冷区是否有一定的空闲区域,是则将从热区链表尾部起不大于该空闲区域的一定量的数据转移到冷区的首部,否则删除从热区链表尾部起的一定量的数据。0014在上述方法中,热区/冷区存储数据的引用,数据的实际缓存内容存储到一个字典中;0015则上述删除从热区/冷区链表尾部起的一定量的数据具体包括0016删除该数据在热区/冷区中的引用,并删除该数据在所述字典中的对应内容。0017所述将放入缓存的数据的进行序列化处理包括0018对于字符串数据,如果都是ASCII字符,每个字符占一个字节,如果包含除ASCII以。

10、外的字符,则用UNICODE编码;说明书CN103514106A2/5页50019对于长整型数据,如果长度不够8个字节,则保留其实际数字需要的字节数。0020所述将放入缓存的数据的进行序列化处理还包括将缓存对象的元数据全部剔除,只保留对象字段的编号。0021该方法进一步包括0022每隔设定时间将热区中的数据持久化到磁盘中,然后将热区数据的更新情况记录到日志文件中;0023当缓存数据丢失时,用所述磁盘中的数据恢复热区数据,并读取日志文件内容,从恢复的热区数据中删除日志文件中所记录的发生更新的数据。0024所述将热区中的数据持久化到磁盘中,将热区数据的更新情况记录到日志文件中包括0025将热区数据。

11、的引用读到一个热区数据列表中;0026将热区数据列表中的引用所对应的数据写到磁盘文件中,将这期间的热区数据的更新情况记录在第一哈希表中;0027将第一哈希表中内容写到日志文件中,并将热区数据的后续更新情况记录到日志文件。0028所述将热区数据列表中的引用所对应的数据写到磁盘文件包括将热区数据列表中的引用所对应的数据先写到第二磁盘文件中,写入完成后将第二磁盘文件和第一磁盘文件的文件名互换;0029当缓存数据丢失时,用当前第一磁盘文件中的数据恢复热区数据。0030所述将热区数据的引用读到一个热区数据列表中包括对热区加锁,然后将热区数据的引用读到一个热区数据列表中;0031该方法进一步包括在将热区数。

12、据的引用读到一个热区数据列表期间,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将所访问的数据的标识记录到第二哈希表中;0032在将热区数据列表中的引用所对应的数据写到磁盘文件中之前,遍历第二哈希表,将其中所记录的数据从热区数据列表中删除。0033由上述可见,本发明这种,将放入缓存的数据进行序列化处理;将缓存分为两个区域,称为冷区和热区,冷区和热区都采用双向链表结构;将数据插入到缓存时,先将数据放到冷区;当缓存中的数据被命中时,如果是冷区数据,判断该数据是否已命中了预设次数,是则将其转移到热区的尾部,否则将其转移到冷区链表的首部,如果是热区数据,将其转移热区链表的首部的技术。

13、方案,由于将放入缓存的数据进行了序列化处理,减少了数据对缓存的占用,提高了缓存的存储能力,并且实现了冷热数据的分离,避免了由于大量的随机访问使得热数据被淘汰。附图说明0034图1是本发明实施例中的应用访问数据的流程示意图;0035图2是本发明实施例中的双向链表结构的示意图;0036图3是本发明实施例中的持久化的一个流程示意图;0037图4是本发明实施例中服务重启时热区数据的恢复流程图。说明书CN103514106A3/5页6具体实施方式0038本发明的核心思想是将放入缓存的数据进行序列化处理,减少占用的内存,以尽可能多地缓存数据,并采用一种新的缓存管理方法实现冷热数据的分离,避免由于大量的随机。

14、访问使得热数据被淘汰。0039此外,数据缓存后,由于服务异常启动后,内存缓存丢失,大量的业务访问会“穿透”缓存直接访问数据库。0040对此,本发明中进一步定期将缓存的热数据持久化到磁盘形成一个DMP文件,然后将缓存的更新情况记录到日志(LOG)文件中。如果服务重启,则用DMP文件恢复缓存中的热区数据,并读取LOG文件(记录了持久化后对缓存的修改),将LOG文件中对应的修改记录从恢复后的缓存中删除,即可保证缓存的正确性。0041为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。00421、将缓存数据序列化0043将缓存数据按字段序列化到字节数据中,具体有。

15、如下特点0044对于字符串(STRING)数据,如果都是ASCII字符,每个字符占一个字节,如果包含除ASCII以外的字符,如中文等特殊字符,则用UNICODE编码,而不是UTF8编码,因为UNICODE对中文编码是2字节,UTF8通常是3字节;0045对于长整型(LONG)数据,如果长度不够8个字节,则保留其实际数字需要的字节数。0046这样即可高效地完成序列化,将缓存对象的元数据全部剔除,只保留对象字段的编号,占12字节,并且序列化后的字节数据会相当小。0047图1是本发明实施例中的应用访问数据的流程示意图。如图1所示,当应用从缓存获取不到数据时访问数据库获取数据,同时该数据被序列化(缓存。

16、可以通过调用外部工具生成的缓存类对数据进行序列化)后插入到缓存中,当应用再次获取同一数据时,从缓存中获取该数据的序列化缓存,反序列化后返回给应用。00482、新的缓存管理方法0049本发明中给出了一种近似的最近最少使用(LRU,LEASTRECENTLYUSED)算法,因为绝对的LRU算法实现代价太大,不适合在实际环境使用。本发明中的近似LRU算法的为0050在缓存中划分出两个区域,称为冷区和热区(例如冷区占总缓存的1/3,热区占总缓存的2/3),冷区和热区都采用双向链表结构,包括多个节点,图2是本发明实施例中的双向链表结构的示意图;将数据插入到缓存时,先将数据放到冷区;当缓存中的数据被命中时。

17、,如果是冷区数据,判断该数据是否已命中了预设次数(如3次),是则将其转移到热区的尾部,否则将其转移到冷区链表的首部(具体来说将该数据从原冷区链表位置删除,将其转移到冷区链表的首部,相应修改各个相关数据中的链表指针),如果是热区数据,将其转移到热区链表的首部(具体来说将数据从原冷区链表位置删除,将其转移到热区链表的首部,相应修改各个相关数据中的链表指针);0051当冷区满时,先判断热区是否有一定的空闲区域例如500个空闲节点),是则将从冷区链表首部起不大于该空闲区域的一定量(例如300个)的数据转移到热区的尾部,否说明书CN103514106A4/5页7则删除从冷区链表尾部的一定量(例如300个。

18、)的数据;0052当热区满时,先判断冷区是否有一定的空闲区域,是则将从热区链表尾部起不大于该空闲区域的一定量的数据转移到冷区的首部,否则删除从热区链表尾部起的一定量的数据。0053这种做法,使得经常被访问的数据被放到热区或冷区靠近首部的位置,不易被淘汰。0054在本发明的一个实施例中,热区/冷区只存储数据的引用,数据的实际缓存内容存储到一个字典中,即数据的实际内容存储在缓存中的一个字典中;因此,删除从热区/冷区链表尾部起的一定量的数据时,除了删除该数据在热区/冷区中的引用,还要删除其在所述字典中的对应内容。00553、持久化方法0056每隔设定时间(例如1小时)将热区中的数据持久化到磁盘中,然。

19、后将热区数据的更新情况记录到日志文件中;当缓存数据丢失时,用磁盘中的数据恢复热区数据,并读取日志文件内容,从恢复的热区数据中删除日志文件中所记录的发生更新的数据。0057其中,将热区中的数据持久化到磁盘中,将热区数据的更新情况记录到日志文件中具体为0058将热区数据的引用读到一个热区数据列表中;0059将热区数据列表中的引用所对应的数据写到磁盘文件中,将这期间的热区数据的更新情况记录在第一哈希表中;0060将第一哈希表中内容写到日志文件中,并将热区数据的后续更新情况记录到日志文件。0061将热区数据列表中的引用所对应的数据写到磁盘文件具体为将热区数据列表中的引用所对应的数据先写到第二磁盘文件中。

20、,写入完成后将第二磁盘文件和第一磁盘文件的文件名互换,即将第二磁盘文件重命名为第一磁盘文件,而将原第一磁盘文件重命名为第二磁盘文件;0062当缓存数据丢失时,用当前第一磁盘文件中的数据恢复热区数据。0063将热区数据的引用读到一个热区数据列表中包括对热区加锁,然后将热区数据的引用读到一个热区数据列表中;0064进一步地,在将热区数据的引用读到一个热区数据列表期间,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将所访问的数据的标识记录到第二哈希表中;在将热区数据列表中的引用所对应的数据写到磁盘文件中之前,遍历第二哈希表,将其中所记录的数据从热区数据列表中删除。0065图3是本。

21、发明实施例中的持久化的一个流程示意图。本例中以缓存的数据为即时通讯用户的数据,热区和冷区只缓存数据的引用(这里为用户的ID),数据的实际内容缓存到一个字典中为例,下面参考图3对本发明中的持久化方案举例说明0066定期将缓存的热区数据持久化到磁盘,持久化的过程包括如下步骤0067S11,对缓存中的热区数据引用加锁;0068S12,将加锁的热区数据引用读到热区数据列表HOTLIST中,在该过程中,用一个标记使得对热区数据的读访问返回空数据,而对热区数据的写访问则将对应的用户ID记说明书CN103514106A5/5页8录到第二HASH表中。将加锁的热区数据引用读到热区数据列表的这个过程非常快,是毫。

22、秒级别的,但是为了防止期间有数据读取或修改可能会锁争用(毫秒级别也可能产生数十个业务访问),用一个标记,使得这些读的业务直接返回空数据,即没有查到缓存,写的访问则将对应的用户ID记录到内存的一个第二HASH表中(保证ID不重复,以减少后续操作)。0069S13,遍历第二HASH表,并将其中所记录用户ID从HOTLIST中删除。0070S14,将HOTLIST中的用户ID所指示的字典中的数据写到磁盘文件USERCACHEBAKDMP,并将期间对缓存的修改记录到第一HASH表中。0071S15,写完USERCACHEBAKDMP文件后,将其重命名为USERCACHEDMP,而将原USERCACHE。

23、DMP重命名为USERCACHEBAKDMP。这个USERCACHEDMP即作为最终的持久化文件。因为可能会遇到写USERCACHEBAKDMP文件时,服务维护性重启或异常重启的极少数情况,这样缓存文件就会不完整,所以要待其写好后再以重命名文件的方式形成最终的持久化文件。0072S16,重写日志文件,即先清空日志文件,然后把第一HASH表中记录的(写USERCACHEBAKDMP过程中产生的修改记录的)用户ID写到日志文件,之后后台线程会记录相应修改的用户ID到日志文件,这样可以使日志保持最小化的情况下,确保缓存的正确性。0073服务重启时,热区数据的恢复如图4所示。0074图4是本发明实施例。

24、中服务重启时热区数据的恢复流程图。如图4所示,包括如下步骤0075S21,在磁盘中检查是否存在USERCACHEDMP文件;0076S22,若存在,则使用USERCACHEDMP恢复热区数据;0077S23,读取日志文件,将日志文件中记录的用户ID对应的修改记录从恢复的热区数据中删除。可用USERCACHEDMP将上一次DUMP时缓存的热区数据恢复,并读取日志文件(记录了持久化后对缓存的修改),把其中记录的用户ID对应的修改记录从恢复后的缓存删除,即可保证缓存的正确性。当服务重启时,所有的热区数据基本都会恢复,即可保证大量的业务访问能够命中缓存。0078综上所述,本发明的技术方案提高了缓存的数量及命中率,有效降低了MYSQL数据库一半以上的CPU占用;并且实现了缓存的持久化功能,可以保证在缓存服务在异常重启后缓存中的热区数据不会丢失,从而不会使得大量业务访问直接“穿透”缓存到数据库0079以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。说明书CN103514106A1/2页9图1图2说明书附图CN103514106A2/2页10图3图4说明书附图CN103514106A10。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1