springboot集成redis存對(duì)象亂碼的問題及解決
springboot集成redis存對(duì)象亂碼
其實(shí)本質(zhì)上不算是一種亂碼,只是序列化之后存儲(chǔ)的東西而已,當(dāng)我們使用RedisTemplete存儲(chǔ)對(duì)象,時(shí),如果該對(duì)象沒有被序列化則會(huì)報(bào)錯(cuò),序列化之后得到的不是自己想要的數(shù)據(jù),為了解決這種方法,我們可以使用 StringRedisTemplete
話不多說上代碼
默認(rèn)使用redistemplete時(shí)
/**
* title: list
*
* 當(dāng)我們保存到redis中的是一個(gè)對(duì)象時(shí),我們會(huì)發(fā)現(xiàn)會(huì)報(bào)錯(cuò),提示我們需要序列化 ,
* 當(dāng)我們繼承了序列化接口之后,查看設(shè)置的值時(shí),我們發(fā)現(xiàn)設(shè)置的值不是原來的樣字,
* 此時(shí)我們可以通過兩種方式解決
* 1.
*
* @author : ZHeng
*/
@SpringBootTest
public class RedisListTest01 {
// @Autowired
// StringRedisTemplate stringRedisTemplate;
@Autowired
RedisTemplate redisTemplate;
@Test
public void test(){
redisTemplate.opsForValue().set("user1",new User(2,"lisi",19));
System.out.println(redisTemplate.opsForValue().get("user1"));
}
}當(dāng)我們運(yùn)行時(shí)會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了!提示我們User對(duì)象沒有序列化。
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.xxx.redis01.model.User]
.....
Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.xxx.redis01.model.User]
at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
at org.springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56)
at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:60)
... 72 more
Process finished with exit code -1
當(dāng)我們給User對(duì)象序列化之后運(yùn)行
public class User implements Serializable {
? ? private Integer id;
? ? private String name;
? ? private Integer age;
? ? //省略getter setter toString等
}天啦嚕,竟然不亂碼了!!! ,但是–當(dāng)你使用linux 遠(yuǎn)程連接后查看keys 時(shí)你會(huì)發(fā)現(xiàn),欸? 這里亂碼了。。。
2022-04-01 20:32:07.666 INFO 18640 --- [ main] com.xxx.redis01.RedisListTest01 : No active profile set, falling back to 1 default profile: "default"
2022-04-01 20:32:07.998 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2022-04-01 20:32:08.000 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2022-04-01 20:32:08.018 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 5 ms. Found 0 Redis repository interfaces.
2022-04-01 20:32:08.752 INFO 18640 --- [ main] com.xxx.redis01.RedisListTest01 : Started RedisListTest01 in 1.488 seconds (JVM running for 2.517)
User{id=2, name='lisi', age='19'}Process finished with exit code 0
這是什么鬼? 明明是user1 這是啥啊
127.0.0.1:6379> keys * ??ser1
可以考慮使用StringRedisTemplete
解決方式肯定不是只有一種,只是自己學(xué)習(xí)記錄,,僅供參考
@SpringBootTest
public class RedisListTest01 {
? ? @Autowired
? ? StringRedisTemplate stringRedisTemplate;
? ? @Test
? ? public void test(){
? ? ? ? stringRedisTemplate.opsForValue().set("user1",new User(2,"lisi",19).toString());
? ? ? ? System.out.println(stringRedisTemplate.opsForValue().get("user1"));
? ? }
}成功拿到
User{id=2, name='lisi', age='19'}我們?cè)趌inux下看看,同樣ok
127.0.0.1:6379> keys *
user1
127.0.0.1:6379> get user1
User{id=2, name='lisi', age='19'}
127.0.0.1:6379>?當(dāng)然還有另一種方式,存入JSON格式,這里就不放代碼了.
解決redis亂碼問題
直接添加一個(gè)配置類就行了
/**解決redis中文亂碼
?* Created by dgx on 2019/8
?*/
@Configuration
public class Config {
? ? @Autowired
? ? private RedisTemplate redisTemplate;
? ? @Bean
? ? public RedisTemplate redisTemplateInit() {
? ? ? ? //設(shè)置序列化Key的實(shí)例化對(duì)象
? ? ? ? redisTemplate.setKeySerializer(new StringRedisSerializer());
? ? ? ? //設(shè)置序列化Value的實(shí)例化對(duì)象
? ? ? ? redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
? ? ? ? return redisTemplate;
? ? }
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java并發(fā)編程——volatile關(guān)鍵字
這篇文章主要介紹了Java并發(fā)編程——volatile關(guān)鍵字的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java并發(fā)編程,感興趣的朋友可以了解下2020-10-10
Mybatis 傳輸List的實(shí)現(xiàn)代碼
本文通過實(shí)例代碼給大家介紹了mybatis傳輸list的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-09-09
本地MinIO存儲(chǔ)服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過程
MinIO是一款高性能、分布式的對(duì)象存儲(chǔ)系統(tǒng),它可以100%的運(yùn)行在標(biāo)準(zhǔn)硬件上,即X86等低成本機(jī)器也能夠很好的運(yùn)行MinIO,這篇文章主要介紹了本地MinIO存儲(chǔ)服務(wù)Java遠(yuǎn)程調(diào)用上傳文件的操作過程,需要的朋友可以參考下2023-11-11
JVM分配和回收堆外內(nèi)存的方式與注意點(diǎn)
JVM啟動(dòng)時(shí)分配的內(nèi)存稱為堆內(nèi)存,與之相對(duì)的,在代碼中還可以使用堆外內(nèi)存,比如Netty,廣泛使用了堆外內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于JVM分配和回收堆外內(nèi)存的方式與注意點(diǎn),需要的朋友可以參考下2022-07-07
spring boot加載資源路徑配置和classpath問題解決
這篇文章主要介紹了spring boot加載資源路徑配置和classpath問題解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
Java零基礎(chǔ)教程之do-while循環(huán)語句實(shí)例
Java中的do-while循環(huán)是一種后測(cè)試循環(huán)語句,它類似于while循環(huán),但它先執(zhí)行循環(huán)體中的代碼,然后再進(jìn)行條件判斷,無論條件是否滿足,至少會(huì)執(zhí)行一次循環(huán)體中的代碼,這篇文章主要給大家介紹了關(guān)于Java零基礎(chǔ)教程之do-while循環(huán)語句的相關(guān)資料,需要的朋友可以參考下2024-09-09
Java實(shí)現(xiàn)PDF文件的分割與加密功能
這篇文章主要為大家分享了如何利用Java語言實(shí)現(xiàn)PDF文件的分割與加密以及封面圖的生成,文中的示例代碼簡(jiǎn)潔易懂,感興趣的可以了解一下2022-04-04

