SpringBoot @Cacheable简单使用

@Cacheable

官方例子
官方文档
简单来说:Spring将会拦截我们的目标方法,检查是否之前已经调用过。如果调用过,则会返回缓存值的副本。否则,将会执行目标方法、存储返回值到缓存中,最后返回值。

流程

有一张类似support data的数据表,里面的数据基本上不会变化。在取这张表的数据时,会根据传入的参数进行一些逻辑判断,在参数一定的前提下,返回的数据是一样的。

准备数据库

create table t_dictionaries
(
  id int not null primary key,
  name varchar(45) null
);

INSERT INTO t_dictionaries (id, name) VALUES (1, 'man');
INSERT INTO t_dictionaries (id, name) VALUES (2, 'woman');

导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>        

启动类

@SpringBootApplication
// 别忘了@EnableCaching
@EnableCaching
public class TodolistApplication {
    public static void main(String[] args) {
        SpringApplication.run(TodolistApplication.class, args);
    }
}

controller层

@RestController
public class DictionaryController {
    @Autowired
    private DictionaryService dictionaryService;

    @GetMapping(value = "/dictionary")
    public Dictionary getDictionary(int id) {
        return dictionaryService.getDictionaryById(id);
    }
}

service层

@Service
public class DictionaryServiceImpl implements DictionaryService {

    @Autowired
    private DictionaryCache dictionaryCache;

    @Override
    public Dictionary getDictionaryById(int id) {
        System.out.println("Call dictionaryCache#findDictionaryById");
        Dictionary dictionary = dictionaryCache.findDictionaryById(id);
        System.out.println("return value: " + dictionary.toString());
        return dictionary;
    }
}

Cache

当传入的参数和之前一样时,不执行方法区,直接返回值。

@Component
public class DictionaryCache {

    @Autowired
    private DictionaryRepository dictionaryRepository;

    @Cacheable(value = "dictionaryList")
    public Dictionary findDictionaryById(int id) {
        System.out.println("Target Id: " + id);
        return dictionaryRepository
                .findById(id)
                .orElse(null);
    }
}

测试

第一次调用,传入id = 1
在这里插入图片描述第二次调用,传入id = 1
没有再次访问数据库,且返回相同的数据
在这里插入图片描述第三次调用,传入id = 2
再次访问数据库,并返回目标数据
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值