个人博客纯净版

Redisson自定义对象编码类(数据序列化) | 代码搬运工

Redisson的对象编码类是用于将对象进行序列化和反序列化,以实现对该对象在Redis里的读取和存储。Redisson提供了以下几种的对象编码应用,以供大家选择:

编码类名称

说明

org.redisson.codec.JsonJacksonCodec Jackson

JSON 编码 默认编码

org.redisson.codec.AvroJacksonCodec Avro

一个二进制的JSON编码

org.redisson.codec.SmileJacksonCodec

Smile 另一个二进制的JSON编码

org.redisson.codec.CborJacksonCodec

CBOR 又一个二进制的JSON编码

org.redisson.codec.MsgPackJacksonCodec

MsgPack 再来一个二进制的JSON编码

org.redisson.codec.IonJacksonCodec

Amazon Ion 亚马逊的Ion编码,格式与JSON类似

org.redisson.codec.KryoCodec

Kryo 二进制对象序列化编码

org.redisson.codec.SerializationCodec

JDK序列化编码

org.redisson.codec.FstCodec

FST 10倍于JDK序列化性能而且100%兼容的编码

org.redisson.codec.LZ4Codec

LZ4 压缩型序列化对象编码

org.redisson.codec.SnappyCodec

Snappy 另一个压缩型序列化对象编码

org.redisson.client.codec.JsonJacksonMapCodec

基于Jackson的映射类使用的编码。可用于避免序列化类的信息,以及用于解决使用byte[]遇到的问题。

org.redisson.client.codec.StringCodec

纯字符串编码(无转换)

org.redisson.client.codec.LongCodec

纯整长型数字编码(无转换)

org.redisson.client.codec.ByteArrayCodec

字节数组编码

org.redisson.codec.CompositeCodec

用来组合多种不同编码在一起

除了以上提供的一些对象编码类,另外Redisson也支持自定义对象编码类用户数据的序列化和反序列化。Redisson自定义对象编码类需要继承BaseCodec类,具体实现如下:

添加依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.60</version>
</dependency>

这里我们添加fastjson的依赖是需要fastjson实现序列化和返序列化

创建对象编码类

public class FastjsonCodec extends BaseCodec {


    private final Encoder encoder = new Encoder() {
        @Override
        public ByteBuf encode(Object in) throws IOException {
            ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
            try {
                ByteBufOutputStream os = new ByteBufOutputStream(out);
                JSON.writeJSONString(os, in, SerializerFeature.WriteClassName);
                return os.buffer();
            } catch (IOException e) {
                out.release();
                throw e;
            } catch (Exception e) {
                out.release();
                throw new IOException(e);
            }
        }
    };


    private final Decoder<Object> decoder = new Decoder<Object>() {

        @Override
        public Object decode(ByteBuf buf, State state) throws IOException {
            ParserConfig.getGlobalInstance().addAccept("com.mk.provider.config.");
            return JSON.parseObject(new ByteBufInputStream(buf), Object.class);
        }
    };

    @Override
    public Decoder<Object> getValueDecoder() {
        return decoder;
    }

    @Override
    public Encoder getValueEncoder() {
        return encoder;
    }
}

注意:以上代码中有ParserConfig.getGlobalInstance().addAccept("com.mk.provider.config.")这样一行,这里很重要,这里需要添加待序列化对象的扫描包,如果不添加扫描包,无法实现序列化和反序列化。另外待序列化的对象必须有一个默认的构造器,否则也无法实现序列化和反序列化。

测试代码

public class Test1 {

    public static void main(String[] args) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient client = Redisson.create(config);
        RMap<String, City> map = client.getMap("antMap", new FastjsonCodec());
        City city = City.builder().name("北京").build();
        map.computeIfAbsent("bj", k -> city);
        City city1 = map.get("bj");
        System.out.println(JSONObject.toJSONString(city1));
    }

}

由于Redisson默认使用的JsonJacksonCodec默认编码,当我们需要使用自定义编码时,我们可以通过类似 client.getMap(“antMap”, new FastjsonCodec())这样使用自定义编码。执行测试方法,控制台返回如下信息:

{"name":"北京"}

此时说明自定义编码对于对象的序列化和反序列化正常。