最初の春のキャッシュ抽象化と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のリンク