SpringBootキャッシュチュートリアルシリーズ

最初の春のキャッシュ抽象化とJSR107を導入する前に、キャッシュ内のあなたのSpringBootプロジェクトを使用して、これは参照だけを学ぶために、シリコンバレーのビデオおよびリファレンス他のブログの後に作られた、まだ学習ノートに私のブログです

@

A、春のキャッシュ抽象化

1.1キャッシュの抽象定義

春バージョン3.1定義org.springframework.cache.Cache
とorg.springframework.cache.CacheManagerインタフェースは異なるキャッシング技術を統一するために、そして私たちのキャッシュの開発を簡素化するためのJavaのキャッシュ(JSR-107)のアノテーションの使用をサポートしています。春のキャッシュは、特定の実装が自分の技術の選択によって決定され、抽象化レイヤを維持するための唯一の責任です。キャッシュとキャッシュ技術は切り離さ。

1.2、重要なインターフェース

  • キャッシュ:キャッシュ抽象仕様のインタフェースは、キャッシュ実装は持っている:RedisCache、EhCacheCache、ConcurrentMapCacheなど
  • CacheManager:キャッシュマネージャー、キャッシュのライフサイクル管理

二、JSR107

2.1、JSR107コアインタフェース

Javaのキャッシュ(JSR-107)は、コアインタフェース5、それぞれCachingProvider、のCacheManager、キャッシュエントリ及び有効期限を定義します。

  • CachingProvider:作成には、configure、取得、管理、および複数のCacheManagerを制御
  • CacheManagerは:configureは、取得は、管理および制御、複数の一意の名前のキャッシュは、キャッシュのCacheManagerのコンテキスト内に存在し、作成します。唯一CachingProviderにAのCacheManager対応
  • キャッシュ:のCacheManagerが管理され、キャッシュのCacheManagerライフサイクル管理は、現在のCacheManagerキャッシュの文脈において、データ構造は次のように、一旦インデックスキーの値として記憶されたマップです。キャッシュが所有する唯一のCacheManagerです
  • エントリ:キャッシュは、キーと値のペアのメモリであります
  • 有効期限:キャッシュに格納された各エントリには、定義された期間があります。この時間をかけて、エントリが自動的に期限切れになります後は、有効期限が切れ、エントリがアクセス、更新、および削除操作を持っていません。キャッシュの寿命はExpiryPolicyによって設定することができます

2.2、JSR107図示

シリコンバレーのアイコンは、まだビデオ教材を引用しています:
ここに画像を挿入説明

三、春のキャッシュ使用

3.1重要な注意事項はじめに

実践例の前に、簡単には春が提供する重要なキャッシュのアノテーションを説明します

  • @Cacheable:方法構成するためには、そのキャッシュ要求パラメータ方法の結果に応じて可能です
  • @CacheEvict:キャッシュを空にする
  • @CachePut:両方の呼び出し方法、およびキャッシュデータを更新
  • @EnableCaching:オープン注釈ベースのキャッシング
  • 複雑なキャッシュ・ルールを定義します。@Caching

3.2環境準備

こののより多くの古典的な例が記載されて[OK]を、このブログは、まだ書き換えするシリコンバレーのビデオの例であります

環境を準備します:

  • Mavenの環境
  • IntelliJ IDEAは
    、新たに2つのテーブルが構築されました:
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lastName` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `gender` int(2) DEFAULT NULL,
  `d_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `departmentName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.3、ばねブートスタータキャッシュモジュールの導入

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

3.4、練習ノートの主な例

3.4.1、@ EnableCaching

オープン注釈ベースのキャッシュを@EnableCaching


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class SpringbootCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootCacheApplication.class, args);
    }

}

3.4.2、@キャッシュ可能コメント

また、導入の前に、主な構成方法のために、その結​​果がリクエストパラメータの方法でキャッシュすることができ@Cacheable役割のアノテーションは、アノテーションの主な属性について教えてください

  • cacheNames /値:名前を指定しますキャッシュコンポーネント、配列
  • キー:キャッシュを決定するために、キーを使用してキャッシュデータが一意のキーで指定することができる;例えば:ライトのSpeI(及びA0の同じ感覚)#ID、idパラメータ値,,#A 0(最初の引数)、#P0 、#root.args [0]
  • するKeyGenerator:鍵生成部と、それらのID発生器の主要なコンポーネントを指定することができる(注:キー/するKeyGeneratorの一の使用を選択し、使用することができません)
  • CacheManager:キャッシュマネージャーを指定し、またはcacheResolver指定されたパーサを取得
  • 条件:のみキャッシュ一致基準ケース; SPEL式が使用され、例えば:条件=「#A0> 1」:> 1つの場合にのみ、キャッシュの最初のパラメータの値
  • しない限り、:ネガティブキャッシュ、条件が真のときに指定しない限り、戻り値はキャッシュされません。例:=でない限り「#A0 = 2!」:最初のパラメータの値が2でない場合、結果はキャッシュされません。
  • 同期:非同期モードを使用するかどうか
    @Cacheable(value = {"emp"}, /*keyGenerator = "myKeyGenerator",*/key = "#id",condition = "#a0>=1",unless = "#a0!=2")
    public Employee getEmp(Integer id) {
        Employee employee = this.employeeMapper.getEmpById(id);
        LOG.info("查询{}号员工数据",id);
        return employee;
    }

KeyGenerator =「myKeyGeneratorプロパティを使用して、カスタムのKeyGeneratorであってもよい本明細書中で使用されます

Springコンテナを追加するには、クラスを定義するKeyGenerator @Bean

@Configuration
public class CacheConfig {

    @Bean(value = {"myKeyGenerator"})
    public KeyGenerator keyGenerator(){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName()+"["+ Arrays.asList(params).toString()+"]";
            }
        };
    }
}

3.4.3、@ CachePutコメント

@CachePutコメントは、キャッシュのコメントですが、キャッシュと@Cacheableは明らかな違いを持っ​​ていることは、メソッドを呼び出して、キャッシュデータを更新されて、それが再び更新を同期キャッシュを操作する方法を実行した後、ので、更新操作に使用される主キーですが、また、 @link @CachePutソースを参照してください、多くの類似した内容があるクエリ、主キー属性と@Cacheableに使用することができます

 /**
     *  @CachePut:既调用方法,又更新缓存数据;同步更新缓存
     *  修改了数据,同时更新缓存
     */
    @CachePut(value = {"emp"}, key = "#result.id")
    public Employee updateEmp(Employee employee){
        employeeMapper.updateEmp(employee);
        LOG.info("更新{}号员工数据",employee.getId());
        return employee;
    }

3.4.4、@CacheEvicコメント

主な属性:

  • キー:指定データが追い出されます
  • allEntries =真:このキャッシュ内の指定されたすべてのデータを消去し
  • beforeInvocationは=偽:キャッシュクリア動作の代わりに、デフォルトは実行方法の後に行われます
  • beforeInvocationは真=:代理操作上のキャッシュをクリアメソッドの実行前に実行されます
    @CacheEvict(value = {"emp"}, beforeInvocation = true,key="#id")
    public void deleteEmp(Integer id){
        employeeMapper.deleteEmpById(id);
        //int i = 10/0;
    }

3.4.5、@キャッシングコメント

複雑なカスタム・キャッシュ・ルールの@Caching、および@Cacheable @CachePutを統合することができます

 // @Caching 定义复杂的缓存规则
    @Caching(
            cacheable = {
                    @Cacheable(/*value={"emp"},*/key = "#lastName")
            },
            put = {
                    @CachePut(/*value={"emp"},*/key = "#result.id"),
                    @CachePut(/*value={"emp"},*/key = "#result.email")
            }
    )
    public Employee getEmpByLastName(String lastName){
        return employeeMapper.getEmpByLastName(lastName);
    }

3.4.6、@CacheConfigコメント

注釈が@CacheConfig共通の設定キャッシュを抽出するために使用することができ、そのクラスを追加することができ、例えば:@CacheConfig(cacheNames = {"emp"},cacheManager = "employeeCacheManager")

拡大付録:SPEL式の使用を

キャッシュSPEL使用可能なメタデータ

名前 場所 説明
methodNameの ルートオブジェクト 現在の方法は、名前と呼ばれています #root.methodname
方法 ルートオブジェクト 現在のメソッドが呼び出されます #root.method.name
目標 ルートオブジェクト 現在のターゲット・オブジェクトがインスタンスと呼ばれています #root.target
targetClass ルートオブジェクト 現在のクラスは、ターゲットオブジェクトと呼ばれています #root.targetClass
引数 ルートオブジェクト パラメータリストは、現在の法と呼ばれています #root.args [0]
キャッシュ ルートオブジェクト 現在のメソッド呼び出しは、キャッシュリストを使用します #root.caches [0] .nameの
引数の名前 実行コンテキスト(avaluationコンテキスト) メソッドのパラメータは、findArtisan(職人職人)として電流と呼ばれ、パラメータがartsian.id位によって得ることができます #artsian.id
結果 実行コンテキスト(評価コンテキスト) (beforeInvocation =偽としてcacheEvictない限り決意を実行するための唯一の有効な方法、)メソッドの実行後に戻り値 #結果

第四に、統合のRedisキャッシュ

4.1環境準備

前の春のキャッシュ環境に基づいて、統合のRedisの構成を紹介します

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

キャッシュモードが切り替えRedisのです。spring.cache.type=redis
ここに画像を挿入説明

4.2、Redisの構成クラスが実装

RedisTemplate設定

@Resource
    private LettuceConnectionFactory lettuceConnectionFactory;

    @Bean
    @Primary
    public RedisTemplate<Object,Object> redisTemplate(){
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<Object, Object>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = this.initJacksonSerializer();
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

関連資料のコードはRedisCacheManagerボーエン、ブロガーは良いコードパッケージを行っていることができますので、これはコードが重複していません

4.3、RestTemplate関連の操作

使用RestTemplate操作Redisの

  • 1、redisTemplate.opsForValue(); //文字列操作
  • 2、redisTemplate.opsForHash(); //操作ハッシュ
  • 3、redisTemplate.opsForList(); //操作リスト
  • 4、redisTemplate.opsForSet(); //操作セット
  • 5、redisTemplate.opsForZSet(); //順序集合における動作

4.4、キャッシュサービスのテスト

@Autowired
    DepartmentMapper departmentMapper;

    @Qualifier("redisCacheManager")
    @Autowired
    RedisCacheManager redisCacheManager;

//      @Cacheable(cacheNames = "dept",cacheManager = "redisCacheManager")
//    public Department getDeptById(Integer id){
//        System.out.println("查询部门"+id);
//        Department department = departmentMapper.getDeptById(id);
//        return department;
//    }

    // 使用缓存管理器得到缓存,进行api调用
   public Department getDeptById(Integer id){
        LOG.info("查询id为{}的员工信息",id);

        //获取某个缓存
        Cache deptCache = redisCacheManager.getCache("dept");
        Department department = null;
        if(deptCache.get(id)==null){
            department = departmentMapper.getDeptById(id);
            deptCache.put(id,department);
        } else {
            SimpleValueWrapper valueWrapper = (SimpleValueWrapper) deptCache.get(id);
            department = (Department)valueWrapper.get();
        }

        return department;
    }

ここに画像を挿入説明

もちろん、上記のキースプリング一次キャッシュを用いても可能である
ここに画像を挿入説明
ボーエンを参照して:
キャッシュキャッシュ戦闘動作抽象化レイヤスプリング

ダウンロードコード例:GitHubのリンク

おすすめ

転載: www.cnblogs.com/mzq123/p/12629142.html