キャッシュ
私たちは頻繁に行くデータベースにアクセスする場合は、同時システムアップの量は、及び、その後、圧力がデータベースを増加し続ける場合は、データベースがクラッシュし、ピーク現象でさえも発生する可能性があります。だから、一般的に、私たちはそこにデータベースからの照会がなくなった場合に返さない、そして最終的にキャッシュに追加して、ユーザーに返された場合、それは、クエリキャッシュで始まります、で来て、データベースへの同時アクセスをこの問題を解決するために、ユーザーのアクセスをキャッシュを使用しますもちろん、あなたは、検索機能を提供するためにキャッシュを使用することができます。
キャッシュは、我々は一般的にローカルキャッシュと分散キャッシュに分けることができます。
私たちは、一般的にehcacheを使用しながら、一般的に使用されるローカルキャッシュは、グアバキャッシュ、ehcacheをを持っている、すべての後、彼は純粋なJavaのある、我々は機能を拡張するためにソースコードを解決し、また自身の二次開発という問題があります。
一般コースのキャッシングを分散、のRedis、Redisのは効率が非常に高く、メモリーベースとシングルスレッドです。
二、春キャッシュ
私は非常に便利で、また、注釈の使用に基づくことができる、それが複数のキャッシングフレームワーク(ehcacheを、JCacheのなど)を統合するだけでなく、プロジェクトにキャッシュを統合したい場合は、私たちは春のキャッシュを使用すると確信しています。
:春コンテキスト・サポートにおける統合キャッシングフレームワーク
春-文脈でのキャッシュ注釈:
もちろん、ないのRedisの春のコンテキスト内で統合が、我々は春・データ・Redisのを見つけることができます。
しかし、我々はすべて知っている、それは春や春ブーツプロジェクトであるかどうか、我々は、キャッシュは同時に複数の統合できませんキャッシュのすべてを統合することができます。
春ブーツでは、我々は通常使用しspring.cache.type
、使用するキャッシュを指定し、[自動設定を完了するために、関連する構成情報を入力します。
CacheTypeソース:我々が見ることができ、春には、フレームワークをキャッシュの多種多様なサポートしています。
package org.springframework.boot.autoconfigure.cache;
public enum CacheType {
GENERIC,
JCACHE,
EHCACHE,
HAZELCAST,
INFINISPAN,
COUCHBASE,
REDIS,
CAFFEINE,
SIMPLE,
NONE;
private CacheType() {
}
}
だから我々はちょうど両方のキャッシングフレームワークを統合するような必要がある場合:例えば、ローカルキャッシュEhcacheの、分散キャッシュのRedis、
全体は、それができることを?
あなたのことができるかもしれないが、この春、マルチレベルのキャッシュを提供していますが、全体に自分を必要としません。
三、h2cacheスプリング・ブートスターター
1. h2cacheスプリング・ブート・スターターは何ですか?
マイクロサービスでは、各サービスはステートレス、サービス間の通信にRPCまたはHTTPを経由する必要があることです。そして、各サービスは、サービスAの必要性は、テーブルサービスBにデータを取得する場合、あなたはHTTPまたはRPC通信を必要とするようにすることを、そして必要性のピークは、毎秒100回を呼び出すことがあれば、それがあることを意味するであろうことを、自身の対応するデータベースを持っていますこれは、100 HTTP通信やRPC、かなりの時間がかかるのプロパティであるインターフェースが必要です。
次に、どのようにそれを解決するには?
しかし、高トラフィックのサービスもちろん、まだローカルキャッシュを必要とするのが、この時、私たちは、Redisのように、分散キャッシュを必要とするように、異なるサービスは、通常、上記の別のマシンに配備されているので、それは、確かにローカルキャッシュではありません。最後に、私たちは、ローカルキャッシュが、また、分散キャッシュだけでなく必要がありますが、自分自身を統合する必要があるので、春ブーツは、そのようなマルチレベルのキャッシュ機能を提供していませんでした。
私はすでにされて全体の春ブーツスターター、所有し、心配しないで h2cache-spring-boot-starter
、我々は唯一の設定ファイルに対応する情報を設定する必要がありますが、あなたはマルチレベル・キャッシュの機能を有効にすることができます。
2、開始
依存性を追加します。
頼りにすることができ、私は〜のMavenの中央リポジトリにこのアイテムを掲載しているので、我々は、通常の下に導入しました
<denpency>
<groupId>com.github.howinfun</groupId>
<artifactId>h2cache-spring-boot-starter</artifactId>
<version>0.0.1</version>
</denpency>
春ブーツのプロパティでサービスを有効にすると、対応する設定を追加します。
オープンマルチレベルキャッシュサービス:
# Enable L2 cache or not
h2cache.enabled=true
設定Ehcacheの:
# Ehcache Config
## the path of ehcache.xml (We can put it directly under Resources)
h2cache.ehcache.filePath=ehcache.xml
#Set whether the EhCache CacheManager should be shared (as a singleton at the ClassLoader level) or independent (typically local within the application).Default is "false", creating an independent local instance.
h2cache.ehcache.shared=true
コンフィギュレーションのRedis:デフォルトのキャッシュ設定とカスタムキャッシュ構成を含みます
ノートへのポイントは以下のとおりです。h2cacheスプリング・ブート・スターター導入しながらLettuce
とJedis
クライアント、およびデフォルトを使用してクライアントレタス春ブーツ、我々はJedisクライアントを使用する必要がある場合ので、あなたはレタスが削除頼りにする必要があります。
# Redis Config
## default Config (expire)
h2cache.redis.default-config.ttl=200
### Disable caching {@literal null} values.Default is "false"
h2cache.redis.default-config.disable-null-values=true
### Disable using cache key prefixes.Default is "true"
h2cache.redis.default-config.use-prefix=true
## Custom Config list
### cacheName -> @CacheConfig#cacheNames @Cacheable#cacheNames and other comments, etc
h2cache.redis.config-list[0].cache-name=userCache
h2cache.redis.config-list[0].ttl=60
h2cache.redis.config-list[0].use-prefix=true
h2cache.redis.config-list[0].disable-null-values=true
h2cache.redis.config-list[1].cache-name=bookCache
h2cache.redis.config-list[1].ttl=60
h2cache.redis.config-list[1].use-prefix=true
#Redis
spring.redis.host=10.111.0.111
spring.redis.password=
spring.redis.port=6379
spring.redis.database=15
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=30
キャッシュ注釈を使用する方法
限り、我々がそうであるようにする前に使用してSpring Cache
注釈をすることができます。
例えば:
永続化層のコードは、私の使用である:MyBatisの-PLUS。
package com.hyf.testDemo.redis;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Repository;
/**
* @author Howinfun
* @desc
* @date 2020/3/25
*/
@Repository
// Global cache config,We usually set the cacheName
@CacheConfig(cacheNames = {"userCache"})
public interface UserMapper extends BaseMapper<User> {
/**
* put the data to cache(Ehcache & Redis)
* @param id
* @return
*/
@Cacheable(key = "#id",unless = "#result == null")
User selectById(Long id);
/**
* put the data to cache After method execution
* @param user
* @return
*/
@CachePut(key = "#user.id", condition = "#user.name != null and #user.name != ''")
default User insert0(User user) {
this.insert(user);
return user;
}
/**
* evict the data from cache
* @param id
* @return
*/
@CacheEvict(key = "#id")
int deleteById(Long id);
/**
* Using cache annotations in combination
* @param user
* @return
*/
@Caching(
evict = {@CacheEvict(key = "#user.id", beforeInvocation = true)},
put = {@CachePut(key = "#user.id")}
)
default User updateUser0(User user){
this.updateById(user);
return user;
}
}
テスト:
クエリ:私たちは、データベースクエリの結果に、データに追加されることがわかりますEhcache
し、Redis
キャッシュ;すべては、開始後にお問い合わせになるEhcache
か、Redis
クエリで。
2020-04-03 09:55:09.691 INFO 5920 --- [nio-8080-exec-7] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2020-04-03 09:55:10.044 INFO 5920 --- [nio-8080-exec-7] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2020-04-03 09:55:10.051 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById : ==> Preparing: SELECT id,create_time,update_time,read_frequency,version,book_name FROM book WHERE id=?
2020-04-03 09:55:10.068 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById : ==> Parameters: 51(Long)
2020-04-03 09:55:10.107 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById : <== Total: 1
2020-04-03 09:55:10.113 INFO 5920 --- [nio-8080-exec-7] c.hyf.cache.cachetemplate.H2CacheCache : insert into ehcache,key:51,value:Book2(id=51, bookName=微服务架构, readFrequency=1, createTime=2020-03-20T16:10:13, updateTime=2020-03-27T09:14:44, version=1)
2020-04-03 09:55:10.118 INFO 5920 --- [nio-8080-exec-7] c.hyf.cache.cachetemplate.H2CacheCache : insert into redis,key:51,value:Book2(id=51, bookName=微服务架构, readFrequency=1, createTime=2020-03-20T16:10:13, updateTime=2020-03-27T09:14:44, version=1)
2020-04-03 09:55:31.864 INFO 5920 --- [nio-8080-exec-2] c.hyf.cache.cachetemplate.H2CacheCache : select from ehcache,key:51
削除:データベース内のデータを削除すると、それは削除されますEhcache
とRedis
、対応するキャッシュデータ。
2020-04-03 10:05:18.704 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById : ==> Preparing: DELETE FROM book WHERE id=?
2020-04-03 10:05:18.704 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById : ==> Parameters: 51(Long)
2020-04-03 10:05:18.731 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById : <== Updates: 1
2020-04-03 10:05:18.732 INFO 5920 --- [nio-8080-exec-3] c.hyf.cache.cachetemplate.H2CacheCache : delete from ehcache,key:51
2020-04-03 10:05:18.844 INFO 5920 --- [nio-8080-exec-3] c.hyf.cache.cachetemplate.H2CacheCache : delete from redis,key:51
他の人が実証していません...
第四に、そして最終的に
、あなたが行くと、ソースコードが春キャッシュマルチレベルのキャッシュに基づいてどのように見ることができますしている興味があればもちろん、このスターターは〜、非常に簡単です