次に、Springが提供するキャッシュテクノロジーを使用して、Redisキャッシュの使用を実装します。使用する前に、キャッシュの2つのモード(読み取りモードと書き込みモード)を理解する必要があります。
読み取りモードは、データの読み取り方法です。キャッシュ内のデータベースにクエリがない場合、データは次の使用のためにキャッシュ内で検出されます。
書き込みモードではデータをキャッシュに保存しますが、書き込みモードではデータを維持する必要があります。キャッシュとデータベースのデータの一貫性、使用することができ、二重書き込みモードまたは故障モード
デュアル書き込みモードでは、我々は、データベース内の特定のデータを変更すると、古いデータが上書きされ、キャッシュに変更されたデータを更新されることがある
の故障モード変更されたデータの場合と同じように、現在のデータが配置されているすべてのキャッシュをクリアし、データベースに直接移動
して次のクエリで最新のデータをクエリします。もちろん、以前の使用では、これらのコードは重複しているため、Springキャッシュ用に特別に抽出された抽象化レイヤー:Spring cache; Springバージョン3.1は、orgspringframework.cache.Cacheおよびorgspringframework.cache.CacheManagerインターフェースを定義して、さまざまなキャッシュテクノロジーを統合し、JCacheアノテーションをサポートして開発、操作を簡素化します。公式ドキュメント(..ポータル)
へ次へSringCacheの使用を開始します
1. jarパッケージをインポートし、インポートするためにキャッシュとして使用する必要があるものに注意してください。たとえば、例としてredisを使用します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.構成を記述します。Redisキャッシュを使用しているため、最初にRedis関連を構成する必要があります。
spring:
redis:
host: 192.168.0.109
cache:
type: redis # 指定缓存的类型
redis:
time-to-live: 3600000 # 过期时间,单位毫秒
key-prefix: cache_ # key的前缀
use-key-prefix: true # 是否使用前缀
cache-null-values: true # 是否缓存空值,防止缓存穿透
3.最初にハルビンキャッシュの注釈を理解します
- @Cacheable:データをキャッシュに保存する操作をトリガーします
- @CacheEvict:キャッシュからデータを削除する操作をトリガーします
- @CachePut:メソッドの実行に影響を与えずにキャッシュを更新します
- @Caching:複数のキャッシュ操作を組み合わせる
- @CacheConfig:クラスレベルでキャッシュの同じ構成を共有します
4.キャッシュ構成クラスをカスタマイズし、@ EnableCachingアノテーションを使用してキャッシュを有効にします
import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.boot.autoconfigure.cache.CacheProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@EnableCaching // 开启缓存
@Configuration
@EnableConfigurationProperties(CacheProperties.class)//绑定属性配置
public class MyCacheConfig {
@Bean
public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) {
CacheProperties.Redis redisProperties = cacheProperties.getRedis();
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
//key的序列化方式
config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()));
//value的序列化方式
config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer()));
//过期时间
if (redisProperties.getTimeToLive() != null) {
config = config.entryTtl(redisProperties.getTimeToLive());
}
//key前缀
if (redisProperties.getKeyPrefix() != null) {
config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());
}
//是否缓存空值
if (!redisProperties.isCacheNullValues()) {
config = config.disableCachingNullValues();
}
//是否使用前缀
if (!redisProperties.isUseKeyPrefix()) {
config = config.disableKeyPrefix();
}
return config;
}
}
5.テストを開始します。テストでは、最初にキャッシュにデータがない場合はクエリデータベースが実行され、2回目にキャッシュにデータがある場合は、クエリを実行せずにキャッシュ内のデータが直接返されます。データベース
@Override
@Cacheable(value = RedisKeyUtils.catalogKey)//指定key
public List<CategoryEntity> getCatalogJsonWithRedisson() {
List<CategoryEntity> categoryEntities = listWithTree();
return categoryEntities;
}