RedisTemplate默認(rèn)序列化方式顯示中文亂碼的解決
在 Spring Data Redis 中,存儲(chǔ)數(shù)據(jù)時(shí)出現(xiàn)亂碼通常是因?yàn)?RedisTemplate 的默認(rèn)序列化方式(JdkSerializationRedisSerializer
)將數(shù)據(jù)存儲(chǔ)為二進(jìn)制格式,而不是可讀的字符串格式。要解決這個(gè)問題,你可以通過配置 RedisTemplate
,使用合適的序列化器(如 StringRedisSerializer
或 Jackson2JsonRedisSerializer
)來存儲(chǔ)數(shù)據(jù)。
以下是解決方案和配置示例:
1. 問題原因
- 默認(rèn)情況下,Spring Data Redis 使用
JdkSerializationRedisSerializer
,它會(huì)將對象序列化為二進(jìn)制格式,導(dǎo)致 Redis 中存儲(chǔ)的數(shù)據(jù)不可讀。 - 如果你希望存儲(chǔ)為可讀的字符串或 JSON 格式,需要修改
RedisTemplate
的序列化器。
2. 解決方案
通過配置 RedisTemplate
,指定 key 和 value 的序列化器。常用的序列化器包括:
StringRedisSerializer
:將 key 和 value 存儲(chǔ)為字符串。Jackson2JsonRedisSerializer
:將 value 存儲(chǔ)為 JSON 格式。
3. 配置類示例
以下是一個(gè)配置類的示例,使用 StringRedisSerializer
和 Jackson2JsonRedisSerializer
:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 使用 StringRedisSerializer 序列化 key template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 使用 Jackson2JsonRedisSerializer 序列化 value Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY ); serializer.setObjectMapper(objectMapper); template.setValueSerializer(serializer); template.setHashValueSerializer(serializer); return template; } }
4. 配置說明
StringRedisSerializer
:- 用于序列化 key 和 hash key,確保 key 是字符串格式。
Jackson2JsonRedisSerializer
:- 用于序列化 value 和 hash value,將對象存儲(chǔ)為 JSON 格式。
- 通過
ObjectMapper
配置支持多態(tài)類型(activateDefaultTyping
),以便反序列化時(shí)能正確還原對象類型。
5. 使用示例
配置完成后,RedisTemplate
會(huì)自動(dòng)使用新的序列化器。以下是一個(gè)簡單的使用示例:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private RedisTemplate<String, Object> redisTemplate; public void saveUser(String key, User user) { redisTemplate.opsForValue().set(key, user); } public User getUser(String key) { return (User) redisTemplate.opsForValue().get(key); } }
6. 驗(yàn)證存儲(chǔ)結(jié)果
- 使用
StringRedisSerializer
和Jackson2JsonRedisSerializer
后,Redis 中存儲(chǔ)的數(shù)據(jù)將是可讀的字符串或 JSON 格式。 - 例如,存儲(chǔ)的 key 會(huì)是
user:1
,value 會(huì)是{"id":1,"name":"John"}
。
7. 注意事項(xiàng)
- 如果已經(jīng)存儲(chǔ)了二進(jìn)制格式的數(shù)據(jù),修改序列化器后,需要手動(dòng)清理 Redis 中的數(shù)據(jù),或者編寫遷移腳本將舊數(shù)據(jù)轉(zhuǎn)換為新格式。
- 如果存儲(chǔ)的是復(fù)雜對象(如集合或嵌套對象),確保
ObjectMapper
配置正確,以支持反序列化。
總結(jié)
通過配置 RedisTemplate
的序列化器,可以解決 Spring Data Redis 存儲(chǔ)數(shù)據(jù)亂碼的問題。推薦使用 StringRedisSerializer
和 Jackson2JsonRedisSerializer
,分別處理 key 和 value 的序列化。
到此這篇關(guān)于RedisTemplate默認(rèn)序列化方式顯示中文亂碼的解決的文章就介紹到這了,更多相關(guān)RedisTemplate默認(rèn)序列化亂碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Validation Api實(shí)現(xiàn)原理解析
這篇文章主要介紹了Java Validation Api實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09SpringBoot如何IDEA中實(shí)現(xiàn)熱部署
這篇文章主要介紹了SpringBoot如何IDEA中實(shí)現(xiàn)熱部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04RocketMQ?producer容錯(cuò)機(jī)制源碼解析
這篇文章主要為大家介紹了RocketMQ?producer容錯(cuò)機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03maven升級版本后報(bào)錯(cuò):Blocked mirror for repositories
本文主要介紹了maven升級版本后報(bào)錯(cuò):Blocked mirror for repositories,文中的解決方法非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09Mybatis如何自動(dòng)生成數(shù)據(jù)庫表的實(shí)體類
這篇文章主要介紹了Mybatis自動(dòng)生成數(shù)據(jù)庫表的實(shí)體類的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Mybatis嵌套子查詢動(dòng)態(tài)SQL編寫實(shí)踐
這篇文章主要介紹了Mybatis嵌套子查詢動(dòng)態(tài)SQL編寫方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05springboot serverEndpoint導(dǎo)致@resource注解不生效
在SpringBoot中,@Resource注解用于注入依賴,本文主要介紹了springboot serverEndpoint導(dǎo)致@resource注解不生效,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12springsecurity6配置自定義路徑身份認(rèn)證的實(shí)現(xiàn)
本文主要介紹了springsecurity6配置自定義路徑身份認(rèn)證的實(shí)現(xiàn),通過使用自定義的AuthorizationManager和MyService,可以實(shí)現(xiàn)更靈活的訪問控制,感興趣的可以了解一下2025-03-03