当前位置: 首页 > 网络应用技术

螺旋系列缓存使用(@enablecaching,@cacheble,@cacheput,@cacheevick,@caching,@cachecon

时间:2023-03-06 20:15:07 网络应用技术

  本文主要解释了详细的春季缓存的使用。

  每个人都了解了缓存,该缓存主要用于提高系统查询速度。

  例如,产品详细信息在电子商务中,此信息通常不会发生变化,但会以高频访问。我们可以从数据库中获取这些信息,然后将其放入缓存(例如Redis和本地内存)。从缓存中获取它。当缓存不可用时,然后从DB获取它,然后将其扔进缓存。更改产品信息后,您可以在缓存中删除信息或将最新数据扔到缓存缓存中。

  Spring提供了整个缓存解决方案。它特别容易使用。它主要通过注释方法使用缓存。常用的解决方案通常使用。我们将一一介绍它们。

  本文将使用大量的SPEL表达式。对于这个不熟悉的建议,让我们看一下Spel详细说明

  要打开缓存功能,您需要在配置类中添加此注释。注释后,Spring知道您需要使用缓存函数。拦截缓存方法以实现缓存函数。

  @cachable可以在一种方法上或一个类上标记。当标记在一种方法上标记时,这意味着该方法支持缓存。当标记在类上标记时,这意味着该类的所有方法都支持缓存。对于支持缓存的方法,请在调用后弹簧缓存,以确保可以直接从缓存获得下一个方法执行相同的参数以执行该方法,而无需再次执行此方法。当缓存方法的返回值是使用键值缓存时,值是该方法的返回结果。至于钥匙,Spring支持两种策略,即默认策略和自定义策略,将在稍后进行解释。应注意,当对象内部调用一种支持缓存的方法时,将不会触发缓存函数。@cachable。可以指定三个属性,值,键和条件。

  值和缓存属性是相同的,必须指定其中一个,表明当前方法的返回值要放宽,该缓存对应于Cache的名称。需要指定缓存,这是一个数组。

  可以将缓存想象为哈希图。系统中可能有很多缓存。每个缓存都有一个名称。您需要将返回值放置在哪种方法中,您需要指定缓存的名称。

  情况1下面的列表方法添加了缓存函数,以将结果放入缓存中。

  必须添加以下配置类以启用缓存功能。

  然后,您需要在配置类中定义bean:CACHE MARAFER。类型是。这是一个接口。有几种实现(例如使用Redis,ConfurrentMap存储缓存信息)。我们在这里使用它。在内部使用ConcurRentHashMap来存储直接存储缓存信息。在本地JVM内存中,在线环境通常是群集方法。它可以通过redis实施。下一篇文章介绍了Spring Cache Integrated Redis。

  让我们参加测试课,2个呼叫以查看效果

  输出

  从第一行我第一次输入列表方法的第一行可以看出,我第二次没有输入列表方法,而是从缓存获得的。

  当Spring Cache方法的返回结果时,密钥属性用于指定相应的密钥。据说您可以将缓存理解为hashmap,并且缓存存储在form->值表单中。返回值)

  关键属性支持Spel表达式;当我们不指定此属性时,Spring将使用默认策略来生成密钥(org.springframework.cache.interceptor.simplekeygegenerator)。默认方法参数创建密钥。

  定制策略意味着我们可以通过SPEL表达式指定钥匙。这里的Spel表达式可以使用方法参数及其相应的属性。使用方法参数索引时”。

  Spring还为我们提供了可用于生成密钥的根对象,我们可以通过此根对象获取以下信息。

  方法名称当前方法名称#root.methodname方法。当前方法#root.method.name目标当前称为#root.target targetClass当前称为对象#root.targetClass args当前由参数参数的参数参数[0]缓存当前称为cache#root.caches [0].NAME在这里我们主要研究自定义策略。

  案例2文章添加以下代码

  新测试用例

  运行输出

  有时,我们可能需要查询缓存,并且不应同时返回结果,因此可以通过条件属性实现。条件属性是空的,表明缓存的所有调用都是通过SPEL表达式的。当您指定时,当您正确时,您可以尝试从缓存中获取它;如果缓存中没有存在,您只需要该方法并将方法返回值投入缓存;返回结果不会扔入缓存中。

  SPEL的写入类似于关键属性。

  案例3文章添加了以下代码。该方法的第二个参数用于控制是否指定了土著价值

  让我们进行测试案例,调用GetById方法4次,前两个和最后一个缓存参数为真,第三次是false

  运行输出

  从输出可以看出,可以将第一次和第三次输入该方法,而2和4被缓存。在第一次执行后,将结果扔进了缓存,因此2和4中的2和4中的2和4与第一次获得的结果相同。

  用于否决条件的Spel表达式,该表达式是在调用该方法后计算的,因此可以引用结果。默认值为“”,这意味着将永远不会拒绝缓存。

  前提是,当条件为空或真实时,除非有效。何时为false,除非无效,否则除非为true,否则方法返回结果将不会被抛入缓存;除非是false,否则方法返回结果将使缓存结果将缓存结果归为缓存结果。

  SPEL的写入类似于关键属性。

  案例下方的情况4。结果为null时,请勿缓存结果。文章服务添加以下代码

  来测试案例,调用FindbyId 4次,在前2次中有数据,随后的两次返回null,并在缓存中打印键

  运行输出

  可以看出,文章ID的结果被缓存,并且文件ID未缓存。

  使用缓存期间有两个点:

  在春季,除非条件和条件,否则这两个点会干预。

  结果不会放置在缓存中。

  除非仅在真实条件下有效。它用于确定结果是否未扔入上述点上的缓存中。如果是正确的,则不会将结果投入缓存。如果是错误的,则结果将结果。将其输入缓存,除非在否则,您可以使用SPEL表达式通过#Result获取该方法来获取该方法。

  @cacheput也可以在类或方法上标记。标记的方法每次都会调用,然后在执行该方法后将该方法扔入缓存; mark @cacheput。

  有三种情况,结果不会丢失。

  源代码类似于可缓存,并且参数相似。

  来吧,意识到新文章的操作,然后将文章投入缓存。请注意,cachenames的两个参数,@cacheput中的键和findbyid方法中的findbyid方法在情况下4 @cachable表示它们共享一个缓存,键是键的,因此当执行添加方法时,然后调用FindbyID方法,您可以直接从缓存中获取数据。

  测试用例

  运行输出

  查看输出结果,然后查看FindbyId方法的代码

  输出中没有此类内容,表明从缓存获得获得结果的探缩方法获得了结果。

  要清除缓存,@cacheevict也可以在类或方法上标记。当调用目标方法时,将在调用目标方法时清除指定的缓存。它用@cacheevics标记。

  看看源代码,每个人都应该查看每个参数。

  @cacheevict的有效性注释,值是Spel表达式,写作方法是指上述条件@cachable Annotation

  默认情况下,默认情况下,由缓存指定的高速缓存中指定的密钥参数指定的缓存信息默认情况下。

  但是,当Allentries为True时,Cachenames指定的缓存中的所有缓存信息。

  这是由发射前参数控制的。此参数默认为false。成功执行目标方法后,将执行清除操作。

  如果在进行之前发射之前,将在执行该方法之前执行缓存清洁操作,并且在执行后不会执行该方法。

  添加了一种新方法,以标记@cacheevict。执行此方法后,将清理Cache1中的缓存信息。请注意,Cachenames和Key的两个参数的值与FindbyId中两个参数的值相同。

  新的测试用例,注释很明确,所以我不会解释

  运行输出

  我打电话给3个Findbyids,第一次没有缓存,所以我输入了该方法,然后将结果扔到缓存中。第二个缓存可用,因此删除方法是从缓存执行的。此方法执行此方法。完成后,在缓存中使用文章的文章信息为1L,最后执行第三种FindbyId方法。目前,在缓存中找不到数据,然后在目标方法中,输出目标方法的内容。

  当我们使用 @cachable, @cachepput和@cacheevic同时在课堂或相同的方法中使用@cacheevic时,我们可以使用@caching注释来实现。

  该注释在课堂上标记,您可以提取其他缓存 - 长式解决方案的公共参数( @cachable, @cacheput和@cacheevic),并将它们放入@cacheconfig中。

  例如,当一类需要使用多种方法(@Cacheble,@cacheput和@cacheevic)时,您可以查看这三个解决方案来源。它们具有许多公共属性,例如:cachenames,keygenrator。,cachemanager,cacheresolver,如果这些属性值相同,则可以提取并将它们放入@cacheconfig中,但是这些注释( @cacheble,cachebable,cacheput, @cacheput and @cacheevic)和@cacheevic)and @cacheevic)还可以在@cacheconfig中指定属性值的属性值。

  弹簧中的缓存主要是在春季使用AOP实现的。通过AOP,代理对象是由使用缓存bean的需要以及通过代理对象执行目标方法来实现高速缓存函数的。

  重点是此注释,可以从此注释中看到

  最后,将为需要使用的BEAN创建代理对象,并将拦截器添加到代理中。该类中的方法是键,它将拦截所有与缓存相关的目标方法的执行。您可以仔细观察。

  原始:https://juejin.cn/post/70973896444441976846