1. はじめに
Spring Cache はアノテーションベースのキャッシュ機能を実装するフレームワークであり、アノテーションを追加するだけでキャッシュを実装できます。 。
Spring Cache は抽象化レイヤーを提供し、最下層はさまざまなキャッシュ実装を切り替えることができます。
具体的には、さまざまなキャッシュ テクノロジが CacheManager インターフェイスを通じて統合されます。
CacheManager は、Spring が提供するさまざまなキャッシュ テクノロジの抽象インターフェイスです。これはデフォルトのキャッシュ テクノロジであり、Map にキャッシュされます。これは、サービスがハングアップすると、キャッシュされたデータが失われることも意味します。
さまざまなキャッシュ テクノロジには、さまざまな CacheManager を実装する必要があります。
CacheManager |
Description |
##EhCacheCacheManager |
EhCache をキャッシュ テクノロジーとして使用する |
GuavaCacheManager |
Google の GuavaCache をキャッシュ テクノロジーとして使用する |
#RedisCacheManager | Redis をキャッシュ テクノロジとして使用する |
2. 共通の注釈
Spring Boot プロジェクトでは、キャッシュ テクノロジを使用する場合は、関連するキャッシュ テクノロジの依存関係パッケージをプロジェクトにインポートし、スタートアップ クラスで
@EnableCaching を使用してキャッシュ サポートを有効にするだけです。たとえば、キャッシュ テクノロジとして Redis を使用するには、Spring データ Redis の Maven 座標をインポートするだけで済みます。一般的に使用されるアノテーションは次のとおりです。
Annotation | 説明 |
@ EnableCaching | キャッシュ アノテーション関数を有効にする |
@Cacheable | メソッドが実行される前に、Spring はまずキャッシュにデータがあるかどうかを確認します。データ、直接キャッシュされたデータを返します。データがない場合は、メソッドを呼び出し、メソッドの戻り値をキャッシュに入れます |
@CachePut | メソッドの戻り値を入れますキャッシュ内の値 |
@CacheEvict | キャッシュから 1 つ以上のデータを削除します |
2.1, @EnableCaching
このアノテーションの主な機能は、キャッシュ アノテーション機能を有効にし、他の Spring Cache アノテーションを有効にすることです。使用方法も非常に簡単で、プロジェクトのスタートアップクラスの直上に追加するだけです。
@Slf4j
@SpringBootApplication
@EnableCaching
public class CacheDemoApplication {
public static void main(String[] args) {
SpringApplication.run(CacheDemoApplication.class, args);
log.info("项目启动成功...");
}
}
ログイン後にコピー
2.2, @Cacheable
@Cacheable
アノテーションは主に、メソッドを実行する前にキャッシュにデータがあるかどうかを確認するために使用されます。データがある場合はキャッシュされたデータが直接返され、データがない場合はメソッドが呼び出され、メソッドの戻り値がキャッシュに置かれます。
アノテーションでのパラメータ転送では、主に **SpEL (Spring Expression Language)** を使用してデータを取得および転送します。これは、JSP の EL 式に似ています。一般的に使用されるメソッドは次のとおりです:
"#p0": パラメーター リストの最初のパラメーターを取得します。 「#p」は固定の書き込みメソッド、0 は最初のメソッドを表す添え字です;
"#root.args[0]": メソッドの最初のパラメータを取得します。このうち 0 は添字で、最初のものを表します。
"#user.id": パラメータ user の id 属性を取得します。ここでのユーザーは、パラメーター リストのパラメーター名と一致している必要があることに注意してください。
"#result.id": 戻り値で id 属性を取得します。
Spring Cache ソース コードから: メソッドの作成に使用される Spring Expression Language (SpEL) 式
@Cacheable## では、一般的に使用されるものがいくつかあります。 # アノテーション 属性はオンデマンドで設定できます:
- value: キャッシュの名前。各キャッシュ名の下に複数のキーが存在する可能性があります
- key: キャッシュキー。
- condition: 条件判定、条件が満たされた場合にデータをキャッシュします。このパラメータは Redis では無効であることに注意してください。
- Redis では、パラメータ「unless」を条件ステートメントとして使用して、特定の条件が満たされた場合にデータのキャッシュを回避できます。
/**
* @description 通过id获取用户信息
* @author xBaozi
* @date 14:23 2022/7/3
**/
@Cacheable(value = "userCache", key = "#id", unless = "#result == null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
User user = userService.getById(id);
return user;
}
ログイン後にコピー
2.3、@CachePut @CachPut アノテーションは主にメソッドの戻り値をキャッシュに入れることです。ここでのデータの取得にも SpEL が使用されます。一般的に使用される属性は次のとおりです:
#value: キャッシュの名前。各キャッシュ名の下に複数のキーが存在する可能性があります-
key: キャッシュされたキー。 condition: 条件判定、条件が満たされた場合にデータをキャッシュします。このパラメータは Redis では無効であることに注意してください。 Redis では、パラメータ「unless」を条件ステートメントとして使用して、特定の条件が満たされた場合にデータのキャッシュを回避できます。/**
* @description 新增用户信息并返回保存的信息
* @author xBaozi
* @date 14:38 2022/7/3
**/
@CachePut(value = "userCache", key = "#user.id")
@PostMapping
public User save(User user) {
userService.save(user);
return user;
}
ログイン後にコピー
2.4、@CacheEvict
@CacheeEvict 主にキャッシュから 1 つ以上のデータを削除します。SpEL はデータの取得にも使用されます。一般的に使用される属性は次のとおりです。
value: の名前キャッシュ、各キャッシュ名の下に複数のキーを指定できます key: キャッシュされたキー。 condition: 条件判定、条件が満たされた場合にデータをキャッシュします。このパラメータは Redis では無効であることに注意してください。 Redis では、パラメータ「unless」を条件ステートメントとして使用して、特定の条件が満たされた場合にデータのキャッシュを回避できます。/**
* @description 更新用户信息
* @author xBaozi
* @date 14:41 2022/7/3
**/
@CacheEvict(value = "userCache", key = "#result.id")
@PutMapping
public User update(User user) {
userService.updateById(user);
return user;
}
ログイン後にコピー
3. Redis をキャッシュ製品として使用する
Spring のデフォルトのキャッシュ技術ではキャッシュデータを永続化できないため、サービスがハングアップしてもキャッシュもハングアップするため、操作には Redis を使用する必要があります (実際、Redis を学習したためでもあります)
以前の SpringBoot 統合 Redis キャッシュ検証コード Redis のいくつかの基本的な操作を記録します。
3.1、座標インポート
Maven座標をインポートします: spring-boot-starter-data-redis、spring-boot-starter-cache
<!--Spring Data Redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--Spring Cache-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
ログイン後にコピー
3.2、yml設定
スプリング: redis: ホスト: localhost
ポート: 6379
パスワード: 123456
データベース: 0
キャッシュ:
redis:
Time-to-live: 1800000 # キャッシュの有効期間を設定します
3.3. アノテーション機能を有効にします
スタートアップ クラス
com/itheima/CacheDemoApplication に追加します。 java @EnableCaching アノテーション、キャッシュ アノテーション関数を有効にする<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:java;">@Slf4j
@SpringBootApplication
@ServletComponentScan
@EnableCaching
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class, args);
log.info("springBoot项目启动成功……");
}
}</pre><div class="contentsignin">ログイン後にコピー</div></div>
3.4. @Cacheable
を使用する場合、キャッシュを使用する場合、戻り値は Serializable シリアル化を実装する必要があることに注意してください。それ以外の場合は、間違ってスローされます。
これは、NoSql データベースには Java の基本型に対応するデータ構造がないためです。そのため、NoSql データベースに格納するときにオブジェクトをシリアル化する必要があり、同時にネットワーク送信中にオブジェクトをシリアル化する必要があります。 2 つのアプリケーションの JavaBean の SerialVersionUID が一致している必要があることに注意してください。一致していないと、逆シリアル化が正常に実行できません。
/**
* @description 新增套餐信息
* @author xBaozi
* @date 17:55 2022/5/13
* @param setmealDto 需要新增套餐的数据
**/
@CacheEvict(value = "setmealCache",allEntries = true)
@PostMapping
public Result<String> save(@RequestBody SetmealDto setmealDto) {
log.info("套餐信息为{}", setmealDto);
setmealService.saveWithDish(setmealDto);
return Result.success("套餐" + setmealDto.getName() + "新增成功");
}
ログイン後にコピー
3.5. @CacheEvict を使用する
新しい属性は allEntries と呼ばれ、キャッシュ内のすべての要素をクリアする必要があるかどうかを示すために使用されるブール型です。デフォルトは false で、これは必要ないことを意味します。 allEntries が true に設定されている場合、Spring Cache は指定されたキーを考慮しません。場合によっては、要素を 1 つずつクリアするよりも、すべての要素を一度にクリアしてキャッシュした方が効率的である場合があります。
/**
* @description 更新套餐信息并更新其关联的菜品
* @author xBaozi
* @date 11:28 2022/5/14
* @param setmealDto 需要更新的套餐信息
**/
@CacheEvict(value = "setmealCache",allEntries = true)
@PutMapping
public Result<String> updateWithDish(@RequestBody SetmealDto setmealDto) {
log.info(setmealDto.toString());
setmealService.updateWithDish(setmealDto);
return Result.success("套餐修改成功");
}
ログイン後にコピー
4、测试
代码编写完成之后,重启工程,然后访问后台管理系统,对套餐数据进行新增以及删除,而后观察Redis中的数据发现写的代码是能正常跑到!成功!
以上がSpringBoot が Spring Cache を統合して Redis キャッシュを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。