欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號問題

 更新時間:2024年08月20日 14:28:36   作者:c&0xff00  
這篇文章主要介紹了Redis序列化反序列化不一致導(dǎo)致String類型值多了雙引號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

問題背景

A服務(wù)寫入Redis的數(shù)據(jù),B服務(wù)讀出后,value值多了個雙引號。

如 “String” 獲取到的是 ““String””

問題原因

A服務(wù)添加了一個redisTemplate Bean配置:

@Configuration
public class RedisTemplateConfig {
    @Bean(name = "redisTemplate")
    public RedisTemplate setRedisTemplate(RedisConnectionFactory redisConnectionFactory, RedisProperties redisProperties) {
        StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        redisProperties.setPassword(SecretKeyClient.getPassword(
                System.getProperty("datakeeper.application.redis.community.key_name")));
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

我們可以看到ValueSerializer用的是jackson2JsonRedisSerializer。

使用的時候通過@Resource注解引入:

    @Resource
    private RedisTemplate<String, String> redisTemplate;

@Resource默認(rèn)就是通過beanName注入的,所以此時注入的RedisTemplate就是我們上面配置的。

在B服務(wù)中:

也配置了這樣一個RedisTemplate:

@Configuration
public class RedisTemplateConfig {
    @Bean(name = "redisTemplate")
    public RedisTemplate setRedisTemplate(RedisConnectionFactory redisConnectionFactory, RedisProperties redisProperties) {
        StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        redisProperties.setPassword(SecretKeyClient.getPassword(
                System.getProperty("datakeeper.application.redis.community.key_name")));
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

配置和A服務(wù)一模一樣。

但是,在使用RedisTemplate時采用的@Autowired注解:

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

我們知道@Autowired注解默認(rèn)是按照BeanClass即BeanType進(jìn)行注入的,此時注入的RedisTemplate卻不是我們上面配置的,而是SpringBoot自動配置的。

在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;
	}

我們看到,我們配置的與SpringBoot默認(rèn)的redisTemplate不相同。

通過打斷點(diǎn)進(jìn)行對比:

SpringBoot默認(rèn)的:

我們自己定義的:

可以看到,在valueSerializer上,一個是StringRedisSerializer,一個是Jackson2JsonRedisSerializer。

所以,在序列化與反序列化的方式不同時,產(chǎn)生這種亂碼,奇怪的雙引號問題也就可以解釋了。

解決方案

將序列化反序列化方式改成一致。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Redis面試必備之緩存設(shè)計規(guī)范與性能優(yōu)化詳解

    Redis面試必備之緩存設(shè)計規(guī)范與性能優(yōu)化詳解

    你是否在使用Redis時,不清楚Redis應(yīng)該遵循的設(shè)計規(guī)范而苦惱,你是否在Redis出現(xiàn)性能問題時,不知道該如何優(yōu)化而發(fā)愁,快跟隨小編一起學(xué)習(xí)起來吧
    2024-03-03
  • 推薦一款神仙顏值的 Redis 客戶端工具(速收藏)

    推薦一款神仙顏值的 Redis 客戶端工具(速收藏)

    這篇文章主要給大家推薦一款神仙顏值的 Redis 客戶端工具(速收藏),非常好用的redis桌面管理工具,可以運(yùn)行于Linux、Windows、Mac三大平臺,并且當(dāng)加載大數(shù)量的key不會crash,感興趣的朋友跟隨小編一起看看吧
    2020-12-12
  • Django使用redis配置緩存的方法

    Django使用redis配置緩存的方法

    Redis是一個內(nèi)存數(shù)據(jù)庫由于其性能極高,因此經(jīng)常作為中間件、緩存使用,緩存某些內(nèi)容是為了保存昂貴計算的結(jié)果,這樣就不必在下次執(zhí)行計算,接下來通過本文給大家分享redis配置緩存的方法,感興趣的朋友一起看看吧
    2021-06-06
  • Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動

    Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動

    Redis是一種鍵值對數(shù)據(jù)庫,也稱為內(nèi)存數(shù)據(jù)庫,因為它可以將數(shù)據(jù)存儲在內(nèi)存中,而不是在磁盤上,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)設(shè)置Redis服務(wù)使其開機(jī)自啟動的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Redis中?HyperLogLog數(shù)據(jù)類型使用小結(jié)

    Redis中?HyperLogLog數(shù)據(jù)類型使用小結(jié)

    Redis使用HyperLogLog的主要作用是在大數(shù)據(jù)流(view,IP,城市)的情況下進(jìn)行去重計數(shù),這篇文章主要介紹了Redis中?HyperLogLog數(shù)據(jù)類型使用總結(jié),需要的朋友可以參考下
    2023-03-03
  • redis的string類型及bitmap介紹

    redis的string類型及bitmap介紹

    這篇文章主要介紹了redis的string類型及bitmap介紹,redis有很多的客戶端連接進(jìn)來,站在redis所在機(jī)器的角度來說,就是有很多socket的連接
    2022-07-07
  • 使用Redis實現(xiàn)延時任務(wù)的解決方案

    使用Redis實現(xiàn)延時任務(wù)的解決方案

    這篇文章主要介紹了使用Redis實現(xiàn)延時任務(wù)的解決方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 帶你輕松掌握Redis分布式鎖

    帶你輕松掌握Redis分布式鎖

    這篇文章主要介紹了帶你輕松掌握Redis分布式鎖,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 基于redis 7.2.3的makefile源碼解讀學(xué)習(xí)

    基于redis 7.2.3的makefile源碼解讀學(xué)習(xí)

    這篇文章主要為大家介紹了基于redis 7.2.3的makefile源碼解讀學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • redis和redisson實現(xiàn)分布式鎖的操作方法

    redis和redisson實現(xiàn)分布式鎖的操作方法

    使用 Redis 實現(xiàn)分布式鎖,最直接的想法是利用 setnx 和 expire 命令實現(xiàn)加鎖,這篇文章主要介紹了redis和redisson實現(xiàn)分布式鎖的操作方法,需要的朋友可以參考下
    2024-03-03

最新評論