>  기사  >  데이터 베이스  >  Redis가 객체를 저장할 수 있나요?

Redis가 객체를 저장할 수 있나요?

anonymity
anonymity원래의
2019-06-04 16:25:012942검색

Redis는 객체를 저장할 수 있지만 직렬화 및 역직렬화가 필요합니다.

Redis가 객체를 저장할 수 있나요?

왜 직렬화 인터페이스를 구현해야 합니까?

클래스가 직렬화 가능 인터페이스(이 인터페이스는 마커 인터페이스일 뿐이며 메서드 정의를 포함하지 않음)를 구현하는 경우 클래스를 직렬화할 수 있음을 의미합니다. 직렬화 가능 인터페이스의 객체를 바이트 시퀀스로 변환할 수 있습니다. 바이트 시퀀스를 파일 등으로 저장하면 나중에 언제든지 바이트 시퀀스를 원래 개체로 복원할 수 있습니다. 바이트 시퀀스는 복구를 위해 다른 컴퓨터에 저장되거나 네트워크를 통해 다른 컴퓨터로 전송될 수도 있습니다. 해당 클래스가 컴퓨터 플랫폼에 존재하는 한 정상적으로 원래 개체로 복원될 수 있습니다. 구현: 객체를 직렬화하려면 먼저 일부 OutputStream 객체를 생성한 다음 이를 ObjectOutputStream 객체에 캡슐화한 다음 writeObject() 메서드를 호출하여 객체를 직렬화해야 합니다.

참고: 객체 스트림을 사용하여 파일에 쓸 때 객체를 직렬화해야 할 뿐만 아니라 객체의 구성원 객체도 직렬화해야 합니다.

직렬화 가능 정보 인터페이스 클래스

serialVersionUID의 serialVersionUID는 긴 유형입니다. Eclipse에는 두 가지 생성 방법이 있습니다.

기본값은 1L입니다.

private static final long serialVersionUID = 1L;

다른 하나는 생성입니다. 클래스 이름, 인터페이스 이름, 멤버 메서드 및 속성을 기반으로 하는 64비트 해시 필드:

private static final long serialVersionUID = 3969438177161438988L;

serialVersionUID는 주로 호환성 해결을 위한 것입니다. 객체 역직렬화 관련 문제.

serialVersionUID가 제공되지 않으면 객체를 직렬화하여 하드 디스크에 저장한 후 클래스의 필드가 증가하거나 감소합니다. 이러한 방식으로 역직렬화할 때 예외가 발생하여 비호환성 문제가 발생합니다.

하지만 serialVersionUID가 동일하면 type의 기본값을 사용하여 다른 필드를 역직렬화합니다. 이렇게 하면 비호환성 문제를 피할 수 있습니다.

위 방법은 Java 개체로만 복원할 수 있습니다. 다른 개체(예: C++ 개체)로 복원하려면 Java 개체를 사용할 수 있도록 XML 형식으로 변환해야 합니다. 다양한 플랫폼에 의해 다양한 언어가 사용됩니다. JDK와 함께 배포된 javax.xam.* 클래스 라이브러리를 사용하거나 오픈 소스 XOM 클래스 라이브러리(www.xom.nu에서 다운로드하고 문서화할 수 있음)를 사용할 수 있습니다.

실험 사례:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import bean.Person;
import redis.clients.jedis.Jedis;
public class SerializeUtil {
    public static void main(String [] args){
        Jedis jedis = new Jedis("172.16.135.2");
        String keys = "name";
        // 删数据
        //jedis.del(keys);
        // 存数据
        jedis.set(keys, "zy");
        // 取数据
        String value = jedis.get(keys);
        System.out.println(value);
        
        //存对象
        Person p=new Person();  //peson类记得实现序列化接口 Serializable
        p.setAge(20);
        p.setName("姚波");
        p.setId(1);
        jedis.set("person".getBytes(), serialize(p));
        byte[] byt=jedis.get("person".getBytes());
        Object obj=unserizlize(byt);
        if(obj instanceof Person){
            System.out.println(obj);
        }
    }
    
    //序列化 
    public static byte [] serialize(Object obj){
        ObjectOutputStream obi=null;
        ByteArrayOutputStream bai=null;
        try {
            bai=new ByteArrayOutputStream();
            obi=new ObjectOutputStream(bai);
            obi.writeObject(obj);
            byte[] byt=bai.toByteArray();
            return byt;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    //反序列化
    public static Object unserizlize(byte[] byt){
        ObjectInputStream oii=null;
        ByteArrayInputStream bis=null;
        bis=new ByteArrayInputStream(byt);
        try {
            oii=new ObjectInputStream(bis);
            Object obj=oii.readObject();
            return obj;
        } catch (Exception e) {
            
            e.printStackTrace();
        }
    
        
        return null;
    }
}

위 내용은 Redis가 객체를 저장할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.