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 getRedisTemplate(
            final RedisConnectionFactory connectionFactory
    )
    {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        //          
        redisTemplate.setDefaultSerializer(getGenericJackson2JsonRedisSerializer());
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //    Key         
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        return 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
著作権宣言:
本文は博主のオリジナル文章です.転載する時に必ず博文の出所を明記してください.