Spring BootプロジェクトでRedis Template.delete()を使用して指定keyを削除することに失敗した解決方法
問題の概要
この問題についてですか?それとも主にプロジェクト開発の管理上に現れていますか?
1、Javaで使うJDK-1.8
2、Spring Bootで使うSpring Boot-2.3.3
3、Redisは2.0.8を使用しています.
4、Jedisは2.9.0を使用しています.
(もちろん他は説明しません.)
最初は、元のReids Template APIを使ってシステムキャッシュの管理を行います.その後、オブジェクト関連の操作に関連しているので、この時点では、元のAPIを使用すると、キャッシュのオブジェクトは、混雑しているので、目まぐるしいです.これは、カスタムの順序付けメカニズムが必要です.
もちろん、システムキャッシュの管理と操作の中で、ブロガーは相変わらずRedisTemplate原生のAPIを淡々と使用しています.そしてある日前、テストチームのところで突然鍋が破裂しました.様々な問題があります.
現象:Redisの元のAPIを通じてキャッシュの中のKeyを削除した後、システムは何のエラー情報もなく、削除成功を提示して、Redisサーバに行って削除すべきKeyが依然として存在していることを確認します.
解決策
一連の辛いBUGの検査を経て、各種の姿勢を加えてRedisのソースコードを調べて、やっと問題を解決しました.Redisのソースコードは以下の通りです.
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (this.defaultSerializer == null) {
this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
}
if (this.enableDefaultSerializer) {
if (this.keySerializer == null) {
this.keySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.valueSerializer == null) {
this.valueSerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashKeySerializer == null) {
this.hashKeySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashValueSerializer == null) {
this.hashValueSerializer = this.defaultSerializer;
defaultUsed = true;
}
}
if (this.enableDefaultSerializer && defaultUsed) {
Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
}
if (this.scriptExecutor == null) {
this.scriptExecutor = new DefaultScriptExecutor(this);
}
this.initialized = true;
}
《Redisソースの住所》 》 Redisのデフォルトのプログレッシブメカニズムに注目してください. default Serializerは、カスタマイズされたプログレッシブ機構がない場合、システムがデフォルトで使用するのは「default Serializer」です. org.sprigframe ewark.data.redis.serializer.JdkSerialization Redis Serializer」という古い鉄があり、またシステムの中で黙々とRedisのプログレッシブ機構をカスタマイズしました.一部のコードは以下の通りです.
package com.btc.common.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
@EnableCaching
public class RedisConfig
extends CachingConfigurerSupport
{
@Bean
public CacheManager cacheManager(final RedisConnectionFactory redisConnectionFactory)
{
RedisCacheManager.RedisCacheManagerBuilder builder
= RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory);
return builder.build();
}
@Bean(name = "springSessionDefaultRedisSerializer")
public GenericJackson2JsonRedisSerializer getGenericJackson2JsonRedisSerializer()
{
return new GenericJackson2JsonRedisSerializer();
}
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate
このコードでは、需要に応じてRedis Keyのプログレッシブ機構を「 org.sprigframe ework.data.redis.serializer.StrigRedis Serializer」(主な目的は文字化けを避けるために、実際には正常に使用できます.ただ、私達は肉眼で文字化けを見ました.)そしてredisTemplate 一般的なタイプのために定義します.ここが問題です.この時は原生を使ってはいけません. 「 RedisTemplate redisTemplate」は、一般的な「 RedisTemplate redisTemplate」は、私達が再度追加したkeyの時に、「StringRedisSerializer」プログレッシブ方式を使用していますが、delete操作時には元のAPIを使用しています.redis中のredisTemplateのデフォルトプログレッシブシステムは「JdSerizar Serizar Serise Serizar」です.このようにしてから、hasKey方法を使っても、redisにはこのkeyが存在しますが、実際にはhasKeyがfalseに戻ってきますので、削除は成功しましたが、実際のデータは依然としてRedisサーバに存在します.
はい、わかりました Spring BootプロジェクトではRedis Template.delete()を使って指定keyの削除に成功しましたが、Redisでは削除されていない解決策です. ここまで書きます.他に何か質問がありましたら、コードをスキャンして質問してもいいです.メッセージをください.詳しく答えます. 「共同学習、共同進歩」もCSNDのITコミュニティに注目してほしいです.
作成 者:
華 子?児
連絡先:
[email protected]
来ます ソース:
CSDN(Chinese Software Developer Network)
オリジナル テキスト:
https://blog.csdn.net/Hello_World_QWP/article/details/85763286
著作権宣言:
本文は博主のオリジナル文章です.転載する時に必ず博文の出所を明記してください.