公开/公告号CN105608197A
专利类型发明专利
公开/公告日2016-05-25
原文格式PDF
申请/专利权人 TCL集团股份有限公司;
申请/专利号CN201510985801.2
发明设计人 高保强;
申请日2015-12-25
分类号G06F17/30(20060101);
代理机构44268 深圳市君胜知识产权代理事务所;
代理人王永文;刘文求
地址 516006 广东省惠州市仲恺高新技术开发区十九号小区
入库时间 2023-12-18 15:29:29
法律状态公告日
法律状态信息
法律状态
2019-09-10
授权
授权
2017-01-18
实质审查的生效 IPC(主分类):G06F17/30 申请日:20151225
实质审查的生效
2016-05-25
公开
公开
技术领域
本发明涉及数据缓存领域,尤其涉及一种高并发下Memcache数据的获取方法。
背景技术
Memcache是一套分布式的高速缓存系统,由LiveJournal的BradFitzpatrick开发,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著。
Memcache的工作原理如下:先检查客户端的请求数据是否在Memcache中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在Memcache中,则查找数据库,将从数据库中获取的数据返回给客户端,同时将数据缓存一份到Memcache中;每次更新数据库的同时需要更新Memcache中的数据,以保证数据的一致性;当分配给Memcache内存空间用完之后,会使用LRU(LeastRecentlyUsed,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
而在大并发的场合下,当大量并发请求同时获取不到Memcache中的数据时,会同一时间去访问数据库并将数据同时缓存一份到Memcache中,这种大量并发请求同时访问数据库的情况会给系统带来潜在的超负荷风险。
因此,现有技术还有待于改进和发展。
发明内容
鉴于上述现有技术的不足,本发明的目的在于提供一种高并发下Memcache数据的获取方法及系统,旨在解决现有技术中高并发下容易造成系统超负荷的问题。
本发明的技术方案如下:
一种高并发下Memcache数据的获取方法,其中,包括步骤:
A、拼装第一关键字,并根据第一关键字获取版本号;
B、将所述第一关键字和版本号组装第二关键字,根据第二关键字从Memcache服务器获取数据;
C、判断是否获取到数据,若未获取到数据,则根据所述第一关键字获取锁;
D、判断是否获取到锁,若未获取到锁,则连续多次、每次间隔一段时间执行步骤B以获取数据,若连续多次均未获取到数据,则将第一关键字对应的版本号减1,并根据第一关键字和减1后的版本号获取上一版版本的数据。
所述的高并发下Memcache数据的获取方法,其中,所述步骤D还包括:
若获取到锁,则返回步骤B重新获取数据,若获取到数据则释放锁,若未获取到数据,则从数据库中获取数据并加载到Memcache服务器的缓存中。
所述的高并发下Memcache数据的获取方法,其中,所述数据采用json格式的字符串进行存储,当获取到数据时,则将数据转换成json对象。
所述的高并发下Memcache数据的获取方法,其中,还包括步骤:对Memcache服务器下的缓存进行缓存失效操作:
将第一关键字对应的版本号加1,完成缓存失效操作。
所述的高并发下Memcache数据的获取方法,其中,还包括缓存更新步骤:创建三个事务项:第一事务项、第二事务项和第三事务项;第一事务项由添加操作和缓存失效操作组成,第二事务项由更新操作和缓存失效操作组成,第三事务项由删除操作和缓存失效操作组成。
所述的高并发下Memcache数据的获取方法,其中,各事物项的事务恢复策略如下:
如果添加操作和缓存失效操作都执行成功,则提交第一事务项;
如果添加操作成功,缓存失效操作失败,则删除添加的数据;
如果添加操作失败,则缓存失效操作不执行;
如果更新操作和缓存失效操作都执行成功,则提交第二事务项;
如果更新操作成功,缓存失效操作失败,则恢复更新的数据;
如果更新操作失败,则缓存失效操作不执行;
如果删除操作和缓存失效操作都执行成功,则提交第三事务项;
如果删除操作成功,缓存失效操作失败,则恢复删除的数据;
如果删除操作失败,则缓存失效操作不执行。
一种高并发下Memcache数据的获取系统,其中,包括:
版本号获取模块,用于拼装第一关键字,并根据第一关键字获取版本号;
第一获取模块,用于将所述第一关键字和版本号组装第二关键字,根据第二关键字从Memcache服务器获取数据;
锁获取模块,用于判断是否获取到数据,若未获取到数据,则根据所述第一关键字获取锁;
第二获取模块,用于判断是否获取到锁,若未获取到锁,则连续多次、每次间隔一段时间执行第一获取模块以获取数据,若连续多次均未获取到数据,则将第一关键字对应的版本号减1,并根据第一关键字和减1后的版本号获取上一版版本的数据。
所述的高并发下Memcache数据的获取系统,其中,所述第二获取模块还包括:
加载单元,用于若获取到锁,则返回第一获取模块重新获取数据,若获取到数据则释放锁,若未获取到数据,则从数据库中获取数据并加载到Memcache服务器的缓存中。
所述的高并发下Memcache数据的获取系统,其中,还包括缓存失效模块,用于对Memcache服务器下的缓存进行缓存失效操作:
将第一关键字对应的版本号加1,完成缓存失效操作。
所述的高并发下Memcache数据的获取系统,其中,还包括:
缓存更新模块,用于创建三个事务项:第一事务项、第二事务项和第三事务项;第一事务项由添加操作和缓存失效操作组成,第二事务项由更新操作和缓存失效操作组成,第三事务项由删除操作和缓存失效操作组成。
有益效果:通过本发明,当客户端获取不到高版本的数据时,根据情况获得低版本的数据,从而避免了获取不到数据转而从数据库中获取的大量操作,降低了访问数据库的压力,避免了大量并发请求同时访问数据库的情况会给系统带来潜在的超负荷风险。
附图说明
图1为本发明一种高并发下Memcache数据的获取方法较佳实施例的流程图。
图2为本发明的原理架构框图。
图3为本发明一种高并发下Memcache数据的获取系统较佳实施例的结构框图。
具体实施方式
本发明提供一种高并发下Memcache数据的获取方法及系统,为使本发明的目的、技术方案及效果更加清楚、明确,以下对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
请参阅图1,图1为本发明一种高并发下Memcache数据的获取方法,其特征在于,包括步骤:
S1、拼装第一关键字,并根据第一关键字获取版本号;
S2、将所述第一关键字和版本号组装第二关键字,根据第二关键字从Memcache服务器获取数据;
S3、判断是否获取到数据,若未获取到数据,则根据所述第一关键字获取锁;
S4、判断是否获取到锁,若未获取到锁,则连续多次、每次间隔一段时间执行步骤S2以获取数据,若连续多次均未获取到数据,则将第一关键字对应的版本号减1,并根据第一关键字和减1后的版本号获取上一版版本的数据。
本发明中,给Memcache服务器缓存中的数据增加了版本的属性,当客户端获取不到高版本的数据时,根据情况获得低版本的数据,从而避免了获取不到数据转而从数据库中获取的大量操作,降低了访问数据库的压力。
本发明中,所述数据采用json格式的字符串进行存储,当获取到数据时,则将数据转换成json对象。其优点是数据格式一致,解析统一,存取速度快。
本发明的整体架构如图2所示,其包括Memcache服务器、应用服务器与数据库之间的交互,a:应用服务器会对数据库进行添加、更新或删除数据操作,并将数据保存到数据库中。b:应用服务器还会对Memcache服务器缓存中的数据进行失效。c:客户端可从Memcache服务器获取数据,具体是根据key(关键字,本发明也称为第一关键字)获取版本号(version号),组装新的关键字(new_key,本发明也称为第二关键字),获取json格式数据,若获取不到则进行加载数据操作,d:加载数据时,Memcache服务器从数据库中读取数据,转换成json字符串,加载到缓存中。
key的拼装规则是将多个属性值以冒号隔开并别设置,例如key:属性值1:属性值2:属性值3,上述各属性值的组合需保证唯一性。根据key获取版本号的方式是:调用Memcache服务器的get命令根据key获取key的版本号,版本号为正整数。
new_key的组装规则为key:version
示例:
keyl:biz_type:mac:ip
version3
new_key=l:biz_type:mac:ip:3
本发明中,当多个进程(即客户端进程)同时访问不到缓存中的数据时,只允许一个进程进行将数据库中的数据放到缓存中的操作,从而避免了多个进程同时操作,缓存中的数据互相覆盖。其具体是通过锁机制来实现的,锁机制是指根据key拼装锁,锁key的规则为key:lock,其中的lock为标识,并且将key添加到缓存中。在某个key获取到锁后,将不再允许该key添加到缓存中,也即其他进程无法利用该key执行将数据库中的数据添加到缓存中的操作,因此执行失败。该锁具有一定的失效时间,例如失效时间为5ms,即在该失效时间内,其他进程无法利用该key对数据库进行操作。
具体来说,在所述步骤S3中,判断是否获取到数据,若未获取到数据,则根据所述第一关键字获取锁;
如果本步骤获取到数据,那么直接将json格式的数据映射成java对象即可(下述步骤中,当获取到数据后都将其映射成java对象,不再赘述),如果未获取到数据,则获取锁,由于所述第一关键字可能在之前已经获取到锁,也有可能没有获取到过锁,所以针对有无获取到锁分别进行处理
在所述步骤S4中,判断是否获取到锁,若获取到锁,则返回步骤S2重新获取数据,若获取到数据则释放锁,否则从数据库中获取数据并加载到Memcache服务器的缓存中;
如果获取到锁的话,先返回判断缓存中是否有数据,若有的话,直接获取数据即可。若缓存中没有数据,那么从数据库中获取数据,并加载到缓存中,由于只有一个进程能够根据key获取到锁,所以也只有一个进程能够进行将数据库中的数据放到缓存中的操作,这样避免了多个进程同时操作,缓存数据相互覆盖以及超负荷风险等问题。
从数据库中加载数据到缓存的原理是:首先定义接口,接口包含一个方法(该方法的具体实现交给调用者),该方法返回一个对象。将接口作为参数传递到调用者的方法中,当从缓存中获取不到数据时,则调用者调用上述接口定义的方法。
在所述步骤S4中,若未获取到锁,连续多次、每次间隔一段时间执行步骤S2以获取数据,若连续多次均未获取到数据,则将第一关键字对应的版本号减1,并根据第一关键字和减1后的版本号获取上一版版本的数据。
如果未获取到锁的话,那么说明有其他进程获取到了锁,那么其他进程有可能已经将数据从数据库加载到缓存中,所以返回连续多次(例如连续10次,每次间隔50ms)执行步骤S2,以判断是否获取到数据,如果一直未获取到,那么说明可能有其他问题,例如缓存更新等问题,此时直接获取上一版版本的数据即可,避免获取不到又重复访问数据库,降低访问数据库的压力。
获取上一版版本(旧版本)数据的原理是:当获取不到当前版本的数据时,就获取前一个版本的数据。举例如下:
keyl:biz_type:mac:ip
version3
new_key=l:biz_type:mac:ip:3
如果根据new_key获取不到数据,则降低一个版本,根据l:biz_type::mac:ip:2从缓存中获取数据,也即将版本号减1,然后根据第一关键字和减1后的版本号组装新的关键字(可称为第四关键字),来从缓存中获取数据。
本发明的方法还包括步骤(其可在需要失效的任何时候执行):对Memcache服务器下的缓存进行缓存失效操作:
将第一关键字对应的版本号加1,完成缓存失效操作。
本发明中,缓存失效只需要将key对应的版本号加1,根据key和新的版本号组成第三关键字,根据第三关键字从缓存中获取对应的数据,正常情况下必然获取不到,所以会从数据库中读取新的数据并加载到缓存中,从而完成了缓存失效的操作,与通过删除key使数据失效的方式相比,本发明自动保留了老版本的数据,有利于降低访问数据库的压力。
本发明的方法还包括缓存更新步骤(可在需要使缓存更新的任何时候执行):创建三个事务项:第一事务项、第二事务项和第三事务项;第一事务项由添加操作和缓存失效操作组成,第二事务项由更新操作和缓存失效操作组成,第三事务项由删除操作和缓存失效操作组成。
本发明中,添加操作、更新操作、删除操作分别和缓存失效操作组成了3个事务,事务的引入保证了数据的一致性,避免了数据库中的数据已经更新,缓存中还是旧数据的情况发生。
各事物项的事务恢复策略如下:
如果添加操作和缓存失效操作都执行成功,则提交第一事务项;
如果添加操作成功,缓存失效操作失败,则删除添加的数据;
如果添加操作失败,则缓存失效操作不执行;
如果更新操作和缓存失效操作都执行成功,则提交第二事务项;
如果更新操作成功,缓存失效操作失败,则恢复更新的数据;
如果更新操作失败,则缓存失效操作不执行;
如果删除操作和缓存失效操作都执行成功,则提交第三事务项;
如果删除操作成功,缓存失效操作失败,则恢复删除的数据;
如果删除操作失败,则缓存失效操作不执行。
基于上述方法,本发明还提供一种高并发下Memcache数据的获取系统较佳实施例,如图3所示,其包括:
版本号获取模块100,用于当拼装第一关键字,并根据第一关键字获取版本号;
第一获取模块200,用于将所述第一关键字和版本号组装第二关键字,根据第二关键字从Memcache服务器获取数据;
锁获取模块300,用于判断是否获取到数据,若未获取到数据,则根据所述第一关键字获取锁;
第二获取模块400,用于判断是否获取到锁,若未获取到锁,则连续多次、每次间隔一段时间执行第一获取模块以获取数据,若连续多次均未获取到数据,则将第一关键字对应的版本号减1,并根据第一关键字和减1后的版本号获取上一版版本的数据。
进一步,所述第二获取模块400还包括:
加载单元,用于若获取到锁,则返回第一获取模块重新获取数据,若获取到数据则释放锁,若未获取到数据,则从数据库中获取数据并加载到Memcache服务器的缓存中。
进一步,系统还包括缓存失效模块,用于对Memcache服务器下的缓存进行缓存失效操作:
将关键字对应的版本号加1,完成缓存失效操作。
进一步系统还包括:
缓存更新模块,用于创建三个事务项:第一事务项、第二事务项和第三事务项;第一事务项由添加操作和缓存失效操作组成,第二事务项由更新操作和缓存失效操作组成,第三事务项由删除操作和缓存失效操作组成。
关于上述模块单元的技术细节在前面的方法中已有详述,故不再赘述。
应当理解的是,本发明的应用不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。
机译: 便携式数据介质智能卡,一种程序优化方法,包括在诊断单元的帮助下获取与程序单元有关的统计数据,并将诊断单元作为程序单元的组成部分来获取数据。
机译: 在数据库系统中的高并发性下的索引争用
机译: 使用以交互模式标记的文档来复制AV数据的设备用于控制临时存储存储器的设备,该设备临时存储用于以交互模式复制AV数据的约会文档用于记录和/或复制AV的设备用于在交互式模式下使用标记文档的数据。用于使用文档标记在交互式模式下复制AV数据的方法,用于在交互式模式下复制AV数据的文档标记的管理方法。用于以交互模式再现AV数据的方法,一种用于以交互模式再现AV数据的方法。计算机的读取,计算机系统中用于以交互模式处理AV数据的方法一个文件标记,并存储数据