浅谈数据缓存

数据库是网站性能的瓶颈,而要突破性能瓶颈,从而减轻数据库压力的最省力方法就是使用 缓存 技术。

pom.xml 引入依赖包:

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

开启缓存支持

要想缓存得以使用,需要在 Application 中的 main 方法上加上注解 @EnableCaching 以开启缓存支持。

@SpringBootApplication
@EnableCaching
public class RedisDataApplication {

	public static void main(String[] args) {
		SpringApplication.run(RedisDataApplication.class, args);
	}
}

SpringBoot 对应 cache 缓存提供了非常简单的解决方案,核心点就是三个注解:

@Cacheable:

  • @Cacheable 可以声明在方法上,也可以声明在类上。声明在方法上表明该方法的执行结果可以缓存,声明在类上表明该类里的所有方法都支持缓存。
  • @Cacheable 在方法执行前 Spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放进缓存。它还有三个重要的参数: value,返回的内容将存储在 value 定义的缓存的名字对象中。key,如果不指定将使用默认的 KeyGenerator 生成。condition,执行此缓存方法的触发条件,若为空,表示不论什么情况都加入缓存。 看个例子:
@RequestMapping("/hello")
@Cacheable(value="helloCache")
public String hello(String name) {
    System.out.println("第一次执行不走缓存,第二次执行走缓存!");
    return "hello"+name;
}

启动 http://localhost:8080/hello?name=world

执行结果:第一次执行将直接打印 “第一次执行不走缓存,第二次执行走缓存!”,并在页面中给出 hello,world。再次启动上面的网站,System.out.println 语句没有输出,网页直接给出 hello,world,说明这次没有走 hello() 这个方法,走的是缓存。返回结果是直接到 helloCache 对象里去取的,即 value 的含义,而 key 则由 KeyGenerato 默认生成,即 name。意思就是将 name 的值缓存在 helloCache 对象中。

当触发条件 condition="#name.length() <= 5" 时,如果 name 的值赋 world,则会走缓存;若 name 的值赋 williamszhang,则不会走缓存。

@CachePut :

与 @Cacheable 类似,但是它无论什么情况,都会执行该方法并将方法的返回值放到缓存中, 主要用于数据的插入和更新方法,以防止数据库信息与缓存信息不一致的情况。

@CacheEvict:

标注在需要清除缓存元素的⽅方法或类上,用于将数据从缓存中删除, 主要用于删除方法。