Home  >  Article  >  Database  >  How to solve the problem of garbled objects stored in springboot integrated redis

How to solve the problem of garbled objects stored in springboot integrated redis

王林
王林forward
2023-05-28 09:25:051665browse

springboot integrated redis storage object garbled code

In fact, it is not a kind of garbled code in essence, it is just something stored after serialization. When we use RedisTemplete to store objects, if the object has not been serialized, An error will be reported, and the data obtained after serialization is not the data you want. In order to solve this method, we can use StringRedisTemplete

Not much to say about the code

When using redistemplete by default

/**
 * 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"));
    }
}

When we run it, we will find an error! Prompt us that the User object is not serialized.

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

When we serialize the User object and run it

public class User implements Serializable {
    private Integer id;
    private String name;
    private Integer age;
    //省略getter setter toString等
}

Oh my God, there is no garbled code!!! , but when you use linux to connect remotely and check the keys, you will find, huh? It's garbled here. . .

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.Repository ConfigurationDelegate : 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.51 7 )
User{id=2, name='lisi', age='19'}

Process finished with exit code 0

What the hell is this? It's obviously user1. What is this?

127.0.0.1:6379> keys *
¬쳵ser1

You can consider using StringRedisTemplete

There is definitely not only one solution, just study and record it by yourself, for reference only

@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"));
    }
}

Get it successfully Go to

User{id=2, name='lisi', age='19'}

Let’s take a look under linux, the same is 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>

Of course there is another way to save it in JSON format, so I won’t put the code here.

Solve the redis garbled problem

Just add a configuration class directly

/**解决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;
    }
}

The above is the detailed content of How to solve the problem of garbled objects stored in springboot integrated redis. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:yisu.com. If there is any infringement, please contact admin@php.cn delete