最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

問題概述

關于這個問題呢,還是主要出現(xiàn)在項目開發(fā)的管理上面,先描述哈項目環(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

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

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

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

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

解決辦法

經過一段艱辛的 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 的默認序列化機制 “ defaultSerializer ” ,如果沒有自定義的序列化機制,則系統(tǒng)默認使用的是 “ org.springframework.data.redis.serializer.JdkSerializationRedisSerializer ” ,然后有老鐵又再系統(tǒng)中默默的自定義了 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<Object, Object> getRedisTemplate(
            final RedisConnectionFactory connectionFactory
    )
    {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        // 配置默認的序列化器
        redisTemplate.setDefaultSerializer(getGenericJackson2JsonRedisSerializer());
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 設置 Key 的默認序列化機制
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        return redisTemplate;
    }
}

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

這兒就是問題的所在,此時就不能使用原生的 “ RedisTemplate redisTemplate; ” 而需要定義為泛型的 “ RedisTemplate <Object,Object> redisTemplate; ” 了,因為當我們再次新增的 key 的時候,使用的是 “ StringRedisSerializer ”序列化機制,但是在 delete 操作的時候是使用的是原生 API ,redis 中的 redisTemplate 默認序列化機制采用的是 “ JdkSerializationRedisSerializer ”,這樣以來,即使你使用 hasKey 方法也會發(fā)現(xiàn) redis 中存在這個 key ,但是實際 hasKey 返回 false,所以就會出現(xiàn)刪除成功,但是實際的數(shù)據(jù)依然存在 Redis 服務器上咯。

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

相關文章

  • 在 Spring Boot 3 中接入生成式 AI的操作方法

    在 Spring Boot 3 中接入生成式 AI的操作方法

    本文介紹了如何在SpringBoot3中集成生成式AI,以OpenAI的GPT模型為例,通過代碼示例展示了如何實現(xiàn),SpringBoot3的優(yōu)勢和OpenAI的生成式AI技術結合,為開發(fā)者提供了高效集成生成式AI的方法,感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • Spring?Boot?教程之創(chuàng)建項目的三種方式

    Spring?Boot?教程之創(chuàng)建項目的三種方式

    這篇文章主要分享了Spring?Boot?教程之創(chuàng)建項目的三種方式,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • Springcloud seata nacos環(huán)境搭建過程圖解

    Springcloud seata nacos環(huán)境搭建過程圖解

    這篇文章主要介紹了Springcloud seata nacos環(huán)境搭建過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • javaBean的基礎知識及常見亂碼解決方法

    javaBean的基礎知識及常見亂碼解決方法

    這篇文章主要介紹了javaBean的基礎知識及常見亂碼解決方法的相關資料,需要的朋友可以參考下
    2017-03-03
  • java郵件通知工具類

    java郵件通知工具類

    這篇文章主要為大家詳細介紹了java郵件通知工具類,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 詳細盤點Java中鎖的分類

    詳細盤點Java中鎖的分類

    這篇文章主要介紹了詳細盤點Java中鎖的分類,Java中的鎖是一種多線程編程中的同步機制,用于控制線程對共享資源的訪問,防止并發(fā)訪問時的數(shù)據(jù)競爭和死鎖問題,需要的朋友可以參考下
    2023-08-08
  • ReentrantLock從源碼解析Java多線程同步學習

    ReentrantLock從源碼解析Java多線程同步學習

    這篇文章主要為大家介紹了ReentrantLock從源碼解析Java多線程同步學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Java集合操作之List接口及其實現(xiàn)方法詳解

    Java集合操作之List接口及其實現(xiàn)方法詳解

    這篇文章主要介紹了Java集合操作之List接口及其實現(xiàn)方法,詳細分析了Java集合操作中List接口原理、功能、用法及操作注意事項,需要的朋友可以參考下
    2015-07-07
  • java圖形界面AWT編寫計算器

    java圖形界面AWT編寫計算器

    這篇文章主要為大家詳細介紹了基于java語言下圖形界面AWT編寫計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java多線程編程中線程鎖與讀寫鎖的使用示例

    Java多線程編程中線程鎖與讀寫鎖的使用示例

    這篇文章主要介紹了Java多線程編程中線程鎖與讀寫鎖的使用示例,鎖是控制程序多線程并發(fā)的重要手段,需要的朋友可以參考下
    2016-04-04

最新評論

太保市| 安塞县| 巴彦县| 吉首市| 波密县| 重庆市| 虹口区| 维西| 博野县| 陇川县| 宽城| 安图县| 西华县| 大名县| 缙云县| 融水| 綦江县| 河北区| 修水县| 怀集县| 元朗区| 铜川市| 平陆县| 清徐县| 白山市| 黔西| 安陆市| 石首市| 太原市| 龙州县| 始兴县| 军事| 青龙| 松阳县| 汝城县| 沈阳市| 香港| 色达县| 焦作市| 临汾市| 将乐县|