数据的缓存方法、装置、计算机设备与流程

文档序号:18475331发布日期:2019-08-20 20:57阅读:163来源:国知局
数据的缓存方法、装置、计算机设备与流程

本申请涉及云存储技术领域,特别涉及一种数据的缓存方法、装置、计算机设备。



背景技术:

在多个线程并发请求访问接口,获取后端数据,会导致服务器的链接太多,占用资源过多,使得存储效率下降,进而导致服务器宕机的问题。



技术实现要素:

针对现有技术不足,本申请提出一种数据的缓存方法、装置、计算机设备,旨在解决服务器的链接太多,占用资源过多,使得存储效率下降,进而导致服务器宕机的问题。

本申请提出的技术方案是:

一种数据的缓存方法,所述方法包括:

接收第一线程、第二线程并发获取同一业务数据的请求;

在缓存分片集合中查找所述业务数据;

若未查找到所述业务数据,则对后端的业务数据进行锁定,将所述第一线程、所述第二线程竞争加锁,其中加锁成功的线程允许获取后端的业务数据;

识别所述第一线程、所述第二线程是否存在一个线程加锁成功;

若识别出所述第一线程加锁成功,则将所述第二线程调整为等待状态;

通过所述第一线程获取后端的业务数据,获得第一目标业务数据,并获取当前时间,获得第一时间戳;

通过hash算法计算出所述第一时间戳在所述缓存分片集合中对应的缓存分片,获得第一缓存分片;

将所述第一时间戳和所述第一目标业务数据写入所述第一缓存分片,解除对后端的业务数据的锁定;

解除所述第二线程的等待状态,将在所述第一缓存分片中的所述第一目标业务数据返给所述第二线程,以及获取后端的业务数据,获得第二目标业务数据,并获取当前时间,获得第二时间戳;

通过所述hash算法计算出所述第二时间戳在所述缓存分片集合中对应的缓存分片,获得第二缓存分片;

将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片。

进一步地,在所述将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片的步骤之后,包括:

接收第三线程获取所述业务数据的请求;

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第三线程;

获取后端的业务数据,获得第三目标业务数据,并获取当前时间,获得第三时间戳;

通过所述hash算法计算出所述第三时间戳在所述缓存分片集合中对应的缓存分片,获得第三缓存分片;

将所述第三时间戳和所述第三目标业务数据写入所述第三缓存分片。

进一步地,在所述将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片的步骤之后,包括:

接收第四线程获取所述业务数据的请求;

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第四线程,获取后端的业务数据的最后修改时间;

将所述最后修改时间与所述第二时间戳的时间进行比较;

若所述最后修改时间是最新的时间,则获取后端的业务数据,获得第六目标业务数据,并获取当前时间,获得第六时间戳;

通过所述hash算法计算出所述第六时间戳在所述缓存分片集合中对应的缓存分片,获得第六缓存分片;

将所述第六时间戳和所述第六目标业务数据写入所述第三缓存分片;

若所述第二时间戳是最新的时间,则不获取后端的业务数据写入对应的缓存分片中。

进一步地,在所述在缓存分片集合中查找所述业务数据的步骤之后,包括:

若查找到所述业务数据,则查找所述业务数据所在的缓存分片;

若所述业务数据所在的缓存分片为一个缓存分片,则将所述一个缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第四目标业务数据,并获取当前时间,获得第四时间戳;

通过所述hash算法计算出所述第四时间戳在所述缓存分片集合中对应的缓存分片,获得第四缓存分片;

将所述第四时间戳和所述第四目标业务数据写入所述第四缓存分片。

进一步地,在所述若查找到所述业务数据,则查找所述业务数据所在的缓存分片的步骤之后,包括:

若所述业务数据所在的缓存分片为多个缓存分片,则从所述多个缓存分片中获取对应的时间戳;

比较多个时间戳,通过比较结果判定所述多个时间戳中的一个时间戳的时间为最新,获得目标时间戳;

将所述目标时间戳对应的缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第五目标业务数据,并获取当前时间,获得第五时间戳;

通过所述hash算法计算出所述第五时间戳在所述缓存分片集合中对应的缓存分片,获得第五缓存分片;

将所述第五时间戳和所述第五目标业务数据写入所述第五缓存分片。

进一步地,在所述解除所述第二线程的等待状态的步骤之前,包括:

检测所述第一缓存分片是否存在数据写入;

若存在数据写入,则再检测所述数据写入是否结束;

若结束,则生成解除所述第二线程的等待状态的指令。

进一步地,在所述将所述第二线程调整为等待状态的步骤之后,在所述解除所述第二线程的等待状态的步骤之前,包括:

添加时间锁给所述第二线程;

在所述解除所述第二线程的等待状态的步骤之前,包括:

判断所述时间锁是否失效;

若所述时间锁失效,则生成解除所述第二线程的等待状态的指令。

本申请还提供一种数据的缓存装置,所述装置包括:

接收模块,用于接收第一线程、第二线程并发获取同一业务数据的请求;

查找模块,用于在缓存分片集合中查找所述业务数据;

加锁模块,用于若未查找到所述业务数据,则对后端的业务数据进行锁定,将所述第一线程、所述第二线程竞争加锁,其中加锁成功的线程允许获取后端的业务数据;

识别模块,用于识别所述第一线程、所述第二线程是否存在一个线程加锁成功;

调整模块,用于若识别出所述第一线程加锁成功,则将所述第二线程调整为等待状态;

第一获取模块,用于通过所述第一线程获取后端的业务数据,获得第一目标业务数据,并获取当前时间,获得第一时间戳,将所述第一目标业务数据返给所述第一线程;

第一计算模块,用于通过hash算法计算出所述第一时间戳在所述缓存分片集合中对应的缓存分片,获得第一缓存分片;

第一写入模块,用于将所述第一时间戳和所述第一目标业务数据写入所述第一缓存分片,解除对后端的业务数据的锁定;

第二获取模块,用于解除所述第二线程的等待状态,将在所述第一缓存分片中的所述第一目标业务数据返给所述第二线程,以及获取后端的业务数据,获得第二目标业务数据,并获取当前时间,获得第二时间戳;

第二计算模块,用于通过所述hash算法计算出所述第二时间戳在所述缓存分片集合中对应的缓存分片,获得第二缓存分片;

第二写入模块,用于将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片。

本申请还提供一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现上述任一项所述的方法的步骤。

本申请还提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述的方法的步骤。

根据上述的技术方案,本申请有益效果:第一线程和第二线程并发对同一业务数据进行请求获取,如果在缓存分片集合没有查找业务数据,那么让第一线程和第二线程竞争锁,从后端的业务数据进行获取,如果第一线程竞争成功,对后端的业务数据进行加锁,只允许第一线程对业务数据获取,在第一线程获取到业务数据,并将对应的第一目标业务数据、第一时间戳写入对应的第一缓存分片,之后对后端的业务数据进行解锁,第二线程从第一缓存分片中获取第一目标业务数据,之后将对应的第二目标业务数据、第二时间戳写入对应的第二缓存分片,解决服务器的链接太多,占用资源过多,使得存储效率下降,进而导致服务器宕机的问题。

附图说明

图1是应用本申请实施例提供的数据的缓存方法的流程图;

图2是应用本申请实施例提供的数据的缓存装置的功能模块图;

图3是应用本申请实施例提供的计算机设备的结构示意框图。

具体实施方式

为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。

如图1所示,本申请实施例提出一种数据的缓存方法,所述方法包括以下步骤:

步骤s101、接收第一线程、第二线程并发获取同一业务数据的请求。

在本实施例中,并发可以是同一个时间点,也可以是在同一个时间段,例如,第一线程、第二线程都在15:00发起的请求,这就是同一个时间点,第一线程在15:00发起的请求,第二线程在15:02发起的请求,但是第一线程在15:02并没有完成获取业务数据,这就是同一个时间段。第二线程可以是单一线程,也可以是多个线程。

在一些实施例中,可以是多个线程并发获取同一业务数据,多个线程包括第一线程、第二线程和其它线程,其它线程的处理方式与第二线程的处理方式相同。

步骤s102、在缓存分片集合中查找所述业务数据。

第一线程、第二线程请求获取业务数据,先在缓存分片集合中查找,如果没有查找到,再到后端查找对应的业务数据。缓存分片集合是包括多个缓存分片的一个集合,多个缓存分片是分布式布置。

步骤s103、若未查找到所述业务数据,则对后端的业务数据进行锁定,将所述第一线程、所述第二线程竞争加锁,其中加锁成功的线程允许获取后端的业务数据。

如果在缓存分片集合没有查找到业务数据,此时,不能将第一线程、第二线程都从后端请求业务数据,让第一线程、第二线程竞争一把锁,允许竞争到锁的线程从后端请求业务数据,并对后端的业务数据进行加锁,不允许其它的线程从后端请求业务数据,也就是,未竞争到锁的线程不能后端请求业务数据。

步骤s104、识别所述第一线程、所述第二线程是否存在一个线程加锁成功。

识别后端的业务数据是否锁定,如果识别出后端的业务数据锁定,再识别出是第一线程,还是第二线程对后端的业务数据的加锁,对后端的业务数据的加锁的线程具有锁标识,通过识别出锁标识,从而判断出是第一线程,还是第二线程对后端的业务数据的加锁。

步骤s105、若识别出所述第一线程加锁成功,则将所述第二线程调整为等待状态。

如果第一线程、第二线程中任一个线程加锁成功,另一个线程需要调整为等状态,就是不让该线程从后端请求业务数据。具体地,如果第一线程加锁成功,那么第二线程调整为等待状态,如果第二线程加锁成功,那么第一线程调整为等待状态。

步骤s106、通过所述第一线程获取后端的业务数据,获得第一目标业务数据,并获取当前时间,获得第一时间戳。

第一线程通过后端获取业务数据,为了使第二线程能够从缓存分片集合中获取业务数据,需要将后端的业务数据写入到缓存分片集合中,并记录后端的业务数据的时间,获取当前时间,得到第一时间戳。

步骤s107、通过hash算法计算出所述第一时间戳在所述缓存分片集合中对应的缓存分片,获得第一缓存分片。

对缓存分片集合中每一个缓存分片是设置一个分片id,每一个时间戳通过hash算法都会计算出一个分片id,从而在缓存分片集合中查找到对应的缓存分片。

步骤s108、将所述第一时间戳和所述第一目标业务数据写入所述第一缓存分片,解除对后端的业务数据的锁定。

在第一时间戳和第一目标业务数据写入第一缓存分片之后,第一线程的加锁已经结束,解除对后端的业务数据的锁定,允许其它线程对后端的业务数据的请求获取。

步骤s109、解除所述第二线程的等待状态,将在所述第一缓存分片中的所述第一目标业务数据返给所述第二线程,以及获取后端的业务数据,获得第二目标业务数据,并获取当前时间,获得第二时间戳。

解除第二线程的等待状态,第二线程再次在在缓存分片集合中查找业务数据,此时,缓存分片集合存储有业务数据,第二线程在第一缓存分片中查找到业务数据,也就是第一目标业务数据,从第一缓存分片中获取第一目标业务数据。后端的业务数据可能会存在更新的情况,需要从后端的获取业务数据,此时新增一个线程获取后端的业务数据,以及此时业务数据对应的时间戳。

步骤s110、通过所述hash算法计算出所述第二时间戳在所述缓存分片集合中对应的缓存分片,获得第二缓存分片。

步骤s111、将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片。

通过hash算法计算出对应的缓存分片,之后将第二时间戳和第二目标业务数据写入对应的缓存分片中,对应的缓存分片即是第二缓存分片,这样,后续的线程不仅可以在缓存分片集合获取到业务数据,还能获取到可能更新后的业务数据。

在本实施例中,在步骤s111之后,包括:

接收第三线程获取所述业务数据的请求;

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第三线程;

获取后端的业务数据,获得第三目标业务数据,并获取当前时间,获得第三时间戳;

通过所述hash算法计算出所述第三时间戳在所述缓存分片集合中对应的缓存分片,获得第三缓存分片;

将所述第三时间戳和所述第三目标业务数据写入所述第三缓存分片。

第三线程是在第一线程、第二线程请求业务数据线束之后发起获取业务数据的请求。此时,缓存分片集合中有两个缓存分片存储有业务数据,第三线程是从第一缓存分片中获取业务数据,还是从第二缓存分片中获取业务数据,是根据第一缓存分片中的第一时间戳与第二缓存分片中的第二时间戳的哪一个时间戳的时间是最新的。第二缓存分片的业务数据即是第二目标业务数据,在第三线程从第二缓存分片中获取第二目标业务数据之后,还需要从后端获取业务数据,以及对应的时间戳,然后,将此时的业务数据和对应的时间戳写入对应的缓存分片中,以便后续的线程不仅可以在缓存分片集合获取到业务数据,还能获取到可能更新后的业务数据。

在一些实施例中,在步骤s111之后,包括:

接收第四线程获取所述业务数据的请求;

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第三线程,获取后端的业务数据的最后修改时间;

将所述最后修改时间与所述第二时间戳的时间进行比较;

若所述最后修改时间是最新的时间,则获取后端的业务数据,获得第六目标业务数据,并获取当前时间,获得第六时间戳;

通过所述hash算法计算出所述第六时间戳在所述缓存分片集合中对应的缓存分片,获得第六缓存分片;

将所述第六时间戳和所述第六目标业务数据写入所述第三缓存分片;

若所述第二时间戳是最新的时间,则不获取后端的业务数据写入对应的缓存分片中。

第四线程是在第一线程、第二线程请求业务数据线束之后发起获取业务数据的请求。此时,缓存分片集合中有两个缓存分片存储有业务数据,第四线程是从第一缓存分片中获取业务数据,还是从第二缓存分片中获取业务数据,是根据第一缓存分片中的第一时间戳与第二缓存分片中的第二时间戳的哪一个时间戳的时间是最新的。在第四线程获取到业务数据之后,不是直接从后端获取业务数据,而是先从后端获取业务数据的最后修改时间,通过最后修改时间与第二时间戳的时间比较,如果最后修改时间是最新的,说明后端的业务数据进行了更新,那么需要从后端获取业务数据,如果第二时间戳的时间是最新的,说明后端的业务数据没有进行更新,那么不需要从后端获取业务数据,减少从后端获取业务数据的次数,以及减少将业务数据写入缓存分片集合的次数。

在本实施例中,在步骤s102之后,包括:

若查找到所述业务数据,则查找所述业务数据所在的缓存分片;

若所述业务数据所在的缓存分片为一个缓存分片,则将所述一个缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第四目标业务数据,并获取当前时间,获得第四时间戳;

通过所述hash算法计算出所述第四时间戳在所述缓存分片集合中对应的缓存分片,获得第四缓存分片;

将所述第四时间戳和所述第四目标业务数据写入所述第四缓存分片。

如果缓存分片集合中存储有业务数据,并且只有一个缓存分片存储有业务数据,那么从缓存分片集中对应的缓存分片中获取业务数据返给第一线程、第二线程,而不需要从后端获取业务数据返给第一线程、第二线程。之后还需要从后端获取业务数据,以及对应的时间戳,然后,将此时的业务数据和对应的时间戳写入对应的缓存分片中。

在所述若查找到所述业务数据,则查找所述业务数据所在的缓存分片的步骤之后,包括:

若所述业务数据所在的缓存分片为多个缓存分片,则从所述多个缓存分片中获取对应的时间戳;

比较多个时间戳,通过比较结果判定所述多个时间戳中的一个时间戳的时间为最新,获得目标时间戳;

将所述目标时间戳对应的缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第五目标业务数据,并获取当前时间,获得第五时间戳;

通过所述hash算法计算出所述第五时间戳在所述缓存分片集合中对应的缓存分片,获得第五缓存分片;

将所述第五时间戳和所述第五目标业务数据写入所述第五缓存分片。

如果多个缓存分片存储有业务数据,那么需要对多个缓存分片上的时间戳进行比较,将时间戳是最新的一个缓存分片上的业务数据返给第一线程、第二线程。之后还需要从后端获取业务数据,以及对应的时间戳,然后,将此时的业务数据和对应的时间戳写入对应的缓存分片中。

在本实施例中,在所述解除所述第二线程的等待状态的步骤之前,包括:

检测所述第一缓存分片是否存在数据写入;

若存在数据写入,则再检测所述数据写入是否结束;

若结束,则生成解除所述第二线程的等待状态的指令。

通过检测第一缓存分片写入数据结束,生成解除指令,执行该指令,解除第二线程的等待状态。

在一些实施例中,在所述将所述第二线程调整为等待状态的步骤之后,在所述解除所述第二线程的等待状态的步骤之前,包括:

添加时间锁给所述第二线程;

在所述解除所述第二线程的等待状态的步骤之前,包括:

判断所述时间锁是否失效;

若所述时间锁失效,则生成解除所述第二线程的等待状态的指令。

给第二线程添加时间锁,当时间锁失效时,生成解除指令,执行该指令,解除第二线程的等待状态。

综上所述,第一线程和第二线程并发对同一业务数据进行请求获取,如果在缓存分片集合没有查找业务数据,那么让第一线程和第二线程竞争锁,从后端的业务数据进行获取,如果第一线程竞争成功,对后端的业务数据进行加锁,只允许第一线程对业务数据获取,在第一线程获取到业务数据,并将对应的第一目标业务数据、第一时间戳写入对应的第一缓存分片,之后对后端的业务数据进行解锁,第二线程从第一缓存分片中获取第一目标业务数据,之后将对应的第二目标业务数据、第二时间戳写入对应的第二缓存分片,解决服务器的链接太多,占用资源过多,使得存储效率下降,进而导致服务器宕机的问题。

如图2所示,本申请实施例提出一种数据的缓存装置1,装置1包括接收模块11、查找模块12、加锁模块13、识别模块14、调整模块15、第一获取模块16、第一计算模块17、第一写入模块18、第二获取模块19、第二计算模块20和第二写入模块21。

接收模块11,用于接收第一线程、第二线程并发获取同一业务数据的请求。

在本实施例中,并发可以是同一个时间点,也可以是在同一个时间段,例如,第一线程、第二线程都在15:00发起的请求,这就是同一个时间点,第一线程在15:00发起的请求,第二线程在15:02发起的请求,但是第一线程在15:02并没有完成获取业务数据,这就是同一个时间段。第二线程可以是单一线程,也可以是多个线程。

在一些实施例中,可以是多个线程并发获取同一业务数据,多个线程包括第一线程、第二线程和其它线程,其它线程的处理方式与第二线程的处理方式相同。

查找模块12,用于在缓存分片集合中查找所述业务数据。

第一线程、第二线程请求获取业务数据,先在缓存分片集合中查找,如果没有查找到,再到后端查找对应的业务数据。缓存分片集合是包括多个缓存分片的一个集合,多个缓存分片是分布式布置。

加锁模块13,用于若未查找到所述业务数据,则对后端的业务数据进行锁定,将所述第一线程、所述第二线程竞争加锁,其中加锁成功的线程允许获取后端的业务数据。

如果在缓存分片集合没有查找到业务数据,此时,不能将第一线程、第二线程都从后端请求业务数据,让第一线程、第二线程竞争一把锁,允许竞争到锁的线程从后端请求业务数据,并对后端的业务数据进行加锁,不允许其它的线程从后端请求业务数据,也就是,未竞争到锁的线程不能后端请求业务数据。

识别模块14,用于识别所述第一线程、所述第二线程是否存在一个线程加锁成功。

识别后端的业务数据是否锁定,如果识别出后端的业务数据锁定,再识别出是第一线程,还是第二线程对后端的业务数据的加锁,对后端的业务数据的加锁的线程具有锁标识,通过识别出锁标识,从而判断出是第一线程,还是第二线程对后端的业务数据的加锁。

调整模块15,用于若识别出所述第一线程加锁成功,则将所述第二线程调整为等待状态。

如果第一线程、第二线程中任一个线程加锁成功,另一个线程需要调整为等状态,就是不让该线程从后端请求业务数据。具体地,如果第一线程加锁成功,那么第二线程调整为等待状态,如果第二线程加锁成功,那么第一线程调整为等待状态。

第一获取模块16,用于通过所述第一线程获取后端的业务数据,获得第一目标业务数据,并获取当前时间,获得第一时间戳。

第一线程通过后端获取业务数据,为了使第二线程能够从缓存分片集合中获取业务数据,需要将后端的业务数据写入到缓存分片集合中,并记录后端的业务数据的时间,获取当前时间,得到第一时间戳。

第一计算模块17,用于通过hash算法计算出所述第一时间戳在所述缓存分片集合中对应的缓存分片,获得第一缓存分片。

对缓存分片集合中每一个缓存分片是设置一个分片id,每一个时间戳通过hash算法都会计算出一个分片id,从而在缓存分片集合中查找到对应的缓存分片。

第一写入模块18,用于将所述第一时间戳和所述第一目标业务数据写入所述第一缓存分片,解除对后端的业务数据的锁定。

在第一时间戳和第一目标业务数据写入第一缓存分片之后,第一线程的加锁已经结束,解除对后端的业务数据的锁定,允许其它线程对后端的业务数据的请求获取。

第二获取模块19,用于解除所述第二线程的等待状态,将在所述第一缓存分片中的所述第一目标业务数据返给所述第二线程,以及获取后端的业务数据,获得第二目标业务数据,并获取当前时间,获得第二时间戳。

解除第二线程的等待状态,第二线程再次在在缓存分片集合中查找业务数据,此时,缓存分片集合存储有业务数据,第二线程在第一缓存分片中查找到业务数据,也就是第一目标业务数据,从第一缓存分片中获取第一目标业务数据。后端的业务数据可能会存在更新的情况,需要从后端的获取业务数据,此时新增一个线程获取后端的业务数据,以及此时业务数据对应的时间戳。

第二计算模块20,用于通过所述hash算法计算出所述第二时间戳在所述缓存分片集合中对应的缓存分片,获得第二缓存分片。

第二写入模块21,用于将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片。

通过hash算法计算出对应的缓存分片,之后将第二时间戳和第二目标业务数据写入对应的缓存分片中,对应的缓存分片即是第二缓存分片,这样,后续的线程不仅可以在缓存分片集合获取到业务数据,还能获取到可能更新后的业务数据。

在本实施例中,装置1包括:

第一接收模块,用于接收第三线程获取所述业务数据的请求;

第一查找模块,用于在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

第三获取模块,用于从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

第一比较模块,用于比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

第一发送模块,用于将所述第二缓存分片中的所述第二目标业务数据返给所述第三线程;

第四获取模块,用于获取后端的业务数据,获得第三目标业务数据,并获取当前时间,获得第三时间戳;

第三计算模块,用于通过所述hash算法计算出所述第三时间戳在所述缓存分片集合中对应的缓存分片,获得第三缓存分片;

第三写入模块,用于将所述第三时间戳和所述第三目标业务数据写入所述第三缓存分片。

第三线程是在第一线程、第二线程请求业务数据线束之后发起获取业务数据的请求。此时,缓存分片集合中有两个缓存分片存储有业务数据,第三线程是从第一缓存分片中获取业务数据,还是从第二缓存分片中获取业务数据,是根据第一缓存分片中的第一时间戳与第二缓存分片中的第二时间戳的哪一个时间戳的时间是最新的。第二缓存分片的业务数据即是第二目标业务数据,在第三线程从第二缓存分片中获取第二目标业务数据之后,还需要从后端获取业务数据,以及对应的时间戳,然后,将此时的业务数据和对应的时间戳写入对应的缓存分片中,以便后续的线程不仅可以在缓存分片集合获取到业务数据,还能获取到可能更新后的业务数据。

在一些实施例中,装置1包括:

第二接收模块,用于接收第四线程获取所述业务数据的请求,

第二查找模块,用于在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

第四获取模块,用于从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

第二比较模块,用于比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

第五获取模块,用于将所述第二缓存分片中的所述第二目标业务数据返给所述第三线程,获取后端的业务数据的最后修改时间;

第三比较模块,用于将所述最后修改时间与所述第二时间戳的时间进行比较;

第六获取模块,用于若所述最后修改时间是最新的时间,则获取后端的业务数据,获得第六目标业务数据,并获取当前时间,获得第六时间戳;

第四计算模块,用于通过所述hash算法计算出所述第六时间戳在所述缓存分片集合中对应的缓存分片,获得第六缓存分片;

第四写入模块,用于将所述第六时间戳和所述第六目标业务数据写入所述第三缓存分片;

第一拒绝模块,用于若所述第二时间戳是最新的时间,则不获取后端的业务数据写入对应的缓存分片中。

第四线程是在第一线程、第二线程请求业务数据线束之后发起获取业务数据的请求。此时,缓存分片集合中有两个缓存分片存储有业务数据,第四线程是从第一缓存分片中获取业务数据,还是从第二缓存分片中获取业务数据,是根据第一缓存分片中的第一时间戳与第二缓存分片中的第二时间戳的哪一个时间戳的时间是最新的。在第四线程获取到业务数据之后,不是直接从后端获取业务数据,而是先从后端获取业务数据的最后修改时间,通过最后修改时间与第二时间戳的时间比较,如果最后修改时间是最新的,说明后端的业务数据进行了更新,那么需要从后端获取业务数据,如果第二时间戳的时间是最新的,说明后端的业务数据没有进行更新,那么不需要从后端获取业务数据,减少从后端获取业务数据的次数,以及减少将业务数据写入缓存分片集合的次数。

在本实施例中,装置1包括:

第三查找模块,用于若查找到所述业务数据,则查找所述业务数据所在的缓存分片;

第二发送模块,用于若所述业务数据所在的缓存分片为一个缓存分片,则将所述一个缓存分片中的业务数据返给所述第一线程、所述第二线程;

第七获取模块,用于获取后端的业务数据,获得第四目标业务数据,并获取当前时间,获得第四时间戳;

第五计算模块,用于通过所述hash算法计算出所述第四时间戳在所述缓存分片集合中对应的缓存分片,获得第四缓存分片;

第五写入模块,用于将所述第四时间戳和所述第四目标业务数据写入所述第四缓存分片。

如果缓存分片集合中存储有业务数据,并且只有一个缓存分片存储有业务数据,那么从缓存分片集中对应的缓存分片中获取业务数据返给第一线程、第二线程,而不需要从后端获取业务数据返给第一线程、第二线程。之后还需要从后端获取业务数据,以及对应的时间戳,然后,将此时的业务数据和对应的时间戳写入对应的缓存分片中。

装置1包括:

第八获取模块,用于若所述业务数据所在的缓存分片为多个缓存分片,则从所述多个缓存分片中获取对应的时间戳;

第四比较模块,用于比较多个时间戳,通过比较结果判定所述多个时间戳中的一个时间戳的时间为最新,获得目标时间戳;

第三发送模块,用于将所述目标时间戳对应的缓存分片中的业务数据返给所述第一线程、所述第二线程;

第九获取模块,用于获取后端的业务数据,获得第五目标业务数据,并获取当前时间,获得第五时间戳;

第六计算模块,用于通过所述hash算法计算出所述第五时间戳在所述缓存分片集合中对应的缓存分片,获得第五缓存分片;

第六写入模块,用于将所述第五时间戳和所述第五目标业务数据写入所述第五缓存分片。

如果多个缓存分片存储有业务数据,那么需要对多个缓存分片上的时间戳进行比较,将时间戳是最新的一个缓存分片上的业务数据返给第一线程、第二线程。之后还需要从后端获取业务数据,以及对应的时间戳,然后,将此时的业务数据和对应的时间戳写入对应的缓存分片中。

在本实施例中,装置1包括:

第一检测模块,用于检测所述第一缓存分片是否存在数据写入;

第二检测模块,用于若存在数据写入,则再检测所述数据写入是否结束;

第一生成模块,用于若结束,则生成解除所述第二线程的等待状态的指令。

通过检测第一缓存分片写入数据结束,生成解除指令,执行该指令,解除第二线程的等待状态。

在一些实施例中,装置1包括:

第一添加模块,用于添加时间锁给所述第二线程。

装置1包括:

第一判断模块,用于判断所述时间锁是否失效;

第二生成模块,用于若所述时间锁失效,则生成解除所述第二线程的等待状态的指令。

给第二线程添加时间锁,当时间锁失效时,生成解除指令,执行该指令,解除第二线程的等待状态。

综上所述,第一线程和第二线程并发对同一业务数据进行请求获取,如果在缓存分片集合没有查找业务数据,那么让第一线程和第二线程竞争锁,从后端的业务数据进行获取,如果第一线程竞争成功,对后端的业务数据进行加锁,只允许第一线程对业务数据获取,在第一线程获取到业务数据,并将对应的第一目标业务数据、第一时间戳写入对应的第一缓存分片,之后对后端的业务数据进行解锁,第二线程从第一缓存分片中获取第一目标业务数据,之后将对应的第二目标业务数据、第二时间戳写入对应的第二缓存分片,解决服务器的链接太多,占用资源过多,使得存储效率下降,进而导致服务器宕机的问题。

如图3所示,本申请实施例中还提供一种计算机设备,该计算机设备可以是服务器,其内部结构可以如图3所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口和数据库。其中,该计算机设计的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统、计算机程序和数据库。该内存器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的数据库用于存储数据的缓存方法的模型等数据。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种数据的缓存方法。

上述处理器执行上述数据的缓存方法的步骤:接收第一线程、第二线程并发获取同一业务数据的请求;在缓存分片集合中查找所述业务数据;若未查找到所述业务数据,则对后端的业务数据进行锁定,将所述第一线程、所述第二线程竞争加锁,其中加锁成功的线程允许获取后端的业务数据;识别所述第一线程、所述第二线程是否存在一个线程加锁成功;若识别出所述第一线程加锁成功,则将所述第二线程调整为等待状态;通过所述第一线程获取后端的业务数据,获得述第一目标业务数据,并获取当前时间,获得第一时间戳;通过hash算法计算出所述第一时间戳在所述缓存分片集合中对应的缓存分片,获得第一缓存分片;将所述第一时间戳和所述第一目标业务数据写入所述第一缓存分片,解除对后端的业务数据的锁定;解除所述第二线程的等待状态,将在所述第一缓存分片中的所述第一目标业务数据返给所述第二线程,以及获取后端的业务数据,获得第二目标业务数据,并获取当前时间,获得第二时间戳;通过所述hash算法计算出所述第二时间戳在所述缓存分片集合中对应的缓存分片,获得第二缓存分片;将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片。

在一个实施例中,上述将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片的步骤之后,包括:

接收第三线程获取所述业务数据的请求;

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第三线程;获取后端的业务数据,获得第三目标业务数据,并获取当前时间,获得第三时间戳;

通过所述hash算法计算出所述第三时间戳在所述缓存分片集合中对应的缓存分片,获得第三缓存分片;

将所述第三时间戳和所述第三目标业务数据写入所述第三缓存分片。

在一个实施例中,上述将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片的步骤之后,包括:

接收第四线程获取所述业务数据的请求;

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第四线程,获取后端的业务数据的最后修改时间;

将所述最后修改时间与所述第二时间戳的时间进行比较;

若所述最后修改时间是最新的时间,则获取后端的业务数据,获得第六目标业务数据,并获取当前时间,获得第六时间戳;

通过所述hash算法计算出所述第六时间戳在所述缓存分片集合中对应的缓存分片,获得第六缓存分片;

将所述第六时间戳和所述第六目标业务数据写入所述第三缓存分片;

若所述第二时间戳是最新的时间,则不获取后端的业务数据写入对应的缓存分片中。

在一个实施例中,上述在缓存分片集合中查找所述业务数据的步骤之后,包括:

若查找到所述业务数据,则查找所述业务数据所在的缓存分片;

若所述业务数据所在的缓存分片为一个缓存分片,则将所述一个缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第四目标业务数据,并获取当前时间,获得第四时间戳;

通过所述hash算法计算出所述第四时间戳在所述缓存分片集合中对应的缓存分片,获得第四缓存分片;

将所述第四时间戳和所述第四目标业务数据写入所述第四缓存分片。

在一个实施例中,上述若查找到所述业务数据,则查找所述业务数据所在的缓存分片的步骤之后,包括:

若所述业务数据所在的缓存分片为多个缓存分片,则从所述多个缓存分片中获取对应的时间戳;

比较多个时间戳,通过比较结果判定所述多个时间戳中的一个时间戳的时间为最新,获得目标时间戳;

将所述目标时间戳对应的缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第五目标业务数据,并获取当前时间,获得第五时间戳;

通过所述hash算法计算出所述第五时间戳在所述缓存分片集合中对应的缓存分片,获得第五缓存分片;

将所述第五时间戳和所述第五目标业务数据写入所述第五缓存分片。

在一个实施例中,上述解除所述第二线程的等待状态的步骤之前,包括:

检测所述第一缓存分片是否存在数据写入;

若存在数据写入,则再检测所述数据写入是否结束;

若结束,则生成解除所述第二线程的等待状态的指令。

在一个实施例中,上述将所述第二线程调整为等待状态的步骤之后,在所述解除所述第二线程的等待状态的步骤之前,包括:

添加时间锁给所述第二线程;

在所述解除所述第二线程的等待状态的步骤之前,包括:

判断所述时间锁是否失效;

若所述时间锁失效,则生成解除所述第二线程的等待状态的指令。

本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定。

本申请实施例的计算机设备,第一线程和第二线程并发对同一业务数据进行请求获取,如果在缓存分片集合没有查找业务数据,那么让第一线程和第二线程竞争锁,从后端的业务数据进行获取,如果第一线程竞争成功,对后端的业务数据进行加锁,只允许第一线程对业务数据获取,在第一线程获取到业务数据,并将对应的第一目标业务数据、第一时间戳写入对应的第一缓存分片,之后对后端的业务数据进行解锁,第二线程从第一缓存分片中获取第一目标业务数据,之后将对应的第二目标业务数据、第二时间戳写入对应的第二缓存分片,解决服务器的链接太多,占用资源过多,使得存储效率下降,进而导致服务器宕机的问题。

本申请一实施例还提供一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现一种数据的缓存方法,具体为:接收第一线程、第二线程并发获取同一业务数据的请求;在缓存分片集合中查找所述业务数据;若未查找到所述业务数据,则对后端的业务数据进行锁定,将所述第一线程、所述第二线程竞争加锁,其中加锁成功的线程允许获取后端的业务数据;识别所述第一线程、所述第二线程是否存在一个线程加锁成功;若识别出所述第一线程加锁成功,则将所述第二线程调整为等待状态;通过所述第一线程获取后端的业务数据,获得第一目标业务数据,并获取当前时间,获得第一时间戳;通过hash算法计算出所述第一时间戳在所述缓存分片集合中对应的缓存分片,获得第一缓存分片;将所述第一时间戳和所述第一目标业务数据写入所述第一缓存分片,解除对后端的业务数据的锁定;解除所述第二线程的等待状态,将在所述第一缓存分片中的所述第一目标业务数据返给所述第二线程,以及获取后端的业务数据,获得第二目标业务数据,并获取当前时间,获得第二时间戳;通过所述hash算法计算出所述第二时间戳在所述缓存分片集合中对应的缓存分片,获得第二缓存分片;将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片。

在一个实施例中,上述将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片的步骤之后,包括:

接收第三线程获取所述业务数据的请求,

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第三线程;

获取后端的业务数据,获得第三目标业务数据,并获取当前时间,获得第三时间戳;

通过所述hash算法计算出所述第三时间戳在所述缓存分片集合中对应的缓存分片,获得第三缓存分片;

将所述第三时间戳和所述第三目标业务数据写入所述第三缓存分片。

在一个实施例中,上述将所述第二时间戳和所述第二目标业务数据写入所述第二缓存分片的步骤之后,包括:

接收第四线程获取所述业务数据的请求,

在缓存分片集合中查找所述业务数据,查找到所述业务数据所在的缓存分片为所述第一缓存分片和所述第二缓存分片;

从所述第一缓存分片中获取所述第一时间戳,从所述第二缓存分片中获取所述第二时间戳;

比较所述第一时间戳与所述第二时间戳,通过比较结果判定所述第二时间戳的时间为最新;

将所述第二缓存分片中的所述第二目标业务数据返给所述第四线程,获取后端的业务数据的最后修改时间;

将所述最后修改时间与所述第二时间戳的时间进行比较;

若所述最后修改时间是最新的时间,则获取后端的业务数据,获得第六目标业务数据,并获取当前时间,获得第六时间戳;

通过所述hash算法计算出所述第六时间戳在所述缓存分片集合中对应的缓存分片,获得第六缓存分片;

将所述第六时间戳和所述第六目标业务数据写入所述第三缓存分片;

若所述第二时间戳是最新的时间,则不获取后端的业务数据写入对应的缓存分片中。

在一个实施例中,上述在缓存分片集合中查找所述业务数据的步骤之后,包括:

若查找到所述业务数据,则查找所述业务数据所在的缓存分片;

若所述业务数据所在的缓存分片为一个缓存分片,则将所述一个缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第四目标业务数据,并获取当前时间,获得第四时间戳;

通过所述hash算法计算出所述第四时间戳在所述缓存分片集合中对应的缓存分片,获得第四缓存分片;

将所述第四时间戳和所述第四目标业务数据写入所述第四缓存分片。

在一个实施例中,上述若查找到所述业务数据,则查找所述业务数据所在的缓存分片的步骤之后,包括:

若所述业务数据所在的缓存分片为多个缓存分片,则从所述多个缓存分片中获取对应的时间戳;

比较多个时间戳,通过比较结果判定所述多个时间戳中的一个时间戳的时间为最新,获得目标时间戳;

将所述目标时间戳对应的缓存分片中的业务数据返给所述第一线程、所述第二线程;

获取后端的业务数据,获得第五目标业务数据,并获取当前时间,获得第五时间戳;

通过所述hash算法计算出所述第五时间戳在所述缓存分片集合中对应的缓存分片,获得第五缓存分片;

将所述第五时间戳和所述第五目标业务数据写入所述第五缓存分片。

在一个实施例中,上述解除所述第二线程的等待状态的步骤之前,包括:

检测所述第一缓存分片是否存在数据写入;

若存在数据写入,则再检测所述数据写入是否结束;

若结束,则生成解除所述第二线程的等待状态的指令。

在一个实施例中,上述将所述第二线程调整为等待状态的步骤之后,在所述解除所述第二线程的等待状态的步骤之前,包括:

添加时间锁给所述第二线程;

在所述解除所述第二线程的等待状态的步骤之前,包括:

判断所述时间锁是否失效;

若所述时间锁失效,则生成解除所述第二线程的等待状态的指令。

本申请实施例的存储介质,第一线程和第二线程并发对同一业务数据进行请求获取,如果在缓存分片集合没有查找业务数据,那么让第一线程和第二线程竞争锁,从后端的业务数据进行获取,如果第一线程竞争成功,对后端的业务数据进行加锁,只允许第一线程对业务数据获取,在第一线程获取到业务数据,并将对应的第一目标业务数据、第一时间戳写入对应的第一缓存分片,之后对后端的业务数据进行解锁,第二线程从第一缓存分片中获取第一目标业务数据,之后将对应的第二目标业务数据、第二时间戳写入对应的第二缓存分片,解决服务器的链接太多,占用资源过多,使得存储效率下降,进而导致服务器宕机的问题。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的和实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可以包括只读存储器(rom)、可编程rom(prom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)或闪存。易失性存储器可包括随机存取存储器(ram)或者外部高速缓冲存储器。作为说明而非局限,ram以多种形式可得,诸如静态ram(sram)、动态ram(dram)、同步dram(sdram)、双速据率sdram(ssrsdram)、增强型sdram(esdram)、同步链路(synchlink)dram(sldram)、存储器总线(rambus)直接ram(rdram)、直接存储器总线动态ram(drdram)、以及存储器总线动态ram(rdram)等。

以上所述仅为本申请的较佳实施例而已,并不用以限制本申请,凡在本申请的精神和原则之内所作的任何修改、等同替换和改进等,均应包括在本申请的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1