自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Redis 序列化值,多了雙引號(hào)問題

數(shù)據(jù)庫 Redis
使用Jackson2JsonRedisSerializer?來序列化key和value?,會(huì)把Java?對(duì)象序列化為JSON?格式的字符串。如果你序列化的是Java?字符串,那么它就會(huì)被JSON?格式化,并在最終存儲(chǔ)在Redis中時(shí)帶有雙引號(hào)。

問題

有兩個(gè)服務(wù):A 服務(wù)和 B 服務(wù),A 服務(wù)負(fù)責(zé)將數(shù)據(jù)寫入 Redis 的 Hash 中,B 服務(wù)負(fù)責(zé)從 Redis 中讀取這些數(shù)據(jù)。在實(shí)際運(yùn)行中,B 服務(wù)讀取到的數(shù)字類型字符串與 A 服務(wù)寫入的值不一致:

圖片圖片

問題排查,最終發(fā)現(xiàn)通過hgetall命令返回字符串多加了有引號(hào):

圖片圖片

這里懷疑可能是Redis配置中的序列化參數(shù)設(shè)置導(dǎo)致的

序列化與反序列化

Redis序列化和反序列化是將數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為二進(jìn)制格式和將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)的過程。

序列化的作用是將數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為二進(jìn)制形式,以便于傳輸和存儲(chǔ)。它可以將數(shù)據(jù)保存在文件、數(shù)據(jù)庫或者網(wǎng)絡(luò)上,并能夠被其他程序使用。序列化還能夠?qū)?shù)據(jù)進(jìn)行壓縮,并提供靈活的數(shù)據(jù)交換格式。

反序列化則是將二進(jìn)制數(shù)據(jù)轉(zhuǎn)化為對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu),方便在Redis內(nèi)部進(jìn)行存儲(chǔ)和查詢等操作。這樣可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的讀取和寫入。

Redis支持多種數(shù)據(jù)結(jié)構(gòu)的序列化和反序列化,包括string、hash、list、set、zset。

SpringBoot提供了多種Redis序列化方式,包括JDK序列化、JSON序列化、FastJSON序列化、Jackson序列化、Protobuf序列化等。其中JDK序列化是默認(rèn)的序列化方式。

常見的序列化器

  • StringRedisSerializer:用于字符串的序列化和反序列化。適用于簡單的字符串鍵值對(duì)。
  • Jackson2JsonRedisSerializer:使用 Jackson 庫進(jìn)行 JSON 序列化和反序列化。適用于復(fù)雜對(duì)象的序列化。
  • GenericJackson2JsonRedisSerializer:類似于 Jackson2JsonRedisSerializer,但可以處理泛型對(duì)象。
  • OxmMarshaler:使用 Spring 的 Object-XML 映射功能進(jìn)行序列化和反序列化。適用于 XML 數(shù)據(jù)。
  • GenericToStringSerializer:將對(duì)象轉(zhuǎn)換為字符串,適用于簡單的對(duì)象。

A服務(wù)

使用了Jackson2JsonRedisSerializer

private RedisTemplate<String, Object> createRedisTemplate(JedisConnectionFactory connectionFactory) {
        // 序列化配置
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance , ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setEnableDefaultSerializer(true);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

B服務(wù)

此服務(wù)為c++端,使用默認(rèn)String,該端不做調(diào)整的話,修復(fù)A端為new StringRedisSerializer()方式

測試

圖片圖片

使用StringRedisSerializer來序列化key和value,這個(gè)序列化器會(huì)把Java字符串直接轉(zhuǎn)換為Redis存儲(chǔ)的字節(jié)序列,而不添加任何額外的格式化或引號(hào)。

使用Jackson2JsonRedisSerializer來序列化key和value,會(huì)把Java對(duì)象序列化為JSON格式的字符串。如果你序列化的是Java字符串,那么它就會(huì)被JSON格式化,并在最終存儲(chǔ)在Redis中時(shí)帶有雙引號(hào)。

責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2019-11-20 10:07:23

web安全PHP序列化反序列化

2022-08-06 08:41:18

序列化反序列化Hessian

2021-03-24 08:41:38

Redis 分布式鎖序列化

2011-06-01 15:05:02

序列化反序列化

2009-08-24 17:14:08

C#序列化

2021-01-20 08:24:38

序列化內(nèi)存對(duì)象

2023-12-13 13:49:52

Python序列化模塊

2009-08-06 11:16:25

C#序列化和反序列化

2011-05-18 15:20:13

XML

2018-03-19 10:20:23

Java序列化反序列化

2013-03-11 13:55:03

JavaJSON

2011-06-01 14:26:11

序列化

2009-06-14 22:01:27

Java對(duì)象序列化反序列化

2009-08-25 14:24:36

C#序列化和反序列化

2011-06-01 14:50:48

2024-09-25 16:10:05

2010-05-14 10:55:04

java對(duì)象序列化

2021-11-18 07:39:41

Json 序列化Vue

2025-03-05 10:49:32

2009-09-09 16:10:11

.NET序列化和反序列
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)