SpringCache (一般キャッシュ)

ヒント: 記事を書いた後、目次を自動生成することができます. 生成方法は右のヘルプドキュメントを参照してください.


提示:以下是本篇文章正文内容,下面案例整理于黑马

1. 理解する

Spring Cache は、Spring が提供する一般的なキャッシング フレームワークであり、AOP を利用してアノテーション ベースのキャッシングを実装します。開発者は、下部にあるキャッシング フレームワークが何であるかを気にする必要がないように、キャッシング機能を実現するためのアノテーションを追加するだけで済みます。

質問: Spring Cache を使用して注釈をキャッシュします。データはどこにキャッシュされますか?

  1. 他のキャッシュ フレームワークが構成されていない場合、SpringCache はデフォルトで ConcurrentHashMap をローカル キャッシュとして使用してデータを格納します。
  2. 他のキャッシュ フレームワークを使用する場合は、簡単な構成を行うだけで済みます。設定方法は以下をお読みください。
属性 効果 一般的に使用される
@キャッシュ可能 アノテーションはメソッドに使用され、メソッドの戻り値がキャッシュされ、呼び出し時に最初にキャッシュがクエリされます。yes の場合は戻ります。no の場合は、データベースにクエリを実行してから結果をキャッシュします。 はい
@キャッシュプット アノテーションはメソッドに使用され、メソッドの戻り値はキャッシュに入れられ、他の場所で使用するためにキャッシュされます。【追加専用】 いいえ
@CacheEvit アノテーションはメソッドに使用され、指定されたキャッシュがクリアされます。 はい
@キャッシング 注釈は、複数のキャッシュを操作できるメソッドに使用されます いいえ

2.ステップを使用する

1. 他のキャッシュは使用されません

1.maven座標

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

2.キャッシュを有効にする

@SpringBootApplication
@EnableCaching // 开启springcache缓存
public class Application {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Application.class,args);
    }
}

3. 構成の注釈

	 /**
     * @Cacheable
     * 
     * value:可以理解名称空间(分组)
     * key: 支持spring EL表达式
     */
    @Cacheable(value="user" , key = "'user_' + #userID") // 添加缓存,并从缓存中获取
    @GetMapping
    public ResponseEntity findUserInfoById(Long userID) {
    
    
        UserInfoVo userInfo = userService.findUserInfoById(userID);
        return ResponseEntity.ok(userInfo); //正常返回状态码200
    }


 	/**
     * @CachePut
     *
     * value:可以理解名称空间(分组)
     * key: 支持spring EL表达式
     */
    @CachePut(value="user" , key = "'user_' + #userID") // 添加缓存,并从缓存中获取
    @GetMapping
    public ResponseEntity findUserInfoById(Long userID) {
    
    
        UserInfoVo userInfo = userService.findUserInfoById(userID);
        return ResponseEntity.ok(userInfo); //正常返回状态码200
    }


	 /**
     * @CacheEvict
     * 
     * value:可以理解名称空间(分组)
     * key: 支持spring EL表达式
     */
    @CacheEvict(value="user" , key = "'user_' + #userInfo.getId()") //清空缓存
    @PutMapping
    public ResponseEntity updateUserInfoById(@RequestBody UserInfo userInfo) {
    
    
        userService.updateUserInfoById(userInfo);
        return ResponseEntity.ok(""); //正常返回状态码200
    }


	/**
     * @Caching
     *
     * value:可以理解名称空间(分组)
     * key: 支持spring EL表达式
     */
    @Caching(
            evict = {
    
    
                    @CacheEvict(value="user" , key = "#userInfo.getId()"),
                    @CacheEvict(value="role" , key = "#userInfo.getId()")
            }
    )//清空多个缓存
    @PutMapping
    public ResponseEntity updateUserInfoById(@RequestBody UserInfo userInfo) {
    
    
        userService.updateUserInfoById(userInfo);
        return ResponseEntity.ok(""); //正常返回状态码200
    }

2. 他のキャッシュ フレームワーク (redis) を使用する

1.maven座標

<!--SpringDataRedis依赖-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.application.yml の設定

spring:
  redis:  #redis配置
    port: 6379
    host: 192.168.136.160

Redis が構成されている場合、Spring Cache を使用すると、データがローカルにキャッシュおよび保存されるのではなく、Redis に保存されます(デフォルトの構成を使用せず、当社の構成を使用してください)

3.Spring Cache キャッシュの有効期限を設定する

import com.google.common.collect.ImmutableMap;
import org.springframework.boot.autoconfigure.cache.RedisCacheManagerBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;

import java.time.Duration;
import java.util.Map;

@Configuration
public class RedisCacheConfig {
    
    

    //设置失效map
    private static final Map<String, Duration> cacheMap;

    static {
    
    
        //将Spring Cache需要失效的命名空间添加到map
        cacheMap = ImmutableMap.<String, Duration>builder().put("user", Duration.ofSeconds(30L)).build();
        cacheMap.put("role", Duration.ofSeconds(30L));
    }

    //配置RedisCacheManagerBuilderCustomizer对象
    @Bean
    public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {
    
    
        return (builder) -> {
    
    
            //根据不同的cachename设置不同的失效时间
            for (Map.Entry<String, Duration> entry : cacheMap.entrySet()) {
    
    
                builder.withCacheConfiguration(entry.getKey(),
                        RedisCacheConfiguration.defaultCacheConfig().entryTtl(entry.getValue()));
            }
        };
    }
}

おすすめ

転載: blog.csdn.net/packge/article/details/127440900