springboot cache 缓存

使用springboot的cache功能:

1.在启动类上加注解@enableCaching,启用缓存

2.在需要缓存的方法上加入对应的注解,具体如下:

/*
 * 1.@Cacheable(cacheNames = "car", key = "#name")
 * 将方法的返回值 保存 在缓存“car”中,键由key指定,值是方法的返回值
 * 2.@CachePut(cacheNames = "car", key = "#car.name")
 * 使用方法的返回值 更新 缓存“car”中,键为key的值
 * 3.@CacheEvict(cacheNames = "car", allEntries = true)
 * 根据key和condition删除缓存,如果指定allEntries为true,则删除缓存中所有的对象
 */

springboot实例如下:

实体类

package com.example.demo7cache.entity;

import java.time.LocalTime;

/**
 * @author Created by yawn on 2017-10-24 16:42
 */
public class Car {
    private String name;
    private LocalTime time;

    public Car() {
    }

    public Car(String name) {
        this.name = name;
    }

    public Car(String name, LocalTime time) {
        this.name = name;
        this.time = time;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public LocalTime getTime() {
        return time;
    }

    public void setTime(LocalTime time) {
        this.time = time;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", time=" + time +
                '}';
    }
}

缓存类

package com.example.demo7cache.cache;

import com.example.demo7cache.entity.Car;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Created by yawn on 2017-10-24 16:44
 */
@Service
public class CarService {

    // 以下三个方法为查询方法
    /*
     * 1.@Cacheable(cacheNames = "car", key = "#name")
     * 将方法的返回值 保存 在缓存“car”中,键由key指定,值是方法的返回值
     * 2.@CachePut(cacheNames = "car", key = "#car.name")
     * 使用方法的返回值 更新 缓存“car”中,键为key的值
     * 3.@CacheEvict(cacheNames = "car", allEntries = true)
     * 根据key和condition删除缓存,如果指定allEntries为true,则删除缓存中所有的对象
     */

    @Cacheable(cacheNames = "car", key = "#name")
    public Car getByName(String name) {
        System.err.println("查询car");
        return new Car(name, LocalTime.now());
    }
    @Cacheable(cacheNames = "car", key = "#car.name")
    public Car getByCar(Car car) {
        System.err.println("查询car");
        return new Car("getByCar", LocalTime.now());
    }
    @Cacheable(cacheNames = "carList")
    public List<Car> getAll() {
        System.err.println("查询carList");
        List<Car> carList = new ArrayList<>();
        carList.add(new Car("aaa", LocalTime.now()));
        carList.add(new Car("bbb", LocalTime.now()));
        carList.add(new Car("ccc", LocalTime.now()));
        return carList;
    }

    /**
     * save方法:
     * 1.将返回值写入car缓存
     * 2.清空carList缓存中所有对象
     */
    @Cacheable(cacheNames = "car", key = "#car.name")
    @CacheEvict(cacheNames = "carList", allEntries = true)
    public Car save(Car car) {
        System.err.println("保存car");
        return car;
    }

    /**
     * update方法
     * 1.更新缓存car
     * 2.清空carList缓存中所有对象
     */
    @CachePut(cacheNames = "car", key = "#car.name")
    @CacheEvict(cacheNames = "carList", allEntries = true)
    public Car update(Car car) {
        System.err.println("更新car");
        return new Car("yawn", LocalTime.now());
    }

    /**
     * delete方法
     * 1.删除car缓存和carList缓存中的所有对象
     */
    @CacheEvict(cacheNames = {"car", "carList"}, allEntries = true)
    public void delete(String name) {
        System.err.println("删除car");
    }
}

测试类

package com.example.demo7cache;

import com.example.demo7cache.cache.CarService;
import com.example.demo7cache.entity.Car;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.time.LocalTime;

/**
 * @author Created by yawn on 2017-10-24 16:58
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class CarServiceTest {

    @Resource
    private CarService carService;

    /**
     * 测试第二次从缓存中查询
     */
    @Test
    public void test1() {
        System.out.println(carService.getByName("yawn"));
        System.out.println(carService.getByName("yawn"));
        System.out.println(carService.getAll());
        System.out.println(carService.getAll());
    }

    /**
     * 测试不同方法查询从同一缓存中查询
     */
    @Test
    public void test2() {
        System.out.println(carService.getByName("yawn"));
        System.out.println(carService.getByCar(new Car("yawn")));
    }

    /**
     * 测试保存后的写入缓存的查询
     */
    @Test
    public void test3() throws InterruptedException {
        System.out.println(carService.save(new Car("yawn", LocalTime.now())));
        Thread.sleep(998);
        System.out.println(carService.getByName("yawn"));
    }

    /**
     * 测试更新后对car缓存的更新
     */
    @Test
    public void test4() throws InterruptedException {
        System.out.println(carService.getByName("yawn"));
        Thread.sleep(998);
        System.out.println(carService.update(new Car("yawn", LocalTime.now())));
        Thread.sleep(998);
        System.out.println(carService.getByName("yawn"));
    }

    /**
     * 更新后对carList缓存的删除
     */
    @Test
    public void test5() throws InterruptedException {
        System.out.println(carService.getAll());
        System.out.println(carService.update(new Car("yawn")));
        Thread.sleep(998);
        System.out.println(carService.getAll());
    }

    /**
     * 删除后对两个缓存中 所有实体的删除
     */
    @Test
    public void test7() throws InterruptedException {
        System.out.println(carService.getAll());
        System.out.println(carService.getByName("yawn"));
        carService.delete("yyy");
        Thread.sleep(988);
        System.out.println(carService.getAll());
        System.out.println(carService.getByName("yawn"));
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏码云1024

C#集合

2787
来自专栏码匠的流水账

resilience4j小试牛刀

resilience4j是一款受hystrix启发的容错组件,提供了如下几款核心组件:

1641
来自专栏技术点滴

装饰者模式(Decorator)

装饰者模式(Decorator) 装饰者模式(Decorator)[Wrapper] 意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵...

1897
来自专栏大内老A

ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身。在某些情况下通过这两者的结...

2876
来自专栏码匠的流水账

聊聊kafka的partition分配

本文主要研究一下kafka的partition分配,主要是key到parition的映射,partition对consumer的分配,以及partition的r...

821
来自专栏移动开发面面观

KVO简单使用及其实现原理

在应用开发中,我们经常需要使用到,观察者模式,能监听某些对象属性的变化,进行相应的操作。在iOS中,OC为我们提供了一套更加简洁优雅的观察方式——KVO。

753
来自专栏.NET开发者社区

.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法

.NET[C#]中实现实体对象深拷贝(克隆/复制)的几种方法,总有一种适合你。 方式一 使用二进制流 using System; using System.IO...

2006
来自专栏葡萄城控件技术团队

最全数据结构详述: List VS IEnumerable VS IQueryable VS ICollection VS IDictionary

本文对常用的数据结构详述:Array, ArrayList,List,IList,ICollection, Stack, Queue, HashTable, D...

2228
来自专栏葡萄城控件技术团队

深入浅出OOP(三): 多态和继承(动态绑定/运行时多态)

在前面的文章中,我们介绍了编译期多态、params关键字、实例化、base关键字等。本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定。 运行时多态...

1868
来自专栏大内老A

谈谈你最熟悉的System.DateTime[上篇]

最近一直在负责公司内部框架的升级工作,今天对一个小问题进行了重新思考——时间的处理。具体来说,是如何有效地进行时间的处理以提供对跨时区的支持。对于一个分布式的应...

1789

扫码关注云+社区