spring boot2 (28)-cache缓存

数据库的数据是存储在硬盘上的,频繁访问性能较低。而缓存数据存储在内存中,访问性能比硬盘快了一个数量级。如果将一些需要频繁查询的热数据放到缓存中,可以大大减轻数据库的访问压力。

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

启用缓存

在配置类中添加以下注解

@EnableCaching

使用缓存

出于方便,这里直接在控制层做缓存。
	@GetMapping("/find")
	@Cacheable(cacheNames = "hello") 
	public String find() {
		System.out.println("从数据库查询数据,并用return返回");
		return "该数据会被缓存";
	}
  • @Cacheable:指在执行find方法前,首先查找该方法是否有缓存,如果有则直接返回缓存,如果没有则执行方法。
  • cacheNames:指定缓存的名称,不同缓存的数据是彼此隔离的。

缓存的key

上面cacheNames指定了缓存名称,但是每个方法由于传参不同,其return数据也会不同,所以一个方法中可能会有多个缓存。要在同一个cacheNames中区别不同的缓存,就需要使用key。修改前两行代码,给find方法传入了一个User,这是我自定义的类,其中有一个id参数。同时指定了key为"#user.id",这是SpEL表达示,指使用user的id作为当前缓存的key。关于SpEL更多 语法可自行百度。

@GetMapping("/find")	
@Cacheable(cacheNames = "hello",key = "#user.id") 
public String find(User user) {
  • 现在访问http://localhost:8080/find?id=1,此时id参数会传入user,最终该缓存的key为1。
  • 然后访问http://localhost:8080/find?id=2,此缓存的key为2,与上面的1不一样,所以它们不是同一个缓存。

修改缓存

	@GetMapping("/update")
	@CachePut(cacheNames = "hello", key = "#id") 
	public String update(String id) {
		System.out.println("读取修改后的数据");
		return "修改后的缓存数据";
	}
  • @CachePut:无论是否存在缓存,它都会执行,而且用return数据刷新缓存。
  • cacheNames:指定要修改的key所属的cacheNames。
  • key:这里方法参数就是id,所以可以直接用#id。

访问http://localhost:8080/update?id=1,此时key为1的缓存将被修改。之后再访问http://localhost:8080/find?id=1,都会得到修改后的数据,find方法中原有的数据被替换了。

删除缓存

访问http://localhost:8080/delete?id=1,即可删除key为1的缓存,和上面一样的原理。

	@GetMapping("/delete")
	@CacheEvict(cacheNames = "hello", key = "#id") 
	public String delete(String id) {
		return "删除成功";
	}

condition条件

如果只想将id为1的查询写入缓存,而其他数据不需要缓存。可以添加condition缓存条件,如下。这里id参数是个字符串型,所以加了单引号,否则1就是整数,条件不成立。
@Cacheable(cacheNames = "hello",key="#user.id",condition ="#user.id=='1'" ) 

此时,只有访问http://localhost:8080/find?id=1才会使用缓存,如果id为其他值将不使用缓存。

unless条件

condition是在调用方法之前判断条件,决定是否缓存。unless是在调用方法之后判断条件,决定是否不缓存。

	@GetMapping("/find")
	@Cacheable(cacheNames = "hello",unless="#result.id.contains('1')" ) 
	public User find(String id) {
		System.out.println("从数据库查询数据");
		User user = new User();
		user.setId(id);
		return user;
	}
  • unless:如果SpEL条件成立,则不缓存。
  • #result.id.contains:result指方法return的数据,id指return的user的id参数,contains指id的值是否包含'1',如果包含则unless条件成立,不进行缓存。

caffeine

spring boot支持多种不同的缓存供应商。在默认情况下使用的是简单缓存,不建议在正式环境使用。我们可以配置一些更加强大的缓存,比如Hibernate的默认缓存EhCache等,而caffeine则是基于java8新出的一个高性能缓存,官方称其接近完美。下面就来介绍在spring boot中集成caffeine。

		<dependency>
			<groupId>com.github.ben-manes.caffeine</groupId>
			<artifactId>caffeine</artifactId>
		</dependency>

在pom.xml中增加以上依赖,spring boot就会自动用caffeine替换默认的简单缓存,用法都是一样的。

properties参数配置

spring.cache.type=caffeine
spring.cache.cache-names=hello,world
spring.cache.caffeine.spec=maximumSize=1,expireAfterAccess=5s
  • spring.cache.type:指定使用哪个缓存供应商
  • spring.cache.cache-names:在启动时创建缓存名称,即前面的cacheNames,多个名称用逗号分隔。
  • spring.cache.caffeine.spec:这是caffeine缓存的专用配置。
  • maximumSize=1:最大缓存数量,假如有缓存1,再写入缓存2时,就有2个缓存,超出最大数量,缓存1就会被清除。
  • expireAfterAccess=5s:缓存5秒,即缓存在5秒之内没有被使用,就会被清除。

默认情况下,缓存的数据会一直保存在内存中,有些数据可能用一次后很长时间都不会再用,这样会有大量无用的数据长时间占用内存,通过配置properties可以及时清除不需要的缓存。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值