• springboot缓存篇之内置缓存


    前言

    前面我们讲了mybatis的一级缓存和二级缓存,这种缓存是基于持久层的缓存,存在很大的局限性。这篇文章主要分享一下另外的一种缓存方式,springboot的内置缓存,看看内置缓存的用法和它的优劣。

    开启缓存

    在使用springboot的内置缓存之前必须做以下两个步骤:

    引入依赖

    <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-cacheartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    开启缓存

    在启动文件加上@EnableCaching注解即可

    @EnableCaching
    public class DemoGwStartApplication {
        public static void main(String[] args) {
            SpringApplication.run(DemoGwStartApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    缓存注解

    @Cacheable

    两个重要的属性 :value和key

    其中key指定的是数据在缓存中存储的键,value是只要使用的缓存名称

    作用:在方法执行前 Spring 先查看缓存中是否有数据,若有,则直接返回缓存数据:若无数据,则调用方法将方法返回值放入缓存中。

    例子:

    @Override
    @Cacheable(value = "goods-info", key = "#id")
    public Goods info(Long id) {
        log.info("从数据库获取");
        return goodsMapper.selectByPrimaryKey(id);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    看控制台日志可以发现,只有第一次会打印"从数据库获取",后续运行接口就直接从缓存中拿,不会再执行方法里面的内容了。

    @CachePut

    同样的该方法也是有两个重要属性:value和key

    作用:将方法返回值放入缓存中

    它并不像@Cacheable一样,需要查是否存在缓存,它是直接设置缓存,一般是在新增或更新缓存的时候用到。

    例子:

    @CachePut`(value = "goods-info", key = "#id")
    public Goods update(Goods goods){
        goodsMapper.updateByPrimaryKeySelective(goods);
       	return goods;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    @CacheEvict

    它的一个重要属性:key,跟上面两个注解的key是一样的意思

    作用:删除缓存

    例子:

    @CacheEvict(value = "order-info", key = "#id")
    public void delete(Long id){
        Goods goods = new Goods();
        goods.setId(id);
        goods.setDeleted(0);
        goodsMapper.updateByPrimaryKeySelective(goods);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    @Caching

    作用:可以通过 @Caching 注解组合多个注解策略在一个方法上.

    这个也不难理解,比如说我们在一个方法里面,生成了订单的同时清空了购物车,订单是要缓存的,而购物车是需要清空的,这时是不是要一个组合?

    此时我们可以在方法是加上这个注解

    @Caching(
        cacheable = {@Cacheable(value = "order-info", key = "#id")},
        evict = {@CacheEvict(value = "cart-info", key = "#id")}
    )
    
    • 1
    • 2
    • 3
    • 4

    总结

    springboot 的内置缓存使用注解的方式非常简单,它是把数据保存在内存中,因此它的效率非常高,但它同样面临一个问题就是无法在分布式环境中使用。就如之前分享的那篇文章《mybatis的一级缓存和二级缓存》一样,如果存在多个节点,缓存更新的只是当前的节点而不是所有的节点。

  • 相关阅读:
    web前端期末大作业——HTML+CSS简单的旅游网页设计与实现
    快手一面:优化MySQL索引创建,减轻线上服务影响
    Spark读取elasticsearch数据指南
    在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)
    JAVA程序员和C程序员的差距在哪里?
    【300+精选大厂面试题持续分享】大数据运维尖刀面试题专栏(十四)
    AH股冲高回落,微盘股指数收盘重挫6%,半导体板块继续走强,工业富联涨停
    学习C++:C++进阶(五)CMake应用篇---集成第三方库和依赖管理
    Java——正则表达式
    微信小程序 自定义tabBar
  • 原文地址:https://blog.csdn.net/gzmyh/article/details/134011627