溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring?Cache使用技巧有哪些

發(fā)布時間:2023-03-11 09:50:16 來源:億速云 閱讀:102 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下Spring Cache使用技巧有哪些的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    一、簡介

    Spring Cache是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單地加一個注解,就能實現(xiàn)緩存功能。

    Spring Cache提供了一層抽象,底層可以切換不同的cache實現(xiàn)。具體就是通過CacheManager接口來統(tǒng)一不同的緩存技術(shù)。
    CacheManager是Spring提供的各種緩存技術(shù)抽象接口
    針對不同的緩存技術(shù)需要實現(xiàn)不同的CacheManager:

    Spring?Cache使用技巧有哪些

    CacheManager默認使用的ConcurrentMapManager 

    Spring Cache 常用注解

    Spring?Cache使用技巧有哪些

     在spring boot項目中,使用緩存技術(shù)只需在項目中導入相關(guān)緩存技術(shù)的依賴包,并在啟動類上使用@EnableCaching開啟緩存支持即可。
    例如,使用Redis作為緩存技術(shù),只需要導入Spring data Redis的maven坐標即可。

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>

     spring cache的基本api在web下的context包中

    Spring?Cache使用技巧有哪些

     如果有使用其他的api可以導入cache的依賴

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

    二、使用默認ConcurrentMapManager 

    (一)創(chuàng)建數(shù)據(jù)庫和表

    創(chuàng)建cache_demo數(shù)據(jù)庫,并創(chuàng)建user表

    > create database cache_demo;
    Query OK, 1 row affected (0.02 sec)
     
    > use cache_demo;
    Database changed
     
    > create table user (
    > id bigint primary key,
    > name varchar(50),
    > age int,
    > address varchar(50)
    >);

    Spring?Cache使用技巧有哪些

    (二)創(chuàng)建boot項目

    改POM

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.4.5</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.itheima</groupId>
        <artifactId>cache_demo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <java.version>1.8</java.version>
        </properties>
     
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.20</version>
            </dependency>
     
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.76</version>
            </dependency>
     
            <dependency>
                <groupId>commons-lang</groupId>
                <artifactId>commons-lang</artifactId>
                <version>2.6</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
     
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
     
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.2</version>
            </dependency>
     
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.23</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.4.5</version>
                </plugin>
            </plugins>
        </build>
    </project>

     寫YML

    server:
      port: 8080
    spring:
      application:
        #應(yīng)用的名稱,可選
        name: cache_demo
      datasource:
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
          username: root
          password: root
    mybatis-plus:
      configuration:
        #在映射實體或者屬性時,將數(shù)據(jù)庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射
        map-underscore-to-camel-case: true
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      global-config:
        db-config:
          id-type: ASSIGN_ID

    User

    @Data
    public class User implements Serializable {
     
        private static final long serialVersionUID = 1L;
     
        private Long id;
     
        private String name;
     
        private int age;
     
        private String address;
     
    }
     
     
    UserMapper
    ====================================================
    @Mapper
    public interface UserMapper extends BaseMapper<User>{
    }
     
     
    UserController
    ====================================================
    @RestController
    @RequestMapping("/user")
    @Slf4j
    public class UserController {
     
        @Autowired
        private UserService userService;
     
        
        // 增加User
        @PostMapping
        public User save(User user){
            userService.save(user);
            return user;
        }
     
     
        // 刪除User
        @DeleteMapping("/{id}")
        public void delete(@PathVariable Long id){
            userService.removeById(id);
        }
     
        // 更新User
        @PutMapping
        public User update(User user){
            userService.updateById(user);
            return user;
        }
     
        // 根據(jù)id查詢User
        @GetMapping("/{id}")
        public User getById(@PathVariable Long id){
            User user = userService.getById(id);
            return user;
        }
     
        // 根據(jù)id和name查詢User集合
        @GetMapping("/list")
        public List<User> list(User user){
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(user.getId() != null,User::getId,user.getId());
            queryWrapper.eq(user.getName() != null,User::getName,user.getName());
            List<User> list = userService.list(queryWrapper);
            return list;
        }
    }

     主啟動類

    @Slf4j
    @SpringBootApplication
    public class CacheDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(CacheDemoApplication.class,args);
            log.info("項目啟動成功...");
        }
    }

    (三)使用Api

    1、@EnableCaching

    啟動類上加注解@EnableCaching  // 使用spring cache

    2、@CachePut
        // 在controller中加入緩存對象
        @Autowired
        private CacheManager cacheManager;
     
        /**
         * CachePut:將方法返回值放入緩存
         * value:緩存的名稱,每個緩存名稱下面可以有多個key
         * key:緩存的key
         */
        @CachePut(value = "userCache",key = "#user.id")
        @PostMapping
        public User save(User user){
            userService.save(user);
            return user;
        }

    通過ctrl點進key下載源碼后我們可以看到這里使用的是SpEL語言動態(tài)獲取值

    Spring?Cache使用技巧有哪些

    測試,使用 postman 發(fā)請求 

    Spring?Cache使用技巧有哪些

    Spring?Cache使用技巧有哪些

     第一次添加會將返回的user存放進cacheManager中

    Spring?Cache使用技巧有哪些

    Spring?Cache使用技巧有哪些

    3、@cacheable

    在方法執(zhí)行前spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中

        /**
         * Cacheable:在方法執(zhí)行前spring先查看緩存中是否有數(shù)據(jù),如果有數(shù)據(jù),則直接返回緩存數(shù)據(jù);若沒有數(shù)據(jù),調(diào)用方法并將方法返回值放到緩存中
         * value:緩存的名稱,每個緩存名稱下面可以有多個key
         * key:緩存的key
         * condition:條件,滿足條件時才緩存數(shù)據(jù)
         * unless:滿足條件則不緩存
         */
        @Cacheable(value = "userCache",key = "#id",unless = "#result == null")
        @GetMapping("/{id}")
        public User getById(@PathVariable Long id){
            User user = userService.getById(id);
            return user;
        }

    測試,我們使用jack的id去查詢一下,同樣使用postman,在這個方法設(shè)置斷點,如果沒有觸發(fā)斷點說明是在cache中查詢直接返回的

     4、@CacheEvict
        /**
         * CacheEvict:清理指定緩存
         * value:緩存的名稱,每個緩存名稱下面可以有多個key
         * key:緩存的key
         */
        @CacheEvict(value = "userCache",key = "#p0")
        //@CacheEvict(value = "userCache",key = "#root.args[0]")
        //@CacheEvict(value = "userCache",key = "#id")
        @DeleteMapping("/{id}")
        public void delete(@PathVariable Long id){
            userService.removeById(id);
        }
     
        //@CacheEvict(value = "userCache",key = "#p0.id")
        //@CacheEvict(value = "userCache",key = "#user.id")
        //@CacheEvict(value = "userCache",key = "#root.args[0].id")
        @CacheEvict(value = "userCache",key = "#result.id")
        @PutMapping
        public User update(User user){
            userService.updateById(user);
            return user;
        }

    三、使用redis作為cache

    導入redis依賴

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>

    修改YML

    server:
      port: 8080
    spring:
      application:
        #應(yīng)用的名稱,可選
        name: cache_demo
      datasource:
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/cache_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
          username: root
          password: 123456
      redis:
        host: 192.168.23.100
        port: 6379
        password: zjy123...000
        database: 1
      cache:
        redis:
          time-to-live: 1800000 #設(shè)置緩存過期時間,可選
    mybatis-plus:
      configuration:
        #在映射實體或者屬性時,將數(shù)據(jù)庫中表名和字段名中的下劃線去掉,按照駝峰命名法映射
        map-underscore-to-camel-case: true
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      global-config:
        db-config:
          id-type: ASSIGN_ID

    啟動項目后,cache變成了RedisCacheManager

    Spring?Cache使用技巧有哪些

    使用postman發(fā)送save請求

    Spring?Cache使用技巧有哪些

    db01

    Spring?Cache使用技巧有哪些

     發(fā)送DELETE刪除緩存

    Spring?Cache使用技巧有哪些

    Spring?Cache使用技巧有哪些

    以上就是“Spring Cache使用技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI