사실 본질적으로 일종의 잘못된 코드가 아니며, 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: 직렬화할 수 없습니다. 중첩된 예외는 org.springframework.core.serializer.support.SerializationFailedException입니다. DefaultSerializer를 사용하여 객체를 직렬화하지 못했습니다. 중첩된 예외는 java.lang.IllegalArgumentException입니다. 직렬화 가능 페이로드가 필요하지만 [com.xxx.redis01.model.User] 유형의 객체를 받았습니다.
…..
원인: java.lang.IllegalArgumentException: DefaultSerializer에는 직렬화 가능 페이로드가 필요하지만 [com. xxx.redis01.model.User]
org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:43)
org.springframework.core.serializer.Serializer.serializeToByteArray(Serializer.java:56)
org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:60)
... 72 more
프로세스는 종료 코드 -1
사용자 객체를 직렬화한 후 실행됩니다
public class User implements Serializable { private Integer id; private String name; private Integer age; //省略getter setter toString等 }
오 맙소사, 문자가 더 이상 깨지지 않습니다!!! 하지만 Linux를 사용하여 원격으로 연결하고 키를 확인하면 알 수 있습니다. 여기는 왜곡되어 있습니다. . .
2022-04-01 20:32:07.666 INFO 18640 --- [ main] com.xxx.redis01.RedisListTest01 : 활성 프로필이 설정되지 않았습니다. 1개의 기본 프로필로 돌아갑니다: "default"
2022-04-01 20:32:07.998 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate: 여러 Spring 데이터 모듈이 발견되었습니다. 엄격한 저장소 구성 모드로 들어갑니다!
2022-04-01 20:32:08.000 INFO 18640 --- [ main] .s.d.r.c. RepositoryConfigurationDelegate: DEFAULT 모드에서 Spring 데이터 Redis 리포지토리를 부트스트랩합니다.
2022-04-01 20:32:08.018 INFO 18640 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate: 5ms 안에 Spring 데이터 리포지토리 스캔이 완료되었습니다. 0 Redis 리포지토리 인터페이스를 찾았습니다.
2022-04-01 20:32:08.752 INFO 18640 --- [ main] com.xxx.redis01.RedisListTest01 : 1.488초 만에 RedisListTest01 시작 (JVM은 2.517 동안 실행 중)
User{id=2, name='lisi' , age='19'}종료 코드 0
으로 프로세스가 종료되었습니다. 이게 대체 뭐죠? 분명히 user1입니다. 이것은 무엇입니까?
127.0.0.1:6379> keys * ¬쳵ser1
해결책이 하나만 있는 것은 아닙니다. 참고용으로 직접 연구하고 기록해 보세요.
@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에서 살펴보겠습니다. , 똑같습니다
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中文乱码 * 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!