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
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
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.
/**解决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!