首頁  >  文章  >  資料庫  >  springboot整合redis存物件亂碼如何解決

springboot整合redis存物件亂碼如何解決

王林
王林轉載
2023-05-28 09:25:051714瀏覽

springboot整合redis存物件亂碼

其實本質上不算是一種亂碼,只是序列化之後儲存的東西而已,當我們使用RedisTemplete儲存對象,時,如果該物件沒有被序列化則會報錯,序列化之後得到的不是自己想要的數據,為了解決這個方法,我們可以使用StringRedisTemplete

話不多說上程式碼

預設使用redistemplete時

/**
 * title: list
 *
 *  当我们保存到redis中的是一个对象时,我们会发现会报错,提示我们需要序列化 ,
 *  当我们继承了序列化接口之后,查看设置的值时,我们发现设置的值不是原来的样字,
 *  此时我们可以通过两种方式解决
 *      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"));
    }
}

當我們運行時會發現報錯了!提示我們User物件沒有序列化。

org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serializeobjectFailed .lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.xxx.redis01.model.User]

    .....
Caused by: javalang.Ille o#  DefaultSerializer requires a Serializable payload but received an object of type [com.xxx.redis01.model.User]
    at org.springframework.core.serializer.DefaultSerial#izer.serialize(Default3izer. springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56)
    at org.springframework.core.serializer.support.SerializingConverter.con (SerializingConverter.java:60) 1

#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 時你會發現,欸?這裡亂碼了。 。 。

2022-04-01 20:32:07.666  INFO 18640 --- [           main] com.xxx.redis01.RedisListTest01     main] com.xxx.redis01.RedisListTest01     main] com.xxx.redis01.RedisListTest01     main] com.xxx.redis01.RedisListTest01     main] com.xxx.redis01.RedisListTest01    

2022-04-01 20:32:07.998  INFO 18640 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data] .s.d.r.c.Repository,ConfigurationDelegate : Multiple Spring Data] .s.d.r.c.Repository,ConfigurationDelegate : Multiple Spring Data :32:08.000 INFO 18640 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.##   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 --- [         est main] 18640 --- [         est main] 18640 --- [         est main] com.xxx.is 01. 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() {
        //设置序列化Key的实例化对象
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //设置序列化Value的实例化对象
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}

以上是springboot整合redis存物件亂碼如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除