目次
1. Spring は 3.1 から Cache をサポートします
Spring は 3.1 から Cache のサポートを導入しました。org.springframework.cache.Cache
およびインターフェイスはorg.springframework.cache.CacheManager
、さまざまなキャッシュ技術を統合するために定義されています。また、開発を簡素化するためのJCache(JSR-107)
注釈。
その使用方法と原理は、Spring のトランザクション管理サポートに似ています.Spring Cache はメソッドに作用します.その核となる考え方は、キャッシュ メソッドを呼び出すときにメソッド パラメータを使用し、キーと値のペアがキャッシュ。
SpringBoot で提供されている @Cacheable というキャッシュ アノテーション @Cacheable は、デフォルトでメソッドの戻り値をキャッシュの値として、メソッドのパラメータ値をキャッシュのキーとして使用します。@Cacheable は、特定のメソッドでマークすることも、クラスでマークして、このクラスのすべてのメソッドがキャッシュをサポートしていることを示すこともできます。
キャッシュが必要なメソッドが呼び出されるたびに、Spring は指定されたパラメーターの指定されたターゲット メソッドが呼び出されたかどうかをチェックし、呼び出された場合はメソッド呼び出しの結果をキャッシュから直接取得し、そうでない場合はメソッドを呼び出してキャッシュします。結果を返してユーザーに返すと、次の呼び出しはキャッシュから直接取得されます。
2、@Cacheable 共通属性
- @Cacheable はキャッシュを追加し、同じ条件のクエリはデータベースをクエリするのではなく、キャッシュからクエリします。
- @CachePut は毎回データベースにアクセスし、キャッシュを更新します。
- @CacheEvict はキャッシュをクリアします。
1、値/キャッシュ名
上の図に示すように、これら 2 つの属性は同じ意味を表します. これら 2 つの属性は、メソッドの戻り結果を格納するキャッシュ コンポーネントの名前を指定するために使用されます.配列、および複数のキャッシュを指定できます。
2、キー
データのキャッシュに使用するキーは key 属性で指定でき、デフォルトではメソッド呼び出しで渡されたパラメーターがキーとして使用されます。最終キャッシュに格納されるコンテンツの形式は、Entry<key,value> の形式です。
3、状態
発動条件。このパラメータは、キャッシュによってトリガーされる条件付きスプライシングを指定します。たとえばcondition="#area.id != 1"
、id が 1 でない場合にキャッシュがトリガーされます。
4、ない限り
除外。このパラメーターは、キャッシュがトリガーされない場合を指定します。たとえばunless="#result == null"
、クエリ結果が NULL の結果をキャッシュしない場合です。
5、キージェネレーター
キャッシュされたキー値などのカスタム キー戦略は、メソッド名です。
@Configuration
public class CacheConfig{
@Bean
public KeyGenerator myKeyGenerator(){
return (target,method,params)->method.getName();
}
}
KeyGenerator は、Spring が提供する機能インターフェースです。
package org.springframework.cache.interceptor;
import java.lang.reflect.Method;
/**
* Cache key generator. Used for creating a key based on the given method
* (used as context) and its parameters.
*
* @author Costin Leau
* @author Chris Beams
* @author Phillip Webb
* @since 3.1
*/
@FunctionalInterface
public interface KeyGenerator {
/**
* Generate a key for the given method and its parameters.
* @param target the target instance
* @param method the method being called
* @param params the method parameters (with any var-args expanded)
* @return a generated key
*/
Object generate(Object target, Method method, Object... params);
}
@Cacheable(keyGenerator="myKeyGenerator") を介してキーのカスタム生成戦略を指定します。
6、同期
非同期モードを使用するかどうか。デフォルトでは、メソッドが実行され、メソッドによって返された結果が同期的にキャッシュに格納されます。
7、キャッシュマネージャー
これを使用して、キャッシュを取得するキャッシュ マネージャーからキャッシュ マネージャーを指定できます。
3. 統合手順
1.ポムに参加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
2. @EnableCaching アノテーションをスタートアップ クラスに追加する
3. コントローラーまたはサービスに @Cacheable アノテーションを付けることができます
4.コード例
package com.nezha.controller;
import com.nezha.entity.Area;
import com.nezha.service.area.AreaService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/area")
public class AreaController {
@Autowired
private AreaService areaService;
// @Cacheable添加缓存,相同条件的查询不再查询数据库,而是从缓存中查询
@Cacheable(cacheNames="area",key = "#id")
@GetMapping("getAreaById")
public Area getAreaById(Integer id) {
return areaService.getAreaById(id);
}
// @CachePut每次都会访问数据库,并更新缓存
@CachePut(cacheNames="area",key = "#id")
@PostMapping("updateAreaById")
public void updateAreaById(Integer id) {
areaService.updateAreaById(id);
}
// @CacheEvict清除缓存
@CacheEvict(cacheNames="area",key = "#id")
@PostMapping("deleteAreaById")
public void deleteAreaById(Integer id) {
areaService.deleteAreaById(id);
}
}
postman アクセスを通じて127.0.0.1:8080/NettyProject/area/getAreaById?id=1
、コンソールは初めて SQL ログを出力し、コンソールは 2 番目の要求のログを出力しません。これは、SQL クエリが実行されておらず、クエリが@Cacheable(cacheNames="area",key = "#id")
キャッシュされたデータであることを証明しています。
Nezha ブティック シリーズの記事
Javaの学習ルートまとめ、ブリックムーバーがJavaアーキテクトを攻撃
100,000 語と 208 の Java クラシック インタビューの質問のまとめ (回答付き)