Spring Cacheの紹介と使い方

目次

1. Spring Cache の概要

1. Spring Cache の共通アノテーション

2. Spring Cache は Redis キャッシュ手順を使用します

1.依存関係を追加する

2. 構成の追加

3. 注釈を使用する


1. Spring Cache の概要

Spring Cacheはアノテーションベースのキャッシュ機能を実装したフレームワークで、単純にアノテーションを追加するだけでキャッシュを実装できます。

関数。Spring Cache は抽象化の層を提供し、最下層はさまざまなキャッシュ実装を切り替えることができます。具体的には、キャッシュマネージャー

さまざまなキャッシュ テクノロジを統合するためのインターフェイス。

CacheManager は、Spring が提供するさまざまなキャッシュ技術の抽象インターフェイスです。

キャッシュ テクノロジごとに異なる CacheManager を実装する必要があります。
 

キャッシュマネージャー 説明する
EhcachecacheManager キャッシュテクノロジーとして EhCache を使用する
Guavaキャッシュマネージャー Google の GuavaCache をキャッシュ テクノロジとして使用
Redisキャッシュマネージャー Redis をキャッシュ テクノロジとして使用する

1. Spring Cache の共通アノテーション

注釈 説明する
@EnableCaching キャッシュアノテーション機能を有効にする
@キャッシュ可能 Spring はメソッドを実行する前に、まずキャッシュにデータがあるかどうかを確認し、データがある場合はキャッシュされたデータを直接返し、データがない場合はメソッドを呼び出してメソッドの戻り値をキャッシュに置きます。
@CachePut メソッドの戻り値をキャッシュに入れる
@CacheEvict キャッシュから 1 つ以上のデータを削除します

Spring Boot プロジェクトでキャッシュ テクノロジを使用するには、関連するキャッシュ テクノロジの依存関係パッケージをプロジェクトにインポートし、それをスタートアップ クラスで使用するだけです。

@EnableCaching はキャッシュのサポートを有効にできます。

たとえば、キャッシュ テクノロジとして Redis を使用するには、Spring データ Redis の Maven 座標をインポートするだけで済みます。

2. Spring Cache は Redis キャッシュ手順を使用します

1.依存関係を追加する

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

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

2. 構成の追加

spring
  redis:
    host: 172.17.2.94  #ip地址
    port: 6379         #端口
    password: root@123456  #redis密码
    database: 0        #指定数据库
  cache:
    redis:
      time-to-live: 1800000 #设置缓存过期时间,可选

3. 注釈を使用する

スタートアップ クラスに注釈を付けます: @EnableCaching

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

アノテーション @CachePut: メソッドの戻り値をキャッシュに入れます

    /**
     * CachePut:将方法返回值放入缓存
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     */
    //@CachePut(value = "userCache",key = "#result.id")//result带表返回值
    @CachePut(value = "userCache",key = "#user.id")//可以直接获取参数,参数名要保持一致
    @PostMapping
    public User save(User user){
        userService.save(user);
        return user;
    }

key は Spring の式言語をサポートしており、キーの値を動的に計算し、# を通じて (通常は直接 #+ パラメーターを使用して) 取得できます。

result: 戻り値を表します。戻り値を取得することでキーを取得できます



 

注釈 @CacheEvict: 指定されたキャッシュを消去します

    /**
     * CacheEvict:清理指定缓存
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     */
    @CacheEvict(value = "userCache",key = "#p0")//p固定写法,0表示下表,第一个参数
    //@CacheEvict(value = "userCache",key = "#root.args[0]")//固定写法,0表示下表,第一个参数
    //@CacheEvict(value = "userCache",key = "#id")//直接获取参数
    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
        userService.removeById(id);
    }
    //@CacheEvict(value = "userCache",key = "#p0.id")//p0第一个参数,id参数的属性
    //@CacheEvict(value = "userCache",key = "#user.id")//直接获取参数属性
    //@CacheEvict(value = "userCache",key = "#root.args[0].id")//获取第一个参数,id参数的属性
    @CacheEvict(value = "userCache",key = "#result.id")//从返回值获取
    @PutMapping
    public User update(User user){
        userService.updateById(user);
        return user;
    }

アノテーション @Cacheable: メソッドを実行する前に、Spring はまずキャッシュにデータがあるかどうかを確認し、データがある場合はキャッシュされたデータを直接返します。データがない場合はメソッドを呼び出し、メソッドの戻り値を格納します。キャッシュ。

/**
     * Cacheable:在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
     * value:缓存的名称,每个缓存名称下面可以有多个key
     * key:缓存的key
     * condition:条件,满足条件时才缓存数据
     * unless:满足条件则不缓存
     */
    @Cacheable(value = "userCache",key = "#id",unless = "#result == null")
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id){
        User user = userService.getById(id);
        return user;
    }

    @Cacheable(value = "userCache",key = "#user.id + '_' + #user.name")//动态拼接key
    @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;
    }

 

 

おすすめ

転載: blog.csdn.net/qi341500/article/details/129418500