SpringBoot が Redis をカスタマイズしてキャッシュのシリアル化を実装する方法
1. カスタマイズされた RedisTemplate
1.1. Redis API のデフォルトのシリアル化メカニズム
API ベースの Redis キャッシュ実装は、データ キャッシュ操作に RedisTemplate テンプレートを使用します。ソースを表示するには、ここで RedisTemplate クラスを開いてください。このクラスのコード情報
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware { // 声明了key、value的各种序列化方式,初始值为空 @Nullable private RedisSerializer keySerializer = null; @Nullable private RedisSerializer valueSerializer = null; @Nullable private RedisSerializer hashKeySerializer = null; @Nullable private RedisSerializer hashValueSerializer = null; ... // 进行默认序列化方式设置,设置为JDK序列化方式 public void afterPropertiesSet() { super.afterPropertiesSet(); boolean defaultUsed = false; if (this.defaultSerializer == null) { this.defaultSerializer = new JdkSerializationRedisSerializer( this.classLoader != null ? this.classLoader : this.getClass().getClassLoader()); } ... } ... }
上記のRedisTemplateコアのソースコードからわかるように、キャッシュされたデータのキーと値のさまざまなシリアル化メソッドがRedisTemplate内で宣言されており、初期値は空です。 afterPropertiesSet() メソッド、デフォルトのシリアル化パラメーターdefaultSerializer が空かどうかを確認、データのデフォルトのシリアル化メソッドを JdkSerializationRedisSerializer に設定します
上記のソース コード情報の分析によれば、次の 2 つの重要な結論を引き出すことができます。 :
(1) Redis データ キャッシュ操作に RedisTemplate を使用する場合、内部のデフォルトのシリアル化メソッドは JdkSerializationRedisSerializer であるため、データ キャッシュ用のエンティティ クラスは JDK 独自のシリアル化インターフェイス (Serializable など) を実装する必要があります。
( 2) RedisTemplate を使用して Redis データ キャッシュ操作を実行する場合、キャッシュのシリアル化メソッド defaultSerializer がカスタマイズされている場合は、カスタマイズされたシリアル化メソッドが使用されます。 さらに、RedisTemplate クラスのソース コードでは、キャッシュされたデータのキーと値のさまざまなシリアル化タイプが RedisSerializer として表示されます。 RedisSerializer のソース コードを入力して、RedisSerializer でサポートされているシリアル化メソッドを表示します (クラスを入力した後、Ctrl Alt を使用してクラス名を左クリックして表示します)。 RedisSerializer が Redis であることがわかりました。シリアル化インターフェイスにはデフォルトで 6 つの実装クラスがあり、これら 6 つの実装クラスは 6 つの異なるデータ シリアル化メソッドを表します。その中で、JdkSerializationRedisSerializer は JDK に付属しており、RedisTemplate 内で使用されるデフォルトのデータシリアル化メソッドでもあり、開発者は必要に応じて、サポートされている他のシリアル化メソッド (JSON メソッドなど) を選択できます。Redis の依存関係をプロジェクトに導入すると、Spring Boot によって提供される RedisAutoConfiguration 自動構成が有効になります。 RedisAutoConfiguration クラスを開き、内部ソース コードで RedisTemplate の定義を表示します。
public class RedisAutoConfiguration { @Bean @ConditionalOnMissingBean( name = {"redisTemplate"} ) public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException { RedisTemplate<Object, Object> template = new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); return template; } ... }
上記の RedisAutoConfiguration コア ソース コードからわかるように、Redis 自動構成クラスでは、RedisTemplate が Redis 接続ファクトリを通じて初期化されます。 RedisConnectionFactory; クラスの上 @ConditionalOnMissingBean アノテーション (名前が示すように、Bean が存在しない場合に有効になります) は、開発者が redisTemplate という名前の Bean をカスタマイズする場合、デフォルトで初期化された RedisTemplate が有効にならないことを示すために追加されます。
@Configuration
public class RedisConfig {
// 自定义RedisTemplate
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 创建一个JSON格式序列化对象,对缓存数据的key和value进行转换
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// 解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 设置RedisTemplate模板api序列化方式为json
template.setDefaultSerializer(jackson2JsonRedisSerializer);
return template;
}
}
ログイン後にコピー
は RedisConfig を定義します@Configuration アノテーションを通じて構成クラスを取得し、@Bean アノテーションを使用してメソッド名のデフォルト名を持つ redisTemplate コンポーネントを注入します (Bean コンポーネント名は redisTemplate である必要があることに注意してください)。定義された Bean コンポーネントでは、カスタマイズされた Jackson2JsonRedisSerializer データシリアル化メソッドを使用して RedisTemplate がカスタマイズされます。カスタマイズされたシリアル化メソッドでは、データ変換設定用に ObjectMapper が定義されます1.3、効果テスト #findById() メソッドを実行すると、ユーザー コメント情報 Comment が正しくクエリされ、同じクエリ操作が繰り返されることがわかります。データベースは SQL ステートメントを 1 回だけ実行します。これは、カスタマイズが Redis によって行われたことを示しています。キャッシュが有効になります。 Redis クライアントのビジュアル管理ツール Redis Desktop Manager を使用して、キャッシュされたデータを表示します。 @Configuration public class RedisConfig { // 自定义RedisTemplate @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 创建一个JSON格式序列化对象,对缓存数据的key和value进行转换 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); // 解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 设置RedisTemplate模板api序列化方式为json template.setDefaultSerializer(jackson2JsonRedisSerializer); return template; } }
findById() メソッドを実行して、ユーザーのコメント情報をクエリし、コメントは Redis に正しく保存されています。キャッシュ ライブラリには、Redis サービスにキャッシュされたデータが JSON 形式で保存および表示されており、カスタマイズされた Redis API テンプレート ツール RedisTemplate が有効であることを示す表示と管理も非常に便利です。
API ベースの RedisTemplate のカスタム シリアル化メソッドを改良し、データをキャッシュするための JSON シリアル化メソッドを実現しましたが、このカスタム RedisTemplate は、アノテーションベースの Redis キャッシュ。 次に、アノテーションベースの Redis キャッシュメカニズムとカスタムシリアル化メソッドについて説明します
2.1. Redis アノテーションのデフォルトのシリアル化メカニズム
Open Spring Boot で Redis コンポーネントを統合します。キャッシュ自動構成クラス RedisCacheConfiguration (org.springframework.boot.autoconfigure.cache パッケージの下) で、このクラスのソース コード情報を表示します。そのコア コードは次のとおりです。
@Configuration class RedisCacheConfiguration { @Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) { RedisCacheManagerBuilder builder = RedisCacheManager .builder(redisConnectionFactory) .cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader())); List<String> cacheNames = this.cacheProperties.getCacheNames(); if (!cacheNames.isEmpty()) { builder.initialCacheNames(new LinkedHashSet(cacheNames)); } return (RedisCacheManager) this.customizerInvoker.customize(builder.build()); } private org.springframework.data.redis.cache.RedisCacheConfiguration determineConfiguration(ClassLoader classLoader) { if (this.redisCacheConfiguration != null) { return this.redisCacheConfiguration; } else { Redis redisProperties = this.cacheProperties.getRedis(); org.springframework.data.redis.cache.RedisCacheConfiguration config = org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig(); config = config.serializeValuesWith(SerializationPair.fromSerializer( new JdkSerializationRedisSerializer(classLoader))); ... return config; } } }
从上述核心源码中可以看出,同RedisTemplate核心源码类似,RedisCacheConfiguration内部同样通过Redis连接工厂RedisConnectionFactory定义了一个缓存管理器RedisCacheManager;同时定制RedisCacheManager时,也默认使用了JdkSerializationRedisSerializer序列化方式。
如果想要使用自定义序列化方式的RedisCacheManager进行数据缓存操作,可以参考上述核心代码创建一个名为cacheManager的Bean组件,并在该组件中设置对应的序列化方式即可
在Spring Boot 2.X版本中,RedisCacheManager是独立构建的。因此,在SpringBoot 2.X版本中,对RedisTemplate进行自定义序列化机制构建后,仍然无法对RedisCacheManager内部默认序列化机制进行覆盖(这也就解释了基 于注解的Redis缓存实现仍然会使用JDK默认序列化机制的原因),想要基于注解的Redis缓存实现也使用自定义序列化机制,需要自定义RedisCacheManager
2.2、自定义RedisCacheManager
在项目的Redis配置类RedisConfig中,按照上一步分析的定制方法自定义名为cacheManager的Bean组件
@Bean public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // 分别创建String和JSON格式序列化对象,对缓存数据key和value进行转换 RedisSerializer<String> strSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jacksonSerial = new Jackson2JsonRedisSerializer(Object.class); // 解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); // 上面注释过时代码的替代方法 jacksonSerial.setObjectMapper(om); // 定制缓存数据序列化方式及时效 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofDays(1)) // 设置缓存数据的时效(设置为了1天) .serializeKeysWith(RedisSerializationContext.SerializationPair .fromSerializer(strSerializer)) // 对当前对象的key使用strSerializer这个序列化对象,进行转换 .serializeValuesWith(RedisSerializationContext.SerializationPair .fromSerializer(jacksonSerial)) // 对value使用jacksonSerial这个序列化对象,进行转换 .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager .builder(redisConnectionFactory).cacheDefaults(config).build(); return cacheManager; }
上述代码中,在RedisConfig配置类中使用@Bean注解注入了一个默认名称为方法名的cacheManager组件。在定义的Bean组件中,通过RedisCacheConfiguration对缓存数据的key和value分别进行了序列化方式的定制,其中缓存数据的key定制为StringRedisSerializer(即String格式),而value定制为了Jackson2JsonRedisSerializer(即JSON格式),同时还使用entryTtl(Duration.ofDays(1))方法将缓存数据有效期设置为1天
完成基于注解的Redis缓存管理器RedisCacheManager定制后,可以对该缓存管理器的效果进行测试(使用自定义序列化机制的RedisCacheManager测试时,实体类可以不用实现序列化接口)
以上がSpringBoot が Redis をカスタマイズしてキャッシュのシリアル化を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redis-Serverが見つからない問題を解決するための手順:インストールを確認して、Redisが正しくインストールされていることを確認します。環境変数Redis_hostとredis_portを設定します。 Redis Server Redis-Serverを起動します。サーバーがRedis-Cli pingを実行しているかどうかを確認します。

Redis Clusterは、Redisインスタンスの水平拡張を可能にする分散展開モデルであり、ノード間通信、ハッシュスロット部門キースペース、ノード選挙、マスター奴隷レプリケーション、コマンドリダイレクトを通じて実装されます。ハッシュスロット:キースペースをハッシュスロットに分割して、キーの責任ノードを決定します。ノード選挙:少なくとも3つのマスターノードが必要であり、選挙メカニズムを通じて1つのアクティブマスターノードのみが保証されます。マスタースレーブレプリケーション:マスターノードはリクエストの書き込みを担当し、スレーブノードはリクエストとデータレプリケーションを読む責任があります。コマンドリダイレクト:クライアントはキーを担当するノードに接続し、ノードは誤ったリクエストをリダイレクトします。トラブルシューティング:障害検出、オフラインのマーク、および再

Redisバージョン番号を表示するには、次の3つの方法を使用できます。(1)情報コマンドを入力し、(2) - versionオプションでサーバーを起動し、(3)構成ファイルを表示します。

Redisは、キーの一意性を確保するために5つの戦略を使用します。1。名前空間分離。 2。ハッシュデータ構造。 3.データ構造を設定します。 4。文字列キーの特殊文字。 5。LUAスクリプト検証。特定の戦略の選択は、データ組織、パフォーマンス、およびスケーラビリティ要件に依存します。

Redisのすべてのキーを表示するには、3つの方法があります。キーコマンドを使用して、指定されたパターンに一致するすべてのキーを返します。スキャンコマンドを使用してキーを繰り返し、キーのセットを返します。情報コマンドを使用して、キーの総数を取得します。

Redis Orderedセット(ZSET)は、並べ替えられた要素を保存し、関連するスコアでソートするために使用されます。 zsetを使用する手順には次のものがあります。1。zsetを作成します。 2。メンバーを追加します。 3.メンバースコアを取得します。 4。ランキングを取得します。 5.ランキング範囲のメンバーを取得します。 6.メンバーを削除します。 7.要素の数を取得します。 8。スコア範囲のメンバーの数を取得します。
