ヒント: 記事を書いた後、目次を自動生成することができます. 生成方法は右のヘルプドキュメントを参照してください.
記事ディレクトリ
提示:以下是本篇文章正文内容,下面案例整理于黑马
1. 理解する
Spring Cache は、Spring が提供する一般的なキャッシング フレームワークであり、AOP を利用してアノテーション ベースのキャッシングを実装します。開発者は、下部にあるキャッシング フレームワークが何であるかを気にする必要がないように、キャッシング機能を実現するためのアノテーションを追加するだけで済みます。
質問: Spring Cache を使用して注釈をキャッシュします。データはどこにキャッシュされますか?
- 他のキャッシュ フレームワークが構成されていない場合、SpringCache はデフォルトで ConcurrentHashMap をローカル キャッシュとして使用してデータを格納します。
- 他のキャッシュ フレームワークを使用する場合は、簡単な構成を行うだけで済みます。設定方法は以下をお読みください。
属性 | 効果 | 一般的に使用される |
---|---|---|
@キャッシュ可能 | アノテーションはメソッドに使用され、メソッドの戻り値がキャッシュされ、呼び出し時に最初にキャッシュがクエリされます。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()));
}
};
}
}