CN114860212A - 一种可扩展缓存访问方法、系统、装置及存储介质 - Google Patents
一种可扩展缓存访问方法、系统、装置及存储介质 Download PDFInfo
- Publication number
- CN114860212A CN114860212A CN202210507385.5A CN202210507385A CN114860212A CN 114860212 A CN114860212 A CN 114860212A CN 202210507385 A CN202210507385 A CN 202210507385A CN 114860212 A CN114860212 A CN 114860212A
- Authority
- CN
- China
- Prior art keywords
- cache
- data
- type
- component
- database
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/36—Software reuse
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- Computational Linguistics (AREA)
- Data Mining & Analysis (AREA)
- Computer Security & Cryptography (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及计算机技术领域,具体公开了一种可扩展缓存访问方法、系统、装置及存储介质;其中方法包括:通过AOP方式将缓存组件接入到项目中,生成类的动态代理对象,使缓存组件在开启缓存注解的条件下生效;在缓存组件内部定义一个接口,通过该接口扩展不同的缓存类型。采用本发明的技术方案能够大大减少了重复代码的编写,并且可以做到统一的进行修改,给开发人员带来了极大的方便,同时也给使代码更加简洁,满足不同场景的使用需求。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种可扩展缓存访问方法、系统、装置及存储介质。
背景技术
微服务的架构具有能够应对高并发场景的优势,解决这种高并发场景的方法包括缓存、限流、降级等,其中缓存是比较重要的方法之一。缓存查询是直接读取内存中的数据,不用去数据库进行比较耗时的SQL操作,从而提高查询效率,提高系统的并发性能。
在基于微服务的架构中,很多的模块都基于java开发。Java应用中,缓存的方式比较多,比如常见的Redis、Spring缓存、Google Guava Cache等,不同的缓存有不同的特点,比如Redis缓存,属于第三方缓存,在集群环境中可以做到缓存一致,可将缓存数据持久化,单线程执行,不用加锁,基于内存,吞吐量高等优点;而Guava Cache和Spring缓存就是一个本地缓存,在集群环境中,不能做到缓存一致性,而且属于本地缓存,不会持久化,停机后数据就丢失,但这属于应用内的缓存,调用效率高,并且都采用java语言编写,可以定制化一些需求。
在一般的项目中,如果使用多种缓存,会增加编码的复杂性,所以更多的是单独用某一种缓存。同时还有的直接使用原生的缓存API,但是每个需要缓存的地方,都需要去写类似的代码,也偏复杂。如何在项目中通过一套统一的缓存,可以满足不同场景的需求,成为一个需要解决的问题。
发明内容
本发明的目的之一在于,提供一种可扩展缓存访问方法,能够减少缓存相关代码的重复编写,满足不同场景的使用需求。
为了解决上述技术问题,本申请提供如下技术方案:
一种可扩展缓存访问方法,包括:通过AOP方式将缓存组件接入到项目中,生成类的动态代理对象,使缓存组件在开启缓存注解的条件下生效;在缓存组件内部定义一个接口,通过该接口扩展不同的缓存类型。
基础方案原理及有益效果如下:
面向切面编程思想能够在不修改源代码的情况下给程序动态统一添加功能。这样在一个项目中途需要某个功能时,只需修改配置文件和加一个类,不用改已经写好的类的代码,增加了代码的复用性。本方案基于面向切面编程的思想,通过AOP方式实接入缓存组件到项目中,然后开启缓存注解缓存组件才可生效,否则缓存组件不生效。能够很好的支持横向扩展。在项目启动过程中,生成目标类的动态代理对象,这种基于AOP的方式,大大减少了重复代码的编写,并且可以做到统一的进行修改,给开发人员带来了极大的方便,同时也给使代码更加简洁。
本方案通过缓存扩展性设计,能够使代码更加简洁并且极大的方便开发。不同的缓存类型,会有不同的具体实现逻辑,相应也有不同的优势和劣势,用户可了解每一种缓存类型的优势和劣势之后,根据需求进行缓存类型参数的设置,以选择合适的缓存,以满足不同场景的使用需求。
进一步,所述缓存注解包括若干属性,设置缓存注解属性的参数,如果没有设置属性的参数,则使用默认属性参数;
属性包括:缓存的key、缓存类型、缓存过期时间、是否抛出异常和是否同步操作。
对缓存注解的属性设置不同的参数,使其满足不同场景的缓存需求。
进一步,所述缓存组件还集成有Redis缓存类型和自定义缓存类型;
还包括查询步骤:
接收用户的查询请求,命中缓存的数据就直接返回数据,没有命中缓存的数据,则根据不同类型缓存,执行数据库查询操作:
如果用户选择Redis缓存类型,在用户主动查询数据库之后,如果成功查询到数据,根据缓存注解的属性,同步设置该数据到缓存;
如果用户选择自定义缓存类型,在缓存中的数据过期之后,异步查询所需要的数据,并将数据设置到缓存。
进一步,所述查询步骤具体包括:
获取用户查询请求并解析,通过设置的缓存类型找到指定的缓存;
如果对应的缓存类型不存在,或者没有对应的缓存实现类,打印错误日志;
如果对应的缓存类型存在,则在指定的缓存进行下一步操作:
如果缓存中有数据,并且没有过期,直接返回缓存的数据;
如果没有找到对应的数据,则根据缓存类型的不同,采取不同的处理方式:
如果为Redis缓存类型,缓存中数据过期,并且过期数据已被剔除,同步去数据库查询,并返回对应的实时数据;
如果为自定义缓存类型,缓存中数据过期,数据仍然在缓存中,返回旧数据,并进行异步查询数据库,然后将查询到的数据库结果替换缓存中过期的数据。
通过打印具体的错误日志,提示用户选择的缓存类型不存在,此时缓存处于不生效状态,且每次请求都会有日志告警,提示用户进行相应的处理。
自定义缓存,可以较好的防穿透,用户请求进来的时候,如果设置了对应的缓存,并指定的该自定义缓存,那么每次查询都是从该缓存中获取数据。如果查询该缓存数据为空,那么内部就将开启一个线程去异步的进行数据库的查询。当应对高并发的时候,可能有大量的用户去访问同一个key,而该key对应的value并不存在,那么可能就会导致多个线程同时查询数据库,造成数据库压力过大。考虑到这种情况,缓存中没有对应数据,才会去进行数据库的查询,然后将查询到的结果设置到缓存,如果有对应的缓存,就直接返回,能够有效应对并发量大的场景。
本发明的目的之二在于,提供一种可扩展缓存访问系统,包括:缓存组件;
缓存组件通过AOP方式接入到项目中,缓存组件用于生成类的动态代理对象,缓存组件在开启缓存注解的条件下生效;
缓存组件包括至少一个接口,接口用于扩展不同的缓存类型。
面向切面编程思想能够在不修改源代码的情况下给程序动态统一添加功能。这样在一个项目中途需要某个功能时,只需修改配置文件和加一个类,不用改已经写好的类的代码,增加了代码的复用性。本方案基于面向切面编程的思想,将缓存组件通过AOP方式实接入缓存组件到项目中,然后开启缓存注解缓存组件才可生效,否则缓存组件不生效。能够很好的支持横向扩展。在项目启动过程中,生成目标类的动态代理对象,这种基于AOP的方式,大大减少了重复代码的编写,并且可以做到统一的进行修改,给开发人员带来了极大的方便,同时也给使代码更加简洁。
本方案通过缓存扩展性设计,能够使代码更加简洁并且极大的方便开发。不同的缓存类型,会有不同的具体实现逻辑,相应也有不同的优势和劣势,用户可了解每一种缓存类型的优势和劣势之后,根据需求进行缓存类型参数的设置,以选择合适的缓存,以满足不同场景的使用需求。
进一步,所述缓存注解包括若干属性,设置缓存注解属性的参数,如果没有设置属性的参数,则使用默认属性参数;
属性包括:缓存的key、缓存类型、缓存过期时间、是否抛出异常和是否同步操作。
对缓存注解的属性设置不同的参数,使其满足不同场景的缓存需求。
进一步,所述缓存组件还集成有Redis缓存类型和自定义缓存类型;
缓存组件用于接收用户的查询请求,命中缓存的数据直接返回数据;
缓存组件用于在没有命中缓存的数据时,则根据不同类型缓存,执行数据库查询操作:
如果用户选择Redis缓存类型,在用户主动查询数据库之后,如果成功查询到数据,根据缓存注解的属性,同步设置该数据到缓存;
如果用户选择自定义缓存类型,在缓存中的数据过期之后,异步查询所需要的数据,并将数据设置到缓存。
进一步,所述缓存组件用于获取用户查询请求并解析,通过设置的缓存类型找到指定的缓存;
如果对应的缓存类型不存在,或者没有对应的缓存实现类,缓存组件用于打印错误日志;
如果对应的缓存类型存在,缓存组件用于在指定的缓存进行下一步操作:
如果缓存中有数据,并且没有过期,缓存组件用于直接返回缓存的数据;
如果没有找到对应的数据,则缓存组件用于根据缓存类型的不同,采取不同的处理方式:
如果为Redis缓存类型,缓存中数据过期,并且过期数据已被剔除,缓存组件用于同步去数据库查询,并返回对应的实时数据;
如果为自定义缓存类型,缓存中数据过期,数据仍然在缓存中,缓存组件用于返回旧数据,并进行异步查询数据库,然后将查询到的数据库结果替换缓存中过期的数据。
通过打印具体的错误日志,提示用户选择的缓存类型不存在,此时缓存处于不生效状态,且每次请求都会有日志告警,提示用户进行相应的处理。
自定义缓存,可以较好的防穿透,用户请求进来的时候,如果设置了对应的缓存,并指定的该自定义缓存,那么每次查询都是从该缓存中获取数据。如果查询该缓存数据为空,那么内部就将开启一个线程去异步的进行数据库的查询。当应对高并发的时候,可能有大量的用户去访问同一个key,而该key对应的value并不存在,那么可能就会导致多个线程同时查询数据库,造成数据库压力过大。考虑到这种情况,缓存中没有对应数据,才会去进行数据库的查询,然后将查询到的结果设置到缓存,如果有对应的缓存,就直接返回,能够有效应对并发量大的场景。
本发明的目的之三在于,提供一种可扩展缓存访问装置,使用上述可扩展缓存访问系统。
本发明的目的之四在于,提供一种存储介质,所述存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述可扩展缓存访问方法的步骤。
附图说明
图1为实施例二基于AOP的结构示意图;
图2为实施例二缓存组件在项目中运用示意图;
图3为实施例二缓存组件工作流程示意图;
图4为实施例二缓存组件一般缓存工作流程示意图;
图5为实施例二缓存组件防穿透缓存工作流程示意图。
具体实施方式
下面通过具体实施方式进一步详细说明:
实施例一
本实施例的一种可扩展缓存访问方法,包括如下步骤:
通过AOP方式将缓存组件接入到项目中,生成类的动态代理对象,使缓存组件在开启缓存注解的条件下生效;如果没有对应缓存注解配置,缓存组件就不会生成具体的缓存对象。首先通过classLoader加载了缓存相关的class文件到java虚拟机中,java语言是基于面向对象的,如果只加载class文件到内存是不能够运行的,还需要生成具体的对象。但是并不是所有加载到内存的class文件都需要生成对象,这种通过配置来决定是否生成缓存对象,可以减少内存的消耗。
缓存注解包括若干属性,设置缓存注解属性的参数,如果没有设置属性的参数,则使用自定义的默认属性参数。通过对缓存注解的属性设置不同的参数,可以使其满足不同场景的缓存需求。本实施例中,属性包括:
缓存的key:在基于内存的数据库的缓存中,一般都是基于键值对(key与value)的方式进行存储,通过对key进行hash运算,可以快速的定位并找到对应唯一的value(值)。
缓存类型:可以通过设置该参数,进行不同类型的缓存选择;
缓存过期时间:当设置了过期时间t,在时间t的范围内,缓存的数据会一直存在,当时间范围大于t,则缓存的数据过期。
是否抛出异常:当缓存组件内部报错后,如果设置抛出异常,则会抛出运行异常;如果设置不抛出异常,内部报错后,则会进行异常捕获,不抛出运行异常,返回一个空对象。
是否同步操作:查询数据库数据有不同的方式,同步就是等待查询结果后返回,异步就是不需要等待,直接返回结果。
在缓存组件内部定义一个接口,通过该接口扩展不同的缓存类型。通过缓存扩展性设计,能够使代码更加简洁并且极大的方便开发。不同的缓存类型,会有不同的具体实现逻辑,相应也有不同的优势和劣势,用户可了解每一种缓存类型的优势和劣势之后,根据需求进行缓存类型参数的设置,以选择合适的缓存。
本实施例中,缓存组件还集成有Redis缓存类型和自定义缓存类型。
接收用户的查询请求,命中缓存的数据就直接返回,没有命中缓存的数据,则根据不同类型缓存,执行数据库查询操作;如果用户选择Redis缓存类型,在用户主动查询数据库之后,如果成功查询到数据,根据缓存注解的属性,同步设置该数据到缓存;
如果用户选择自定义缓存类型,在缓存中的数据过期之后,通过线程池的方式异步查询所需要的数据,并将数据设置到缓存。
查询缓存数据具体包括:
获取用户查询请求并解析,通过设置的缓存类型找到指定的缓存;具体的,对用户请求的参数进行解析,通过对比解析到的参数和缓存组件内部的参数,以选择对应的缓存;
如果对应的缓存类型不存在,或者没有对应的缓存实现类,打印错误日志,以提示用户选择的缓存类型不存在,此时缓存处于不生效状态;
如果对应的缓存类型存在,则在指定的缓存进行下一步操作:
如果缓存中有数据,并且没有过期,直接返回缓存的数据;
具体的,获取用户通过查询请求传入的缓存key;
对缓存key进行解析;
将对应的key传入对应的缓存,基于hash算法,找到唯一确定的value,然后返回给用户;设置缓存的value是能够从缓存中获取数据的前提,如果没有设置value,那么就没法从缓存中获取数据。设置缓存的value的方式一般是在用户查询到数据之后,同步通过设置key对应的value,将value序列化之后保存到缓存中。这个key非常关键,通过该key可以唯一找到对应的value,所以在进行缓存的key参数设置时,需要缓存的key在整个缓存中是唯一的。
如果没有找到对应的value,则根据缓存类型的不同,采取不同的处理方式。
如果为Redis缓存类型,缓存中数据过期,并且过期数据已被剔除,同步去数据库查询,并返回对应的实时数据。
如果为自定义缓存类型,缓存中数据过期,数据仍然在缓存中,直接返回旧数据;本实施例中,新的数据需要用户下一步查询才能获取。换句话说,自定义缓存类型,就是每次查询都是从缓存中获取数据,如果缓存中没有数据,那么就会异步的进行数据的查询,然后设置到缓存。如果缓存中有数据,并且没有过期,就直接返回缓存数据。如果缓存中有数据,但是数据过期了,依旧返回过期数据,并进行异步查询数据库,然后将查询到的数据库结果替换缓存中过期的数据。可以很好的起到防穿透的效果。
基于上述方法,本实施例还提供一种可扩展缓存访问系统,包括:缓存组件;
缓存组件通过AOP方式接入到项目中,缓存组件用于生成类的动态代理对象,缓存组件在开启缓存注解的条件下生效;
缓存注解包括若干属性,设置缓存注解属性的参数,如果没有设置属性的参数,则使用默认属性参数;
属性包括:缓存的key、缓存类型、缓存过期时间、是否抛出异常和是否同步操作。
缓存组件包括至少一个接口,接口用于扩展不同的缓存类型。
本实施例中,缓存组件还集成有Redis缓存类型和自定义缓存类型;
缓存组件用于接收用户的查询请求,命中缓存的数据直接返回数据;
缓存组件用于在没有命中缓存的数据时,则根据不同类型缓存,执行数据库查询操作:
如果用户选择Redis缓存类型,在用户主动查询数据库之后,如果成功查询到数据,根据缓存注解的属性,同步设置该数据到缓存;
如果用户选择自定义缓存类型,在缓存中的数据过期之后,异步查询所需要的数据,并将数据设置到缓存。
缓存组件用于获取用户查询请求并解析,通过设置的缓存类型找到指定的缓存;
如果对应的缓存类型不存在,或者没有对应的缓存实现类,缓存组件用于打印错误日志;
如果对应的缓存类型存在,缓存组件用于在指定的缓存进行下一步操作:
如果缓存中有数据,并且没有过期,缓存组件用于直接返回缓存的数据;
如果没有找到对应的数据,则缓存组件用于根据缓存类型的不同,采取不同的处理方式:
如果为Redis缓存类型,缓存中数据过期,并且过期数据已被剔除,缓存组件用于同步去数据库查询,并返回对应的实时数据。
如果为自定义缓存类型,缓存中数据过期,数据仍然在缓存中,缓存组件用于返回旧数据,并进行异步查询数据库,然后将查询到的数据库结果替换缓存中过期的数据。
本实施例还提供一种可扩展缓存访问装置,使用上述系统。
上述可扩展缓存访问方法如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,计算机程序可存储于一存储介质中,该计算机程序在被处理器执行时,可实现上述方法实施例的步骤。其中,计算机程序包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。
实施例二
如图1所示,在一个项目中有多个业务逻辑,各个逻辑相互独立,在不影响原有功能的前提下,在各个业务上都设置了统一的横切关注点,为软件横向扩展功能,这就是所说的AOP。通常来说,在WEB项目开发中,通常都遵守三层原则,包括控制层(Controller)->业务层(Service)->数据层(Dao),这个结构是纵向的,它具体的某一层就是所说的横向。AOP就是可以作用于这某一个横向模块当中的方法。在本实例中所用到的缓存组件就是基于AOP的原理进行设计。
在不同项目中AOP有多种实现方式,包括:
Cglib库实现,利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理,将切面插入宇节码的某些点和面上。
定制类加载器,在类加载时对字节码进行补充,在字节码中插入切面,增加了除业务逻辑外的功能,JVM自身提供的Java Agent机制就是在加载类的字节码时,通过增加切面来实现AOP。JVM本身提供了动态代理组件,可以通过它实现任意对象的代理模式,在代理的过程中可以插入切面的逻辑。可以使用Java提供的Proxy.newProxylnstance()和InvocationHandler来实现。
AspectJ是实现AOP的专业框架和平台,通过AspectJ可以实现任意方式的字节码切面,Spring框架完全支持AspectJ。
本实施例基于JVM本身提供的动态代理组件,将我们需要的缓存组件,动态的织入到需要缓存的地方,从而增强了功能。
如图2所示,图中包括:业务层,缓存组件和数据层。其中缓存组件内部有多种缓存类型可以选择。
从图中可以清晰的了解到本实施例中缓存组件工作位置,缓存组件工作于业务层和数据层之间。作为一个很重要的中间组件,可以缓存一些热点数据,这种基于内存操作的数据查询,一定程度避免了数据库磁盘IO的频繁操作,提供快速数据查询,提高了系统的响应速度,尤其是在高并发系统中,给系统安全性提供了重要的保障。
如图3所示,本实施例的缓存组件工作原理详细流程:使用自定义的缓存注解(切点),在项目中定义一个缓存注解MCache。该缓存注解中提供了一系列可供选择的属性,在使用的时候,需要对不同的属性进行参数设置,最后这些参数都会被传入到缓存组件内部,作为不同缓存API的参数或者组件内必需的参数。
例如自定义一个拦截器,通过实现MethodInterceptor的invoke方法,然后将其生成一个Bean对象,并注入到Spring容器中,被Spring进行管理。
当用户的查询请求进入的时候,加了缓存注解MCache的方法就会被拦截,在实现的拦截器方法中,通过对传入的参数判断,需要的切点方法中是否有对应的缓存注解MCache,通过方法methodInvocation.getMethod().isAnnotationPresent(MCache.class)判断,如果方法返回了true,表示执行的拦截方法有对应的缓存注解,就是需要进行拦截的方法;如果没有对应的缓存注解,就不需要拦截。
在进入拦截的具体实现中,需要对缓存注解属性的参数进行解析,通过annotation.CacheType获取用户选择对应的缓存类型,通过用户需要的缓存类型和组件内自定义的缓存进行匹配,匹配上了就会进入对应的缓存实现类的逻辑,没有匹配上就会打印错误日志,提醒用户对应的缓存没有实现类,需要用户重新选择一个合适的缓存类型,通过这种方式实现了不同缓存的路由。
在选定缓存实现类后,用户就会进行相应的缓存查询。需要首先找到缓存对应的key,该key可以通过annotation.getKey获取,通过获取到的key,再传入到缓存实现类中,缓存内部基于hash算法,从而获取对应的唯一的value。
如图4所示,本实施例的一种具体实施方式中,缓存数据的过期处理方法如下:
当用户自定义了缓存过期时间,表示从缓存被设置,经过了对应设置的时间t之后,那么缓存就被认为已过期,缓存过期之后会如何处理,针对不同的缓存类型有不同的缓存过期处理方式。
当集成的Redis缓存类型,缓存的数据过期就不存在,会被系统剔除,需要重新设置缓存后才能查询。这种处理方式比较常规,缓存数据只在设置的过期时间范围内出现短暂的不一致,能够满足大多数场景的需求。
针对接入的另外一组自定义缓存类型,处理过期数据不同,当设置了过期时间后,经过过期时间t之后,缓存数据也不被删除,而是依旧保存在缓存中。用户请求的时候,如果发现这个缓存的数据过期了,就将这个过期的数据返回给用户;如果缓存的数据没有过期,则返回该缓存数据。这样过期处理方式,虽然在一定程度上牺牲用户的获取到最新的数据,但是每次查询都是缓存中的数据,可极大的减少用户的系统响应时间,同时提高系统的并发性能。
在本实施例的一种具体实施方式中,还包括设置缓存数据的处理方式,具体的处理方法如下:
设置缓存值(value)是能够从缓存中获取数据的前提,需要一些相应的参数,比如缓存的key、缓存过期时间、是否同步等参数,这些参数可通过用户请求后,传入到缓存组件。缓存具体的内容则需要从数据库中查询获取。
key的选择非常关键,在分布式项目中,如果缓存比较多,且都是缓存在一个Redis缓存中,那么该key需要特别注意,不能和其它的可以重复,否则会发生严重的问题。可以参考,通过类名+方法名+请求参数中某些重要的变量参数,然后将组合的参数通过散列算法之后作为key。当然也可用户自定义,在自定义的过程中,尤其是在分部式项目中,避免出错,最好在key中加入对应的模块名称。
缓存过期时间的过期时间由用户自定义,用户可以根据缓存数据的类型,综合考虑数据的变更频率,如果变化频率较高,可以通过设置较小的过期时间,如果变化频率不是很高的场景,可以适当设置较长的过期时间。
设置缓存中的数据的时机一般在用户查询到数据库的数据之后,并且查询到的数据不为空,然后同步通过设置缓存key对应的value。在缓存组件集成的另外一种自定义缓存,也是发生在查询到缓存数据之后,通过线程池异步查询数据库,并将查询结果设置到缓存。
在实施例的一种具体实施方式中,还包括缓存组件的异常处理方式,具体的处理方法如下:
缓存组件内部有一系类的逻辑,不可避免会出现异常的情况。当用户请求后,通过业务逻辑进入到缓存组件内部,可能会在查询缓存、设置缓存或者查询数据库的时候遇到各种类型的异常。异常如何处理,可以进行自定义,可以选择抛出异常或者捕获异常,当然在异常发生的时候,需要打印对应的日志信息,根据不同的错误类型,打印不同级别的日志进行告警处理,可以比较快速的定位问题。
在实施例的一种具体实施方式中,还包括缓存扩展性设计:
可扩展性是所有的软件领域的一种良好的编程风格,在需求迭代或者修改更新过程中,可扩展性给开发者带来了极大的方便。在java语言中面向接口编程可以比较好的进行功能的扩展,能够使代码更加简洁并且极大的方便开发。本实施例的缓存组件就充分利用了面向接口编程的优势,定义了一个接口,可以接入不同类型的缓存。本实例就集成了Redis缓存和自定义缓存,同时还可以比较方便的集成其它缓存。
在实施例的一种具体实施方式中,自定义缓存特点如下:
如图5所示,自定义缓存可以较好的防穿透,用户的查询请求进来的时候,如果设置了对应的缓存,并指定的该自定义缓存,那么每次查询都是从该自定义缓存中获取数据。如果查询该自定义缓存数据为空,那么内部就将开启一个线程去异步的进行数据库的查询。当应对高并发的时候,可能有大量的用户去访问同一个key,而该key对应的value并不存在,那么可能会导致多个线程同时查询数据库,造成数据库压力过大。考虑到这种情况,本实施例中缓存组件队对查询请求进行加锁处理,避免出现多个线程同时查询数据库的情况,并且在加锁后,会再次去缓存中查询数据,没有对应数据,才会去进行数据库的查询,然后将查询到的结果设置到缓存,如果有对应的缓存,就直接返回。综上,自定义缓存可以很好的适应对数据一致性要求不高、并发量大的场景。
以上的仅是本发明的实施例,该发明不限于此实施案例涉及的领域,方案中公知的具体结构及特性等常识在此未作过多描述,所属领域普通技术人员知晓申请日或者优先权日之前发明所属技术领域所有的普通技术知识,能够获知该领域中所有的现有技术,并且具有应用该日期之前常规实验手段的能力,所属领域普通技术人员可以在本申请给出的启示下,结合自身能力完善并实施本方案,一些典型的公知结构或者公知方法不应当成为所属领域普通技术人员实施本申请的障碍。应当指出,对于本领域的技术人员来说,在不脱离本发明结构的前提下,还可以作出如果干变形和改进,这些也应该视为本发明的保护范围,这些都不会影响本发明实施的效果和专利的实用性。本申请要求的保护范围应当以其权利要求的内容为准,说明书中的具体实施方式等记载可以用于解释权利要求的内容。
Claims (10)
1.一种可扩展缓存访问方法,其特征在于,包括:通过AOP方式将缓存组件接入到项目中,生成类的动态代理对象,使缓存组件在开启缓存注解的条件下生效;在缓存组件内部定义一个接口,通过该接口扩展不同的缓存类型。
2.根据权利要求1所述的可扩展缓存访问方法,其特征在于:所述缓存注解包括若干属性,设置缓存注解属性的参数,如果没有设置属性的参数,则使用默认属性参数;
属性包括:缓存的key、缓存类型、缓存过期时间、是否抛出异常和是否同步操作。
3.根据权利要求2所述的可扩展缓存访问方法,其特征在于:所述缓存组件还集成有Redis缓存类型和自定义缓存类型;
还包括查询步骤:
接收用户的查询请求,命中缓存的数据就直接返回数据,没有命中缓存的数据,则根据不同类型缓存,执行数据库查询操作:
如果用户选择Redis缓存类型,在用户主动查询数据库之后,如果成功查询到数据,根据缓存注解的属性,同步设置该数据到缓存;
如果用户选择自定义缓存类型,在缓存中的数据过期之后,异步查询所需要的数据,并将数据设置到缓存。
4.根据权利要求3所述的可扩展缓存访问方法,其特征在于:所述查询步骤具体包括:
获取用户查询请求并解析,通过设置的缓存类型找到指定的缓存;
如果对应的缓存类型不存在,或者没有对应的缓存实现类,打印错误日志;
如果对应的缓存类型存在,则在指定的缓存进行下一步操作:
如果缓存中有数据,并且没有过期,直接返回缓存的数据;
如果没有找到对应的数据,则根据缓存类型的不同,采取不同的处理方式:
如果为Redis缓存类型,缓存中数据过期,并且过期数据已被剔除,同步去数据库查询,并返回对应的实时数据;
如果为自定义缓存类型,缓存中数据过期,数据仍然在缓存中,返回旧数据,并进行异步查询数据库,然后将查询到的数据库结果替换缓存中过期的数据。
5.一种可扩展缓存访问系统,其特征在于,包括:缓存组件;
缓存组件通过AOP方式接入到项目中,缓存组件用于生成类的动态代理对象,缓存组件在开启缓存注解的条件下生效;
缓存组件包括至少一个接口,接口用于扩展不同的缓存类型。
6.根据权利要求5所述的可扩展缓存访问系统,其特征在于:所述缓存注解包括若干属性,设置缓存注解属性的参数,如果没有设置属性的参数,则使用默认属性参数;
属性包括:缓存的key、缓存类型、缓存过期时间、是否抛出异常和是否同步操作。
7.根据权利要求6所述的可扩展缓存访问系统,其特征在于:所述缓存组件还集成有Redis缓存类型和自定义缓存类型;
缓存组件用于接收用户的查询请求,命中缓存的数据直接返回数据;
缓存组件用于在没有命中缓存的数据时,则根据不同类型缓存,执行数据库查询操作:
如果用户选择Redis缓存类型,在用户主动查询数据库之后,如果成功查询到数据,根据缓存注解的属性,同步设置该数据到缓存;
如果用户选择自定义缓存类型,在缓存中的数据过期之后,异步查询所需要的数据,并将数据设置到缓存。
8.根据权利要求7所述的可扩展缓存访问系统,其特征在于:所述缓存组件用于获取用户查询请求并解析,通过设置的缓存类型找到指定的缓存;
如果对应的缓存类型不存在,或者没有对应的缓存实现类,缓存组件用于打印错误日志;
如果对应的缓存类型存在,缓存组件用于在指定的缓存进行下一步操作:
如果缓存中有数据,并且没有过期,缓存组件用于直接返回缓存的数据;
如果没有找到对应的数据,则缓存组件用于根据缓存类型的不同,采取不同的处理方式:
如果为Redis缓存类型,缓存中数据过期,并且过期数据已被剔除,缓存组件用于同步去数据库查询,并返回对应的实时数据;
如果为自定义缓存类型,缓存中数据过期,数据仍然在缓存中,缓存组件用于返回旧数据,并进行异步查询数据库,然后将查询到的数据库结果替换缓存中过期的数据。
9.一种可扩展缓存访问装置,其特征在于,使用权利要求5-8任一项所述的可扩展缓存访问系统。
10.一种存储介质,所述存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1-4任一项所述的可扩展缓存访问方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210507385.5A CN114860212A (zh) | 2022-05-10 | 2022-05-10 | 一种可扩展缓存访问方法、系统、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210507385.5A CN114860212A (zh) | 2022-05-10 | 2022-05-10 | 一种可扩展缓存访问方法、系统、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114860212A true CN114860212A (zh) | 2022-08-05 |
Family
ID=82638239
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210507385.5A Pending CN114860212A (zh) | 2022-05-10 | 2022-05-10 | 一种可扩展缓存访问方法、系统、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114860212A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116383250A (zh) * | 2023-03-07 | 2023-07-04 | 深圳市丰宜科技有限公司 | 一种生成缓存的方法、存储介质 |
-
2022
- 2022-05-10 CN CN202210507385.5A patent/CN114860212A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116383250A (zh) * | 2023-03-07 | 2023-07-04 | 深圳市丰宜科技有限公司 | 一种生成缓存的方法、存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8332835B2 (en) | Method and system for automated code-source indexing in java virtual machine environment | |
US6876996B2 (en) | Method and apparatus for using a shared library mechanism to facilitate sharing of metadata | |
US6779187B1 (en) | Method and system for dynamic interception of function calls to dynamic link libraries into a windowed operating system | |
US9336018B2 (en) | Mechanism for class data sharing using extension and application class-loaders | |
US7644402B1 (en) | Method for sharing runtime representation of software components across component loaders | |
US20050114870A1 (en) | System and method for executing an application on a secured run-time environment | |
EP2195749B1 (en) | Efficient file hash identifier computation | |
US7165101B2 (en) | Transparent optimization of network traffic in distributed systems | |
US7831771B2 (en) | System and method for managing cachable entities | |
US8280908B2 (en) | Merging file system directories | |
US20070061798A1 (en) | System and method for shared code-sourcing in a Java Virtual Machine environment | |
US20040123278A1 (en) | Persistent cache apparatus and methods | |
JP2004070944A (ja) | アプリケーション向けにオペレーティングシステム機能を拡張するシステムおよび方法 | |
WO2020211570A1 (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
WO2020211554A1 (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
US8745598B2 (en) | Running injected code prior to execution of an application | |
KR20070057897A (ko) | 애플리케이션 프로그램에 의해, 운영 시스템에서 제공되는리소스에 액세스하기 위한 방법 및 시스템 | |
EP1269309B1 (en) | Preloading of classes in a data processing device that does not have a virtual memory manager | |
US7406687B1 (en) | Sharing runtime representation of software component methods across component loaders | |
CN114860212A (zh) | 一种可扩展缓存访问方法、系统、装置及存储介质 | |
CN114443722A (zh) | 缓存管理方法、装置、存储介质及电子设备 | |
US9223780B2 (en) | Non-blocking caching technique | |
US10606629B2 (en) | Enhancing virtual machine performance using autonomics | |
US7617087B2 (en) | Memory management method for dynamic conversion type emulator | |
US20090044195A1 (en) | method for performing tasks based on differences in machine state |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |