一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

缓存公共组件及其实现、安装与运行方法与流程

2021-12-01 01:31:00 来源:中国专利 TAG:


1.本发明属于计算机技术领域,尤其涉及一种缓存公共组件及其实现、安装与运行方法。


背景技术:

2.虽然有很多开源的缓存组件可以供使用,但是它往往并不是说加入到项目中就能起到多样化需求的作用,比如redis一般集成到的spring环境中来,解决在分布式缓存数据的问题,但是却无法解决它自身如果因为键值过期出现雪崩、或者redis服务本身因为网络、服务器宕机等因素带来的风险,特别是在高并发类场景,会直接导致主服务和数据库连接被打满,出现响应延迟、甚至最终资源耗尽被拖垮荡机的风险。
3.同时,现在数据库、数据库连接中间件等也提供了相关缓存技术,但是根本无法达到使用预期,例如mysql数据库自身就有query cache缓存技术,但是其本身只要因为表有更新发生,就会清除,实际环境中无法达到对一些补偿变更数据访问的快速响应以及扩展,并且mysql自身连接资源、网络资源都是有限的,同时也是技术架构访问链路得最底层,按照架构体系来说缓存也该前置才合理。
4.因此,除了有分布式缓存的同时,还应该有二级本地缓存来支撑,以防止缓存穿透以及分布式缓存失去服务能力的状况。但是服务本身能使用得缓存又遇到了无法适应多样化需求得情形,如:不能根据业务要求针对性的设置有效期以及自动删除等需要;同时原始应用场景查找、清除缓存都需要通过第三方的运维工具来进行,难以满足紧急情况下的需要,如出现了数据库和缓存不一致,排查问题都需要运维或直接登录其它运维介质来进行命令话的方式排查,极大的增加了运维难度。


技术实现要素:

5.针对上述相关现有技术不足,本发明提供一种缓存公共组件及其实现、安装与运行方法,缓存访问无网络请求开销,访问快,且可防止缓存穿透,具有更好的通用性和扩展性。
6.为了实现本发明的目的,拟采用以下方案:一种缓存公共组件实现方法,包括步骤:s100、注解申明及参数申明格式处理:通过java的@interface类进行自定义注解分布式缓存@distributecache,注解使用定义在接口函数入口处,并说明默认开启缓存服务,在所述java的@interface类中定义当前注解的配置参数,配置参数包括时间参数、控制参数、唯一key;时间参数包括自定义过期时间,若用户没有进行自定义事件配置,则启用默认过期时间;自定义过期时间或默认过期时间用于定义一级缓存中的过期时间、二级缓存中的过期时间;控制参数包括接口层面控制参数和全局配置参数。接口层面的控制参数,如:
isopen函数为接口处的申明,可以灵活的让当前接口启用或不启用缓存设置,方便后期测试、维护;全局配置参数,在应用的配置文件中进行配置,程序启动加载后赋值给globalisopen,其优先级最高,如果有全局配置存在,则接口处的isopen不会再生效,会以全局缓存配置来开启或关闭当前应用中需要缓存功能的接口。globalisopen为应用中总配置文件的配置,用于作为最高优先级一全局缓存配置来开启或关闭当前应用中使用了缓存注解分布式缓存@distributecache的接口函数的缓存;唯一key用于在缓存的map结构存储中查找对应的缓存值 ;参数申明格式以":"分割,用于适合redis中的结构,后台程序也以":"来进行分割;s200、注解解析配置:通过spring的@component实现切面类自动装载,并结合@aspect进行切面类的申明,以实现对当前包含缓存注解的接口函数的切入,并调用预先配置的公共处理模块中的解析接口来获取注解申明中的配置参数;所述公共处理模块,用于获得接口申明参数、进入解析过程中,并在解析过程中获取和解析接口出定义的注解参数,再分别对一级缓存、二级缓存根据唯一key进行数据查找,如果在一级缓存、二级缓存中找到了属于有效期内的数据则直接返回给接口调用的客户端,否则会执行原接口自己的数据查找逻辑,在返回结果前,调用一级缓存或二级缓存的存储接口把数据保存到一级缓存或二级缓存中并设置缓存有效期;所述处于有效期内是根据自定义过期时间判断;s300、一级缓存封装:对分布式缓存的redis的api进行封装,利用spring动态配置在加载时注入应用,以实现对第三方缓存的适配;s400、二级缓存封装:使用map键值对的结构来实现本地缓存进行封装获得所述map结构,封装中对所述map的结构本身进行分区,并引入数据自动清除机制,所述数据自动清除机制通过使用lru算法实现,用于在容量满或数据缓存时间到期时进行数据自动清除;s500、可视化实现:使用vue实现前端可视化界面组件,以树形列表的形式展示当前缓存的内容。
7.进一步,使用lru算法实现在容量满或数据缓存时间到期时进行数据自动清除,包括步骤:以队列形式在容器内进行数据缓存;根据调用时间对队列中缓存的数据进行排序,以距离调用时间距离当前时间最近的缓存数据放在队列头部位置;在容量满时,自动按照预设比例从队列尾部开始清除缓存数据,所述比例是指需要清除的缓存数据所占整个队列的比例;对于数据缓存时间到期的缓存数据进行直接删除。
8.一种缓存公共组件,通过缓存公共组件实现方法获得,包括:一级缓存,用于作为第一层缓存架构,通过对分布式缓存的redis的api进行封装实现,通过在所述一级缓存中利用spring动态配置在加载时注入应用,以实现所述一级缓存对第三方缓存的适配;二级缓存,通过map键值对的结构来实现本地缓存进行封装,所述map的结构本身
具有分区;所述二级缓存具有数据自动清除功能,所述据自动清除功能用于在容量满或数据缓存时间到期时进行数据自动清除,所述数据自动清除功能通过使用lru算法实现;所述map的结构中key为缓存的唯一标识,值为一个缓存的对象结构体,所述对象结构体包含了当前缓存对象的具体数据信息、过期时间数据,用于在每次访问时判断当前缓存对象是否到期;可视化组件,通过使用vue实现,用于以树形列表的形式展示当前缓存的内容,所述可视化组件的一级菜单分别是分布式缓存和本地缓存,二级菜单则是当前缓存的唯一key,响应于对唯一key的点击,所述可视化组件可显示出具体存放的值和有效期内容;所述可视化组件的菜单提供查询及清除功能,用于根据输入的查询内容实现对redis和本地缓存的查找及清除。
9.一种缓存公共组件的安装方法,包括步骤:在pom文件中引入组件依赖包;在启动类中开启切面@enableaspectjautoproxy支持;在需要配置的接口入口处增加配置注解。
10.一种缓存公共组件的运行方法,包括步骤:接收到达应用层的外部请求;对当前外部请求所调用的具体响应服务缓存注解进行解析,获取当前响应服务收到的查询参数和函数注解中定义的唯一key参数、缓存过期参数、是否开启一级或二级缓存参数,并封装成一个缓存对象;在一级缓存中查找当前请求的唯一key是否存在:若在一级缓存中找到所述唯一key,且当前缓存对象处于有效期内时,返回当前缓存的对象;若在一级缓存中没找到所述唯一key,则在二级缓存中进行查找:若在二级缓存中找到所述唯一key,且当前缓存对象处于有效期内时,返回当前缓存的对象;若在二级缓存中没找到所述唯一key,或在一级缓存/二级缓存中找到所述唯一key,但当前缓存对象未处于有效期内,说明缓存中的数据不可用,则需要执行响应服务的数据库查询处理逻辑,在响应服务的数据库查询逻辑执行完得到数据后,先把数据保存到一级缓存或二级缓存中,再最终将数据返回给客户端请求。
11.二级缓存中通过唯一key找到缓存对象后,会查看当前缓存对象中的过期时间参数和当前时间进行比对,来判断当前缓存的数据是否过期,如果过期则缓存的数据就是失效得,不返能直接回给外部请求方。需要去数据库中查询最新的数据本发明的有益效果在于:1、一级缓存通过封装强大得redis来提供缓存支持,其本身性能出色,有很好得通用性和扩展性;二级缓存为应用自身所在得环境,访问更快,因为没有网络请求开销,同时可以防止redis本身失去了服务能力得情况下继续来进行服务支撑,防止缓存穿透等2、本发明可以灵活的配置,并将缓存从业务代码中释放出来,方便日后代码维护3、可视化操作方便应对日常因为网络或宕机带来的缓存与实际存储不一致的现象,可以协助观察处理。
附图说明
12.图1示出了本技术实施例的缓存公共组件的实现方法流程框图。
13.图2示出了本技术实施例的缓存公共组件的运行方法流程框图。
具体实施方式
14.为使本发明实施例的目的、技术方案和优点更加清楚,下面结合附图对本发明的实施方式进行详细说明,但本发明所描述的实施例是本发明一部分实施例,而不是全部的实施例。
15.本技术实施例的一个方面,提供一种缓存公共组件的实现方法,如图1所示,包括如下步骤:s100、注解申明及参数申明格式处理注解参数申明:直接使用java的 @interface类来实现自定义注解@ distributecache,注解使用定义在接口函数入口处,并说明默认开启缓存服务。注解类中定义当前注解配置参数,参数为默认过期时间,自定义过期时间,是否开启一级、二级缓存等配置项。时间参数定义:即是一二级缓存中的过期时间,后续注解解析步骤会逐一解析,在没有设置自定义过期时间前提下,系统自动使用默认的缓存时间。控制参数isopen为接口处的声明,可以灵活的让当前接口启用或不启用缓存设置,方便后期测试、维护。globalisopen为应用中总配置文件的配置,如果进行了配置,其优先级最高,会以全局缓存配置来开启或关闭当前应用中使用了缓存注解@ distributecache的接口函数的缓存,可以理解为全局的统一配置。唯一key申明,很重要,因为缓存都是map结构存储,根据key来查找缓存值,key必须为一。
16.具体说明如下关键代码所示:@target(elementtype.method)@retention(retentionpolicy.runtime)public @interface distributecache {//自定义注解
ꢀꢀꢀꢀ
string key() default "";
ꢀꢀꢀꢀ
int distexpiretime() default 5;//默认5分钟
ꢀꢀꢀꢀ
int localexpiretime() default 10;//本地缓存默认时间
ꢀꢀꢀꢀ
timeunit unit() default timeunit.minutes;//时间类型
ꢀꢀꢀꢀ
boolean isopen() default true;//默认开启分布式缓存
ꢀꢀꢀꢀ
boolean globalisopen() default true;//全局缓存配置配置 {对整个服务层接口起作用}
ꢀꢀꢀꢀ
/*
ꢀꢀꢀꢀ
*本地缓存 预防分布式缓存出现异常或者防止穿透,原则上失效时间大于分布式缓存
ꢀꢀꢀꢀ
*/
ꢀꢀꢀꢀ
boolean islocalcache() default false;//是否开启本地缓存
ꢀꢀꢀꢀ
string describes() default "";//缓存说明}。
17.参数申明格式:以":"分割,因为适合redis,中的结构,且后台程序也是以":"来进行分割,非常直观。自定义参数解析功能,对格式进行了明确约定,可以是字符串,可以是请求对象中的对象,但是要使用"#{xxx.id}"的格式。举例:"#{user.name}" 对应userinfo user中的name属性。
18.s200注解解析配置在注解申明、定义完成后,注解解析通过spring的@component实现切面类自动装载,在结合@aspect 来进行切面累的申明,实现对当前包含缓存注解的接口函数的切入,调用公共模块中的解析接口来获取注解申明中的参数,也就是1注解参数申明中定义好的参数。
19.其中,公共处理模块:此模块实现目就是承上启下,其中主要是实现整体业务功能的业务操作,所以核心的公共处理接口、缓存业务处理逻辑都封装在此模块。如解析接口实现,存储逻辑的主要接口实现,一二级缓存操作的接口实现等。其中核心链路就是在获得接口申明参数、进入解析过程中,先调用解析接口执行参数的解析,再调用核心缓存处理接口,分别对一二级缓存根据唯一key进行数据查找,如果在一二级缓存中找到了有效期内的数据则直接返回给接口调用的客户端,否则会执行原接口自己的数据查找逻辑,在返回结果前,调用一二级缓存的存储接口把数据保存到一二级缓存中并设置缓存有效期。
20.s300、一级缓存封装内部实现对第三方缓存的适配,作为第一层缓存架构实现。内部对现在分布式缓存的redis 的api进行了很好封装适配,再利用spring动态配置原理,加载时注入应用,其它第三方缓存需要实现内部提供的适配接口自行开发实现其它第三方缓存的配置加载及相关调用操作暴露给公共处理模块使用。
21.s400、二级缓存封装二级缓存使用map 键值对的结构来实现本地缓存封装,此map结构需要实现一下功能特点:1、线程安全,所以必须保证相同数据读写时加锁控制;2、满足高并发读写能力,所以map结构本身应该进行相应的分区功能实现,降低读写集中在单个区域;3、数据过期识别及自动清除。因为内存资源有限,所以必须在容量满或数据缓存时间到期即清除,清除就要有相应的条件或算法。这里选择使用场景广泛的lru算法来实现,实现首先必须要实现一个队列来支持容器达到存储极限时的清除策略,通过队列来不断将最近调用的缓存数据放在队列头部位置,尾部则为最近很少调用的数据,也就是在容器装满数据后既可以按照一定的比例来进行末位淘汰的策略。map数据结构中key为缓存的唯一标识,值为一个缓存的对象结构体,结构体中包含了当前缓存对象的具体数据信息、过期时间数据,在每次程序访问是就会对当前数据进行有效期判断,如果过期则删除,否则直接返回当前缓存数据。
22.s500、可视化实现在插件中使用vue实现前端可视化界面组件,以树形列表的形式展示当前缓存的内容。一级菜单分别是分布式缓存和本地缓存,二级菜单则是当前缓存的唯一key,点击唯一key就能显示出具体存放的值和有效期内容。菜单中的查询、清除实现对redis和本地缓存查找和清除。
23.本技术实施例的另一方面,提供一种缓存公共组件,通过所述的缓存公共组件实现方法获得,所述缓存公共组件包括:一级缓存、二级缓存、可视化组件。
24.一级缓存用于作为第一层缓存架构,通过对分布式缓存的redis的api进行封装实现,通过在所述一级缓存中利用spring动态配置在加载时注入应用,以实现所述一级缓存对第三方缓存的适配。
25.二级缓存通过map键值对的结构来实现本地缓存进行封装,所述map的结构本身具有分区;所述二级缓存具有数据自动清除功能,所述据自动清除功能用于在容量满或数据缓存时间到期时进行数据自动清除,所述数据自动清除功能通过使用lru算法实现;所述map的结构中key为缓存的唯一标识,值为一个缓存的对象结构体,所述对象结构体包含了当前缓存对象的具体数据信息、过期时间数据,用于在每次访问时判断当前缓存对象是否到期;可视化组件通过使用vue实现,用于以树形列表的形式展示当前缓存的内容,所述可视化组件的一级菜单分别是分布式缓存和本地缓存,二级菜单则是当前缓存的唯一key,响应于对唯一key的点击,所述可视化组件可显示出具体存放的值和有效期内容;所述可视化组件的菜单提供查询及清除功能,用于根据输入的查询内容实现对redis和本地缓存的查找及清除。
26.本技术实施例的又一方面,提供一种安装方法,用于安装所述的缓存公共组件。
27.组件的安装及使用1、在pom文件中引入组件依赖包(项目引入代码示例1如下)<dependency> <groupid>com.xnky.soft.utils</groupid> <artifactid>cache</artifactid > <version>${cache.version}</version></dependency>2、在启动类中开启切面@enableaspectjautoproxy支持(项目引用代码示例 2)@enableaspectjautoproxy@springbootapplicationpublic class oprationapplication {
ꢀꢀꢀꢀ
public static void main(string[] args) {
ꢀꢀꢀꢀꢀꢀꢀꢀ
springapplication.run(oprationapplication.class, args);}}3、在需要配置的接口入口处增加配置注解(接口函数入口处缓存注解使用代码示例1)
ꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀꢀ
@distributecache(key="agent:monitor:test:" "#{user.name}:#{user.id}",islocalcache = true,distexpiretime = 5,localexpiretime = 10,unit = timeunit.minutes)
ꢀꢀꢀꢀꢀ
@postmapping("hello2")
ꢀꢀꢀꢀꢀ
public string hello2(userinfo user) {
ꢀꢀꢀꢀꢀꢀꢀ
return string.format("hello %s!", user.getname());
ꢀꢀꢀꢀꢀ
}。
[0028]
本技术实施例的再一方面,提供一种所述的缓存公共组件的运行方法,如图2所示,组件的运行流程自向上而下包括:s1:外部发起得访问请求到当前应用层。
[0029]
s2:应用层在接受到请求后,如果当前服务接口函数有缓存注解申明,那么执行缓存组件的方法切入,在方法执行前对头部得注解进行解析,获取当前请求得参数和唯一key及配置得相应过期参数等封装成一个上下文参数对象进入到s3得处理步骤。
[0030]
s3:应用层会从一级缓存中先来查找当前唯一key得值是否存在,并且当前缓存对象在有效期内,则直接返回当前缓存得对象。负责执行s4步骤。
[0031]
s4:一级缓存中如果没有命中,则执行二级本地缓存装置中进行查找,如果找到且数据在有效期内,则直接返回当前缓存得数据。否则进行s5得执行步骤。
[0032]
s5:在一二级缓存装置中都未能命中或者是数据在缓存中已经失效,则执行原方法得查询处理逻辑,在原始应用方法逻辑执行完得到数据后,返回客户端请求前,先把数据保存到一二级缓存中,再最终将数据返回给客户端请求。
[0033]
在本技术实施例中,本地缓存具备配置灵活的特点,可以在注解入口处进行配置,也可以在应用的.yml文件中进行全局的配置,来进行开启或关闭,全局配置优先级高于接口入口处配置。容器大小可以自行配置,也可以使用默认配置为500个元素。在本地缓存内部启动单独线程来进行定时对容器数据过期的清理和容量满载的lru淘汰策略执行。
[0034]
本技术实施例提供界面可视化工具支持,无需再额外连接第三方运维工具,切无法探测本地内存的行为情况。
[0035]
本技术实施例根据场景不同可以灵活配置,只配置开启一级或之开启二级缓存均可。注解统一配置标准帮助代码可读性。
[0036]
以上仅为本发明的优选实施例,并不表示是唯一的或是限制本发明。本领域技术人员应理解,在不脱离本发明的范围情况下,对本发明进行的各种改变或同等替换,均属于本发明保护的范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献