SpringBoot Redis、Ehcache統合およびマルチキャッシュ構成
Ehcache
- Ehcacheは、純粋なjavaインプロセスキャッシングフレームワークです。これは、Hibernateのデフォルトのキャッシュプロバイダーです。単独で使用できます。一般的にサードパーティのライブラリ(mybatis、shiroなど)で使用されるため、分散サポートには不十分です。複数のノードを同期することはできず、通常はredisと一緒に使用されます。
EhcacheとRedisの比較
- EhcacheはJava仮想マシンに直接キャッシュしますが、これはキャッシュ共有にとって面倒です。
- Redisは、ソケットを介してキャッシュサービスにアクセスします。単一のアプリケーションまたは高いキャッシュアクセスを必要とするアプリケーションの場合は、Ehcacheを使用します。大規模なシステムの場合は、キャッシュの共有、分散展開、および大きなキャッシュコンテンツでのRedisの使用があります。
Ehcacheの使用例
- 依存関係を導入する
<!-- Ehache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.5</version>
</dependency>
- Ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir/ehcache"/>
<!-- 默认缓存 -->
<defaultCache
maxEntriesLocalHeap="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- HellowWorld 缓存-->
<cache name="HelloWorldCache"
maxEntriesLocalHeap="1000"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="5"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"></cache>
</ehcache>
- テストケース
@Test
public void test1(){
String url = System.getProperty("user.dir");
System.out.println(url);
// 创建缓存管理器
CacheManager cacheManager=CacheManager.create(url+"/javatests/resources/ehcache.xml");
// 获取缓存对象
Cache cache=cacheManager.getCache("HelloWorldCache");
// 创建元素
Element element=new Element("key1","value1");
// 将元素添加到缓存
cache.put(element);
// 获取缓存
Element element1=cache.get("key1");
System.out.println(element1);
System.out.println(element1.getObjectValue());
// 删除元素
cache.remove("key1");
People people=new People(1,"张三","test");
Element p1=new Element("test",people);
cache.put(p1);
// 获取缓存的信息
Element element2 = cache.get("test");
System.out.println(element2);
// 刷新缓存
cache.flush();
// 关闭缓存管理器
cacheManager.shutdown();
}
SpringBootはEhcacheを統合します
- 依存関係を導入する
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- Ehache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.5</version>
</dependency>
- スタートアップクラスは、キャッシュを開くための注釈を追加します
@SpringBootApplication
@EnableCaching
@MapperScan("com.li.mapper")
public class TestProjectApplication {
public static void main(String[] args) {
SpringApplication.run(TestProjectApplication.class);
}
}
- Applicaiton.properties
# ehcache配置地址
spring.cache.ehcache.config=ehcache.xml
- ehache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<!-- 磁盘缓存位置 -->
<diskStore path="java.io.tmpdir/ehcache"/>
<!-- 默认缓存 -->
<defaultCache
maxEntriesLocalHeap="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- HellowWorld 缓存-->
<cache name="helloworld"
maxEntriesLocalHeap="1000"
eternal="false"
timeToIdleSeconds="5"
timeToLiveSeconds="5"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
- テスト例
@RequestMapping("/ehcache/{key}")
@Cacheable(value = "helloworld",key = "#key",cacheManager = "ehacheCacheManager")
public String test4(@PathVariable("key") String key){
logger.info("ehcahce,key={}",key);
return key;
}
@RequestMapping("/default/{key}")
@Cacheable(value = "default",key="#key")
public String cacheDefaultTest(@PathVariable("key") String key) {
logger.info("default,key={}", key);
return "24";
}
マルチキャッシュ構成
- キャッシュ構成クラス:RedissonとEhacheを使用して個別に構成します。
@Configuration
public class CatchConfig {
private static final Logger logger= LoggerFactory.getLogger(CatchConfig.class);
@Autowired
RedissonClient client;
@Bean("redissonCacherManager")
@Primary
public RedissonSpringCacheManager redissonSpringCacheManager(){
RedissonSpringCacheManager cacheManager = new RedissonSpringCacheManager(client);
logger.info("===========================RedissonSpringCacheManager配置");
return cacheManager;
}
@Bean("ehacheCacheManager")
public EhCacheCacheManager ehCacheCacheManager(){
logger.info("===========================EhCacheCacheManager配置");
return new EhCacheCacheManager();
}
}
- 使用例
@RequestMapping("/ehcache/{key}")
@Cacheable(value = "helloworld",key = "#key",cacheManager = "ehacheCacheManager")
public String test4(@PathVariable("key") String key){
logger.info("ehcahce,key={}",key);
return key;
}
春のキャッシュ注釈
- @Cacheable
メソッドまたはクラスにマークを付けることができます。メソッドにマークを付けると、メソッドがキャッシュをサポートすることを意味します。クラスにマークを付けると、そのクラスのすべてのメソッドがキャッシングをサポートすることを意味します。キャッシングをサポートするメソッドの場合、Springは呼び出された後に戻り値をキャッシュして、次に同じパラメーターを使用してメソッドを実行したときに、メソッドを再度実行しなくても結果をキャッシュから直接取得できるようにします。一般的なパラメータは次のとおりです。
パラメータ | 意義 |
---|---|
値、cacheNames | 構成ファイルで定義されているキャッシュの名前には、少なくとも1つを指定する必要があります。 |
キー | キャッシュされたキー、空にすることができます |
cacheManager | キャッシュモード、プロジェクトは複数のキャッシュモードを構成できます |
- @CachePut
いずれにせよ、メソッドの戻り結果をキャッシュに入れてください。この注釈は、キャッシュされたデータがあるかどうかを尋ねませんが、毎回メソッドを実行し、メソッドの戻り結果をキャッシュに入れます。これは、毎回キャッシュ内のデータを更新するのと同じであり、キャッシュ内のデータは毎回最新です。データを1回キャッシュします。
- @CacheEvict
@CacheEvictは、キャッシュ要素をクリアする必要があるメソッドまたはクラスをマークするために使用されます。クラスでマークされている場合、そのクラス内のすべてのメソッドを実行すると、キャッシュのクリア操作がトリガーされることを意味します。
- @キャッシング
この注釈は、複数の注釈を組み合わせてカスタム注釈を実現できます。
キャッシュは、実際には、注釈の値ではなく、キーの値としてのkeyメソッドの戻り値として注釈のキーを格納します。