springboot 통합 redis에 저장된 잘못된 객체 문제를 해결하는 방법

王林
풀어 주다: 2023-05-28 09:25:05
앞으로
1711명이 탐색했습니다.

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: 직렬화할 수 없습니다. 중첩된 예외는 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
로그인 후 복사

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에서 살펴보겠습니다. , 똑같습니다

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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿