springboot集成redis存對象亂碼的問題及解決
springboot集成redis存對象亂碼
其實本質(zhì)上不算是一種亂碼,只是序列化之后存儲的東西而已,當我們使用RedisTemplete存儲對象,時,如果該對象沒有被序列化則會報錯,序列化之后得到的不是自己想要的數(shù)據(jù),為了解決這種方法,我們可以使用 StringRedisTemplete
話不多說上代碼
默認使用redistemplete時
/** * title: list * * 當我們保存到redis中的是一個對象時,我們會發(fā)現(xiàn)會報錯,提示我們需要序列化 , * 當我們繼承了序列化接口之后,查看設(shè)置的值時,我們發(fā)現(xiàn)設(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")); } }
當我們運行時會發(fā)現(xiàn)報錯了!提示我們User對象沒有序列化。
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
當我們給User對象序列化之后運行
public class User implements Serializable { ? ? private Integer id; ? ? private String name; ? ? private Integer age; ? ? //省略getter setter toString等 }
天啦嚕,竟然不亂碼了!!! ,但是–當你使用linux 遠程連接后查看keys 時你會發(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
解決方式肯定不是只有一種,只是自己學習記錄,,僅供參考
@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'}
我們在linux下看看,同樣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>?
當然還有另一種方式,存入JSON格式,這里就不放代碼了.
解決redis亂碼問題
直接添加一個配置類就行了
/**解決redis中文亂碼 ?* Created by dgx on 2019/8 ?*/ @Configuration public class Config { ? ? @Autowired ? ? private RedisTemplate redisTemplate; ? ? @Bean ? ? public RedisTemplate redisTemplateInit() { ? ? ? ? //設(shè)置序列化Key的實例化對象 ? ? ? ? redisTemplate.setKeySerializer(new StringRedisSerializer()); ? ? ? ? //設(shè)置序列化Value的實例化對象 ? ? ? ? redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); ? ? ? ? return redisTemplate; ? ? } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java并發(fā)編程——volatile關(guān)鍵字
這篇文章主要介紹了Java并發(fā)編程——volatile關(guān)鍵字的相關(guān)資料,幫助大家更好的理解和學習Java并發(fā)編程,感興趣的朋友可以了解下2020-10-10本地MinIO存儲服務(wù)Java遠程調(diào)用上傳文件的操作過程
MinIO是一款高性能、分布式的對象存儲系統(tǒng),它可以100%的運行在標準硬件上,即X86等低成本機器也能夠很好的運行MinIO,這篇文章主要介紹了本地MinIO存儲服務(wù)Java遠程調(diào)用上傳文件的操作過程,需要的朋友可以參考下2023-11-11spring boot加載資源路徑配置和classpath問題解決
這篇文章主要介紹了spring boot加載資源路徑配置和classpath問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03Java零基礎(chǔ)教程之do-while循環(huán)語句實例
Java中的do-while循環(huán)是一種后測試循環(huán)語句,它類似于while循環(huán),但它先執(zhí)行循環(huán)體中的代碼,然后再進行條件判斷,無論條件是否滿足,至少會執(zhí)行一次循環(huán)體中的代碼,這篇文章主要給大家介紹了關(guān)于Java零基礎(chǔ)教程之do-while循環(huán)語句的相關(guān)資料,需要的朋友可以參考下2024-09-09