SpringBoot——整合Springcache

整合Spring-cache做缓存

引言:

这个是spring自带的cache,底层是用map实现的。缓存数据量不是很大推荐使用,不然还是要用第三方的缓存redis、echcache等。

 

1、maven依赖

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

2、新建user实体类(常规操作)。我这里用了lombok,上面依赖没有贴这不是主要的

@Data
public class User {

    private String name;
    private Integer age;
}

3、启动类上加上@EnableCaching,开始缓存

@EnableCaching
@SpringBootApplication
public class CsdnDemoApplication {

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

4、service层。(写的很简单,没有写实现层)

在需要缓存数据的方法上加上@Cacheable注解,cacheNames+key成为该缓存值的key,通过#获取方法上的参数。方法的返回值成为缓存的value。

加上这个注解过后他首先会去查询缓存中是否存在,命中就直接返回;没有命中查询数据库返回并缓存到cache中。

#参数名可以从方法参数中取值;也可以#p0#p1取出第几个参数(下标从0开始);参数如果是一个对象可以#object.属性名(SpEL表达式)取值。

注:cacheNames是spring4.2版本新加的,以前版本用value

@Service
public class UserService {

    @Cacheable(cacheNames = "user", key = "#name")
    public User getUser(String name) {
        return selectByName(name);
    }

    /**
     * 模拟查询数据库
     * @param name
     * @return
     * User
     */
    private User selectByName(String name) {
        User user = new User();
        user.setName(name);
        user.setAge(22);
        System.out.println("查询数据库:" + name);
        return user;
    }
}

5、controller简单写个方法测试

@RestController
public class TestController {

    @Autowired
    private UserService userService;

    @GetMapping("/get")
    public User getUser(String name) {
        return userService.getUser(name);
    }
}

6、调用验证结果

刷新在调用一次,控制台没有打印新的日志,说明查询的缓存

 

7、移除缓存

方法上加上@CacheEvict注解,方法执行完成后会用cacheNames+key去缓存中匹配然后移除缓存

@CacheEvict(cacheNames = "user", key = "#name")
    public boolean delUser(String name) {
        //TODO:数据库删除操作
        System.out.println("移除user:" + name);
        return true;
    }
@GetMapping("/del")
    public Boolean delUser(String name) {
        return userService.delUser(name);
    }

 再次调用查询接口,因为已经移除了缓存的原因,又会去查询数据库。

 8、更新缓存

方法上@CachePut注解,会把返回值写入到缓存中去。与@Cacheable的区别:cacheable会在执行方法前检查cache是否存在,存在就直接返回cache中的值,否则执行方法并把返回值写入cache;而cachePut不会去检查,每次都会执行方法并把返回值写入cache.

@CachePut(cacheNames = "user", key = "#name")
    public User updateUser(String name) {
        User user = new User();
        user.setName(name);
        user.setAge(30);
        //TODO:数据库修改
        System.out.println("修改user:" + name);
        return user;
    }
@GetMapping("/update")
    public User updateUser(String name) {
        return userService.updateUser(name);
    }

再次调用查询接口:缓存中已是修改后的值

 

springboot整合springcache简单的操作就这样完成了。

希望对您有所微薄的帮助!

                                                                                                 向上的路并不拥挤,而大多数人选择了安逸。--it疯子也

发布了23 篇原创文章 · 获赞 41 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/feng_zi_ye/article/details/88878123