亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot使用RedisTemplate.delete刪除指定key失敗的解決辦法

 更新時(shí)間:2022年03月23日 15:41:56   投稿:zx  
本文主要介紹了SpringBoot使用RedisTemplate.delete刪除指定key失敗的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

問(wèn)題概述

關(guān)于這個(gè)問(wèn)題呢,還是主要出現(xiàn)在項(xiàng)目開(kāi)發(fā)的管理上面,先描述哈項(xiàng)目環(huán)境:

1、Java 使用的 JDK-1.8

2、Spring Boot 使用的 Spring Boot-2.0.3

3、Redis 使用的是 2.0.8

4、Jedis 使用的是 2.9.0

(當(dāng)然其它就不再描述了)

起先,使用的都是原生的 ReidsTemplate API 進(jìn)行系統(tǒng)緩存的管理工作。后來(lái),由于涉及到對(duì)象相關(guān)的操作,此時(shí)如果還使用原生API,緩存中的對(duì)象是一坨亂碼,讓人眼花繚亂,這是就需要自定義序列化機(jī)制了,而那位同事就默默的添加上了,在團(tuán)隊(duì)中沒(méi)有任何的反饋。

當(dāng)然,在系統(tǒng)緩存的管理與操作中,博主依然淡定的使用著 RedisTemplate 原生的 API 呢,然后在某天前,測(cè)試團(tuán)隊(duì)那邊突然就炸開(kāi)了鍋,各種問(wèn)題。。。

現(xiàn)象:通過(guò) Redis 的原生 API 刪除緩存中的 Key 后,系統(tǒng)無(wú)任何的報(bào)錯(cuò)信息,并提示刪除成功,再進(jìn)入到 Redis 服務(wù)器上查看應(yīng)該被刪除的 Key 依然存在,懵逼了?。。?/p>

解決辦法

經(jīng)過(guò)一段艱辛的 BUG 排查,再加上各種姿勢(shì)查看 Redis 源碼,終于把問(wèn)題給解決了,貼上一段 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 的默認(rèn)序列化機(jī)制 “ defaultSerializer ” ,如果沒(méi)有自定義的序列化機(jī)制,則系統(tǒng)默認(rèn)使用的是 “ org.springframework.data.redis.serializer.JdkSerializationRedisSerializer ” ,然后有老鐵又再系統(tǒng)中默默的自定義了 Redis 的序列化機(jī)制,部分示例代碼如下:

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<Object, Object> getRedisTemplate(
            final RedisConnectionFactory connectionFactory
    )
    {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        // 配置默認(rèn)的序列化器
        redisTemplate.setDefaultSerializer(getGenericJackson2JsonRedisSerializer());
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 設(shè)置 Key 的默認(rèn)序列化機(jī)制
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        return redisTemplate;
    }
}

在這段代碼中,根據(jù)需求將 Redis Key 的序列化機(jī)制更改為了 “ org.springframework.data.redis.serializer.StringRedisSerializer ” (主要目的為避免出現(xiàn)亂碼的象限,其實(shí)還是能正常的的使用,只是我們?nèi)庋劭吹綖閬y碼而已),并且將 redisTemplate 定義為了類(lèi)型為泛型的類(lèi)型。

這兒就是問(wèn)題的所在,此時(shí)就不能使用原生的 “ RedisTemplate redisTemplate; ” 而需要定義為泛型的 “ RedisTemplate <Object,Object> redisTemplate; ” 了,因?yàn)楫?dāng)我們?cè)俅涡略龅?key 的時(shí)候,使用的是 “ StringRedisSerializer ”序列化機(jī)制,但是在 delete 操作的時(shí)候是使用的是原生 API ,redis 中的 redisTemplate 默認(rèn)序列化機(jī)制采用的是 “ JdkSerializationRedisSerializer ”,這樣以來(lái),即使你使用 hasKey 方法也會(huì)發(fā)現(xiàn) redis 中存在這個(gè) key ,但是實(shí)際 hasKey 返回 false,所以就會(huì)出現(xiàn)刪除成功,但是實(shí)際的數(shù)據(jù)依然存在 Redis 服務(wù)器上咯。

到此這篇關(guān)于SpringBoot使用RedisTemplate.delete刪除指定key失敗的解決辦法的文章就介紹到這了,更多相關(guān)SpringBoot RedisTemplate.delete刪除指定key內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javaweb servlet中使用請(qǐng)求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)

    javaweb servlet中使用請(qǐng)求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇javaweb servlet中使用請(qǐng)求轉(zhuǎn)發(fā)亂碼的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • java.lang.StackOverflowError出現(xiàn)的原因及解決

    java.lang.StackOverflowError出現(xiàn)的原因及解決

    這篇文章主要介紹了java.lang.StackOverflowError出現(xiàn)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Java String創(chuàng)建對(duì)象實(shí)例解析

    Java String創(chuàng)建對(duì)象實(shí)例解析

    這篇文章主要介紹了Java String創(chuàng)建對(duì)象實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • IntelliJ IDEA2019 安裝lombok的實(shí)現(xiàn)

    IntelliJ IDEA2019 安裝lombok的實(shí)現(xiàn)

    這篇文章主要介紹了IntelliJ IDEA2019 安裝lombok的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Java如何使用itext向PDF插入數(shù)據(jù)和圖片

    Java如何使用itext向PDF插入數(shù)據(jù)和圖片

    最近項(xiàng)目中使用到Java實(shí)現(xiàn)寫(xiě)入PDF文件,這篇文章主要給大家介紹了關(guān)于Java如何使用itext向PDF插入數(shù)據(jù)和圖片的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • RestTemplate接口調(diào)用神器常見(jiàn)用法匯總

    RestTemplate接口調(diào)用神器常見(jiàn)用法匯總

    這篇文章主要介紹了RestTemplate接口調(diào)用神器常見(jiàn)用法匯總,通過(guò)案例代碼詳細(xì)介紹RestTemplate接口調(diào)用神器常見(jiàn)用法,需要的朋友可以參考下
    2022-07-07
  • SpringBoot HttpMessageConverter消息轉(zhuǎn)換器的使用詳解

    SpringBoot HttpMessageConverter消息轉(zhuǎn)換器的使用詳解

    在整個(gè)數(shù)據(jù)流轉(zhuǎn)過(guò)程中,前端的請(qǐng)求報(bào)文轉(zhuǎn)化為Java對(duì)象,Java對(duì)象轉(zhuǎn)化為響應(yīng)報(bào)文,這里就用到了消息轉(zhuǎn)換器HttpMessageConverter
    2022-06-06
  • Java中的TreeSet源碼解讀

    Java中的TreeSet源碼解讀

    這篇文章主要介紹了Java中的TreeSet源碼解讀,TreeSet 是一個(gè) 有序集合,它擴(kuò)展了 AbstractSet 類(lèi)并實(shí)現(xiàn)了 NavigableSet 接口,對(duì)象根據(jù)其自然順序以升序排序和存儲(chǔ),該 TreeSet 中使用 平衡樹(shù),更具體的一個(gè) 紅黑樹(shù),需要的朋友可以參考下
    2023-09-09
  • 高效Java尺寸壓縮技巧,節(jié)省資源成本

    高效Java尺寸壓縮技巧,節(jié)省資源成本

    如果你想了解如何優(yōu)化Java應(yīng)用程序的尺寸,節(jié)省存儲(chǔ)空間并提升性能,那么你來(lái)對(duì)地方了,本指南將教你簡(jiǎn)單實(shí)用的技巧和最佳實(shí)踐,幫助你輕松減小Java應(yīng)用程序的體積,讓你的代碼更高效、更精簡(jiǎn),讓我們一起開(kāi)始吧,讓Java應(yīng)用程序變得更小巧而強(qiáng)大!
    2023-12-12
  • ByteArrayOutputStream簡(jiǎn)介和使用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    ByteArrayOutputStream簡(jiǎn)介和使用_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    ByteArrayOutputStream 是字節(jié)數(shù)組輸出流。它繼承于OutputStream。這篇文章主要介紹了ByteArrayOutputStream簡(jiǎn)介和使用,需要的朋友可以參考下
    2017-05-05

最新評(píng)論