springboot @cacheable不起作用_学习笔记27-SpringBoot(3)

SpringBoot整合ehcache:

添加坐标:

b53eff7afeacafe0926d6ec4019370c0.png
这个依赖是必须添加的

在我所使用的springboot2.1.1版本中,添加了ehcache坐标后反而测试报错,推测可能是jar包冲突了,去掉之后测试正常运行。

9c57f8bbde2f75c884d6cbc4f8e8ce9c.png
ehcache的坐标

新建ehcache.xml文件:

文件头可加可不加,不影响测试
<!-- <?xml version="1.0" encoding="UTF-8"?> -->
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <diskStore path="java.io.tmpdir"/>

	<!-- 默认缓存策略 -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    
    <!-- 自定义缓存策略,每个缓存策略都有一个唯一的name属性作为标识 -->
    <cache name="user"
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </cache>

   <!--
       name:缓存名称。
       maxElementsInMemory:缓存最大个数。
       eternal:对象是否永久有效,一但设置了,timeout将不起作用。
       timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
       timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
       overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
       diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
       maxElementsOnDisk:硬盘最大缓存个数。
       diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
       diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
       memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
       clearOnFlush:内存数量最大时是否清除。
    -->

</ehcache>

在application.properties 中配置ehcache

038c8f8564c6a571c7087f5223c305a9.png

在启动类上加入注解:

4815f3879ac74b16d0243ce509363e8c.png

使用缓存时要在方法或者类上加入另一个注解,注解中的value是ehcache.xml中的自定义缓存策略,该注解中还有其他属性,后边会介绍

691e6220cb908aa225d143f7f27a2f6e.png

测试:

a9dcf48517f6de80a2f21733a3490b8e.png

不使用缓存:从数据库执行了两次查询

d20e7b9d89dc63cb10c75ef6822d865e.png

开启缓存:只从数据库查询一次

6314d950e51601fdef11ba25d18a1400.png

@Cacheable注解:

将当前方法的返回值放入Encache中做缓存

value属性:使用ehcache.xml中的缓存策略,不指定value则使用默认的缓存策略

key属性:将方法的返回值放入缓存中的时候放入的是一个键值对的形式,value是返回的值,key是下次,下下次。。。取值所依据的key,默认的key是#传入参数名称。

@CacheEvict注解:清除缓存,当一个查询运行之后将该查询放入缓存当中,然后执行一条dml语句,这样数据库中的数据发生了改变,然后重新查询,但是这时候查询出的数据仍然是数据发生改变之前的数据,因为是从缓存中查询,这时候就出现了数据不同步的情况。

所以每次对数据进行dml操作之后应该将缓存清空,保证数据同步

d8da95ebb8bd66979bc4f5d66c241877.png

SpringBoot整合SpringData Redis:

首先添加坐标:

6a0b12560159616e8a0442635451a8eb.png

最重要的是redis.client坐标,没有这个的话测试失败(坑)

在springboot2.x和1.x中对于redis的配置类不一样,在2.x中配置类中只需要配置RedisTemplate即可

430eb1cedc856f5e214dc329767b99fc.png

springboot2.x默认使用的是Lettuce连接池,1.x中使用的是默认jedisPool

连接单机版redis

c20bf06e9d50fabb36570f05d95b9ea2.png

密码不需要给定

连接集群版redis:

d662209d6cbc131f6362f42e09e5b385.png

测试:

99ae3d4aead6427c80f0f7deccdd9c1f.png

使用Redisdesktopmanager查看测试结果:

dd81db87cc85885f0c1bd343e79a365d.png

SpringBoot整合拦截器:使用SSM定义拦截器时需要在xml配置文件中配置,springboot只需要定义一个拦截器类即可

package com.tangfen.interceptor;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.tangfen.converter.DateConverter;

@Configuration
public class PageInterceptor implements WebMvcConfigurer{

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		HandlerInterceptor interceptor = new HandlerInterceptor() {

			@Override
			public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
					Exception ex) throws Exception {
				// TODO Auto-generated method stub
				HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
			}

			@Override
			public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
					ModelAndView modelAndView) throws Exception {
				HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
			}

			@Override
			public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
					throws Exception {
				// TODO Auto-generated method stub
				return HandlerInterceptor.super.preHandle(request, response, handler);
			}
			
		};
		//拦截路径和放行
		registry.addInterceptor(interceptor).addPathPatterns("/**").excludePathPatterns("/index");
	}
        //定义日期转换器
	@Override
	public void addFormatters(FormatterRegistry registry) {
		registry.addConverter((Converter<String, Date>) new DateConverter());
	}

	
	
	
}

在SpringBoot1.x中定义拦截器可以继承WebMvcConfigurerAdapter类,然后重写addInterceptors方法,将定义的拦截器放进去,但是在SpringBoot2.x中使用的Spring5.x的版本,这种方法已经过时,所以可以使用实现WebMvcConfigurer接口的方式,然后重写addInterceptors方法

添加日期转换器同样是实现这个接口,重写addFormatters方法,将转换器类加进去即可

c141c38e1635ea3b8ae71a443320f6fd.png

SpringBoot使用Scheduled定时器:

1.x版本中需要添加Scheduled的依赖坐标spring-context-support,而2.x之后自动添加了该依赖

a3c617ee9cc9354912fa8e664bff97f9.png

定时器类:

0c9d031c482c92857520b330fb988b3d.png

使用时在启动类上加入注解:

e2be43b60eb2bf9f9f0ef87c75da1110.png

启动测试:

6d63a9b1437beb54ab7433b2575d2442.png

SpringBoot整合Quartz:添加quartz的启动器

1134260bff44456595bd8268df14f5c3.png

新建测试类:

7fef6e6872fbd98d253f2b9b6a6e4557.png

新建配置类:

45c70538f1e386fd0c9b5aae76c1d0d9.png

我这两个类名弄反了

启动类还是要开启注解:

084e16a4bbe8b465fd048a2bc250a689.png

启动:

c5290bcb0e632a1832228111379c9893.png
Spring Boot中,@Cacheable是一个注解,用于启用基于注解的缓存功能。通过在需要缓存的方法上添加@Cacheable注解,可以将方法的返回结果缓存起来,下次调用相同参数的方法时,直接从缓存中获取结果,提高了系统的性能和响应速度。 @Cacheable注解可以用在方法级别或类级别。在方法级别上使用@Cacheable注解时,可以指定缓存的名称和缓存的key。当调用被@Cacheable注解修饰的方法时,Spring会先检查缓存中是否存在相应的缓存数据,如果存在,则直接返回缓存数据;如果不存在,则执行方法体中的逻辑,并将返回结果存入缓存中。 使用@Cacheable注解需要在Spring Boot主程序类上添加@EnableCaching注解,以启用缓存功能。另外,还需要配置相应的缓存管理器,可以使用Redis等缓存技术来实现缓存功能。在Spring Boot中,可以使用Spring Data Redis作为缓存管理器。 总之,通过使用@Cacheable注解,可以方便地实现方法级别的缓存功能,提高系统的性能和响应速度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot缓存篇01——@Cacheable属性介绍和简单使用](https://blog.csdn.net/qq_41008818/article/details/112253215)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBoot 缓存之 @Cacheable介绍](https://blog.csdn.net/qq_50652600/article/details/122791156)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值