RedisTemplate默認(rèn)序列化方式顯示中文亂碼的解決
在 Spring Data Redis 中,存儲數(shù)據(jù)時(shí)出現(xiàn)亂碼通常是因?yàn)?RedisTemplate 的默認(rèn)序列化方式(JdkSerializationRedisSerializer)將數(shù)據(jù)存儲為二進(jìn)制格式,而不是可讀的字符串格式。要解決這個問題,你可以通過配置 RedisTemplate,使用合適的序列化器(如 StringRedisSerializer 或 Jackson2JsonRedisSerializer)來存儲數(shù)據(jù)。
以下是解決方案和配置示例:
1. 問題原因
- 默認(rèn)情況下,Spring Data Redis 使用
JdkSerializationRedisSerializer,它會將對象序列化為二進(jìn)制格式,導(dǎo)致 Redis 中存儲的數(shù)據(jù)不可讀。 - 如果你希望存儲為可讀的字符串或 JSON 格式,需要修改
RedisTemplate的序列化器。
2. 解決方案
通過配置 RedisTemplate,指定 key 和 value 的序列化器。常用的序列化器包括:
StringRedisSerializer:將 key 和 value 存儲為字符串。Jackson2JsonRedisSerializer:將 value 存儲為 JSON 格式。
3. 配置類示例
以下是一個配置類的示例,使用 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,將對象存儲為 JSON 格式。
- 通過
ObjectMapper配置支持多態(tài)類型(activateDefaultTyping),以便反序列化時(shí)能正確還原對象類型。
5. 使用示例
配置完成后,RedisTemplate 會自動使用新的序列化器。以下是一個簡單的使用示例:
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)證存儲結(jié)果
- 使用
StringRedisSerializer和Jackson2JsonRedisSerializer后,Redis 中存儲的數(shù)據(jù)將是可讀的字符串或 JSON 格式。 - 例如,存儲的 key 會是
user:1,value 會是{"id":1,"name":"John"}。
7. 注意事項(xiàng)
- 如果已經(jīng)存儲了二進(jìn)制格式的數(shù)據(jù),修改序列化器后,需要手動清理 Redis 中的數(shù)據(jù),或者編寫遷移腳本將舊數(shù)據(jù)轉(zhuǎn)換為新格式。
- 如果存儲的是復(fù)雜對象(如集合或嵌套對象),確保
ObjectMapper配置正確,以支持反序列化。
總結(jié)
通過配置 RedisTemplate 的序列化器,可以解決 Spring Data Redis 存儲數(shù)據(jù)亂碼的問題。推薦使用 StringRedisSerializer 和 Jackson2JsonRedisSerializer,分別處理 key 和 value 的序列化。
到此這篇關(guān)于RedisTemplate默認(rèn)序列化方式顯示中文亂碼的解決的文章就介紹到這了,更多相關(guān)RedisTemplate默認(rèn)序列化亂碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- RedisTemplate序列化設(shè)置的流程和具體步驟
- redis redistemplate序列化對象配置方式
- 配置redis的序列化,注入RedisTemplate方式
- Spring?boot?RedisTemplate?序列化服務(wù)化配置方式
- Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解
- Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?
- Redis之RedisTemplate配置方式(序列和反序列化)
- 解決RedisTemplate的key默認(rèn)序列化器的問題
- Spring的RedisTemplate的json反序列泛型丟失問題解決
相關(guān)文章
Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解
這篇文章主要為大家介紹了Java?Scanner?類讀取一維數(shù)組二維數(shù)組示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
WebSocket實(shí)現(xiàn)系統(tǒng)后臺消息實(shí)時(shí)通知功能
在現(xiàn)代Web應(yīng)用中,提供實(shí)時(shí)通知對于改善用戶體驗(yàn)至關(guān)重要,WebSocket技術(shù)允許建立雙向通信通道,從系統(tǒng)后臺將消息實(shí)時(shí)傳送給系統(tǒng)用戶,下面我們就來深入探討一下如何使用WebSocket來實(shí)現(xiàn)這一功能吧2023-10-10
Spring實(shí)戰(zhàn)之搜索Bean類操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之搜索Bean類操作,結(jié)合實(shí)例形式分析了Spring搜索Bean類的相關(guān)配置、接口實(shí)現(xiàn)與操作技巧,需要的朋友可以參考下2019-12-12
java后臺調(diào)用HttpURLConnection類模擬瀏覽器請求實(shí)例(可用于接口調(diào)用)
這篇文章主要介紹了java后臺調(diào)用HttpURLConnection類模擬瀏覽器請求實(shí)例,該實(shí)例可用于接口調(diào)用,具有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10
Mysql?json類型字段Java+Mybatis數(shù)據(jù)字典功能的實(shí)踐方式
這篇文章主要介紹了Mysql?json類型字段Java+Mybatis數(shù)據(jù)字典功能的實(shí)踐方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
java實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

