1.数据缓存Cache
常见CacheManager
SimpleCacheManager
使用简单的Collection来存储缓存,主要用来测试用途
ConcurrentMapCacheManager
使用 ConcurrentMap来存储缓存
EhCacheCacheManager
使用 EhCache作为缓存技术
RedisCacheManager
使用Redis作为缓存技术
2.常用的四个注解
@Cacheable、@CachePut、@CacheEvit @Caching
解释
@Cacheable
在方法执行前Spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方祛并将方法返回值放进缓存
@CachePut
无论怎样,都会将方法的返回值放到缓存中。
@CachePut的属性@Cacheable保持一致
@CacheEvict
将一条或多条数据从缓存中删除
@Caching
可以通过@Caching 注解组合多个注解策略在一个方法上
本例将以 Spring Boot默认的 ConcurrentMapCacheManager作为缓存技术
3.编写测试实体类
package com.lglg.domain;
/**
* Date:2020/8/30
*
* @author:lg
*/
public class Person {
private int id;
private String age;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4.编写测试service
package com.lglg.service;
import com.lglg.domain.Person;
/**
* Date:2020/8/30
*
* @author:lg
*/
public interface DemoService {
Person save(Person person);
void remove(int id);
Person findOne(Person person);
}
package com.lglg.service.impl;
import com.lglg.domain.Person;
import com.lglg.service.DemoService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
* Date:2020/8/30
*
* @author:lg
*/
@Service
public class DemoServiceImpl implements DemoService {
/**
* value 是指定缓存的名称 key是指定数据在缓存中存储的键
* 通俗的介绍 value 就是一个map key就是map中的key 通过value 找到对应的map 然后map
* map.get(key) 得到缓存中的值
*
* 注意点 key = "#person.id" 这个key是取自入参中的值 而不是返回值中的值
* @param person
* @return
*/
@Override
@CachePut(value = "people",key = "#person.id")
public Person save(Person person) {
Person person1 = new Person();
person1.setAge("12");
person1.setId(1);
person1.setName("保存");
System.out.println("模拟保存成功了");
return person1;
}
/**
* 没有指定key 则方法参数作为key保存到缓存中去
* @param id
*/
@Override
@CacheEvict(value = "people")
public void remove(int id) {
System.out.println("模拟删除");
}
@Override
@Cacheable(value = "people",key = "#person.id")
public Person findOne(Person person) {
Person person1 = new Person();
person1.setAge("12");
person1.setId(1);
person1.setName("查询");
System.out.println("模拟查询");
return person1;
// return null;
}
}
5.编写测试的controller
package com.lglg.controller;
import com.lglg.domain.Person;
import com.lglg.service.DemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Date:2020/8/30
*
* @author:lg
*/
@RestController
public class DemoController {
@Autowired
DemoService demoService;
@RequestMapping("/put")
public Person put(Person person){
person.setId(1);
return demoService.save(person);
}
@RequestMapping("/find")
public Person findOne(Person person){
person.setId(1);
return demoService.findOne(person);
}
@RequestMapping("/remove" )
public String remove(int id){
demoService.remove(id);
return "test";
}
}
6.开启缓存注解支持
package com.lglg;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Date:2020/8/30
*
* @author:lg
*/
/**
* SpringBootApplicaton 注解是SpringBoot项目的核心主角,煮需要目的是开启自动配置
*/
@SpringBootApplication
@RestController
@EnableCaching
public class LgApplication {
public static void main(String[] args) {
SpringApplication.run(LgApplication.class,args);
}
@RequestMapping("/")
public String index(){
return "helllo spring-boot demo01";
}
}
6.测试
比较懒,自己测试看看多种情况
总结
注意点 key = “#person.id” 这个key是取自入参中的值 而不是返回值,不然不生效,一般实际操作,保存的id是自动生成的,没传入参,此时缓存通过id取不到,一般应用在查询修改。