本发明涉及高效缓存,特别涉及一种基于java的响应优先式缓存加载方法。
背景技术:
1、近年来,随着互联网的发展,进入大数据时代;各大门户网站、电商平台、银行系统、医院系统,每天都产生大量数据,其中一部分数据涉及到数据存储、数据缓存,而这又往往影响人们的体验。当每次获取数据的过程都要耗费算力和时间时,用户就需要等待这个过程,用户就会失去耐心而放弃访问,造成用户的流失。这就需要应用缓存技术,将计算好的数据结果放到内存中,减少运算,从而减少用户响应时间。
2、但现有的缓存技术虽然能在缓存没有过期时避免用户等待,但当缓存过期后还是要用户等待数据计算的这个过程,没有完全解决等待的问题。急需一种新的缓存技术弥补这个缺陷,以响应优先为首要原则,无论缓存是否过期都无需用户等待,以便实现对用户无感的效果。
技术实现思路
1、本发明的目的在于提供一种基于java的响应优先式缓存加载方法,解决了现有技术中缓存更新带来的数据响应慢的问题;该方法通过响应优先式的缓存策略,以响应速度为首要设计原则,适应于各种高速缓存的场景。
2、为实现上述目的,本发明采取的技术方案为:
3、本发明实施例提供一种基于java的响应优先式缓存加载方法,应用于数据交互的数据调度程序和数据存储程序;该方法包括以下步骤:
4、步骤1,在数据存储程序中,构建哈希缓存数据存储结构,用于记录缓存名称、缓存时长、过期时间和缓存内容;
5、步骤2,在数据存储程序中,构建当前运行中的缓存数据任务的数据结构,包含缓存名称和任务超时时间;
6、步骤3,在数据调度程序中建立线程池,根据数据访问请求任务分配线程;
7、避免线程的频繁创建和销毁带来的计算资源消耗;
8、步骤4,在运行缓存任务前,将缓存名称记录到步骤2的数据结构中,功能验证缓存名称,过滤掉相同的任务;
9、步骤5,当数据访问时,在所述线程池中获取异步线程,通过异步线程完成数据的获取和转换工作,将数据存储到步骤1所述的存储结构中;
10、步骤6,当有数据请求时,首先生成缓存名称;根据缓存名称判断,如果同名缓存数据不存在,则代表该缓存首次加载,需采用同步的方式从数据库中加载数据,等待数据加载完成后将数据保存到步骤1所述的存储结构中,并返回数据;如果同名缓存数据已存在,则判断缓存是否过期,如果缓存还没过期,则直接返回当前缓存数据;如果缓存已过期,则通过步骤5的异步方式加载新数据,用新数据替换步骤1中所述存储结构中存储的缓存数据,并设置新的过期时间。
11、进一步地,所述步骤1中,所述哈希缓存数据存储结构中的缓存内容为原始类型,使用时无需进行格式转化。
12、进一步地,所述步骤1中,所述哈希缓存数据存储结构为哈希类型,哈希的键为字符串类型,哈希的值为对象类型,对象类型中又包括长整型、对象类型或对象列表;
13、其中,所述长整型类型用于存储缓存的过期时间和缓存时长;
14、所述对象类型用于存储原始缓存数据,即缓存内容。
15、所述步骤1中,所述哈希缓存数据存储结构哈希的键为缓存名称,具有唯一性,能高效获取对应的缓存数据。
16、进一步地,所述步骤2中,所述当前运行中的缓存数据任务的数据结构为哈希类型,哈希的键为缓存名称,代表该缓存任务正在执行;哈希的值为任务的过期时间,用长整型存储。
17、进一步地,所述步骤1、步骤2中,所述缓存名称的生成算法一致,采用调取方法的类名、方法名和关键参数的形式,格式为:{class}_{method}_{para*}。
18、进一步地,所述步骤3中,当所述数据调度程序在程序初始化过程中,通过参数配置最大线程数和初始线程数,根据访问量和实际的硬件情况分配cup 资源。
19、进一步地,所述步骤4包括:
20、通过综合判断哈希中是否存在相同的缓存名称,以及任务的过期时间,来确定是否有相同任务在进行,避免并发问题造成的重复计算。
21、进一步地,所述步骤4包括:
22、通过综合判断哈希中是否存在相同的缓存名称,以及任务的过期时间,来确定是否有相同任务在进行,避免并发问题造成的重复计算。
23、进一步地,所述步骤6 中:
24、同名缓存首次加载时因为没有可用数据,必须采用同步策略,调用程序需等待数据获取并且存入缓存后再返回数据;随着程序的运行被缓存的数据会逐渐增多,平均响应速度也会逐步提升。
25、与现有技术相比,本发明具有如下有益效果:
26、本发明实施例提供的一种基于java的响应优先式缓存加载方法,应用于数据交互的数据调度程序和数据存储程序;该方法包括:在数据存储程序中,构建哈希缓存数据存储结构,极大的提高了数据访问效率;同时构建当前运行中的缓存数据任务的记录数据存储结构。在数据调度程序中建立线程池,根据数据访问请求任务分配cpu 资源,完成数据的获取,并放入哈希数据结构中;在执行任务时,通过运行中缓存数据任务记录,过滤掉相同的任务,避免并发问题造成的重复计算;当有数据请求时,如果相应的缓存数据不存在则同步加载数据,用户等待。如果相应的缓存数据存在则直接返回当前缓存数据;然后判断缓存是否过期,如果没过期则流程结束,如果过期则异步加载新数据替换当前缓存。
27、现有的缓存技术当缓存过期时仍需等待数据计算的过程,使用户处于等待中。相较于现有的缓存技术,本发明通过采用响应优先的策略,完全避免了用户的等待,适用于各种门户网站、电商平台、统计系统、数据可视化系统等数据量大、计算量大的场景。例如在门户网站的首页中同时显示来自不同数据源的各类咨询信息,如果不使用缓存则需要长时间的等待,使用本发明的响应优先式缓存方法,不管缓存是否过期都不影响用户的访问,对用户无感。在功能部署方面,采用面向切面的方式,只需简单代码即可将该功能部署到相应的系统中,简便已用,易于维护。
1.一种基于java的响应优先式缓存加载方法,其特征在于,应用于数据交互的数据调度程序和数据存储程序;该方法包括以下步骤:
2.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤1中,哈希缓存数据存储结构中的缓存内容为原始类型,使用时无需进行格式转化。
3.根据权利要求2所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤1中,所述哈希缓存数据存储结构为哈希类型,哈希的键为字符串类型,哈希的值为对象类型,对象类型中又包括长整型、对象类型或对象列表;
4.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤1中,所述哈希缓存数据存储结构哈希的键为缓存名称,具有唯一性,能高效获取对应的缓存数据。
5.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤2中,所述当前运行中的缓存数据任务的数据结构为哈希类型,哈希的键为缓存名称,代表该缓存任务正在执行;哈希的值为任务的过期时间,用长整型存储。
6.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤1、步骤2中,所述缓存名称的生成算法一致,采用调取方法的类名、方法名和关键参数的形式,格式为:{class}_{method}_{para*}。
7.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤3中,当所述数据调度程序在程序初始化过程中,通过参数配置最大线程数和初始线程数,根据访问量和实际的硬件情况分配cup 资源。
8.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤4包括:
9.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤5,包括:
10.根据权利要求1所述的一种基于java的响应优先式缓存加载方法,其特征在于,所述步骤6 中: