首页 > 数据库 >RedisTemplate RedisConfig 序列化方式 fastjson2

RedisTemplate RedisConfig 序列化方式 fastjson2

时间:2024-11-20 09:17:51浏览次数:1  
标签:fastjson2 RedisConfig springframework org import 序列化 com public

Spring Data Redis 为我们提供了下面的Serializer:GenericToStringSerializer、Jackson2JsonRedisSerializer、JacksonJsonRedisSerializer、JdkSerializationRedisSerializer、OxmSerializer、StringRedisSerializer。
image

序列化方式对比:

  • JdkSerializationRedisSerializer: 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class),但缺点是需要实现Serializable接口,还有序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。
  • Jackson2JsonRedisSerializer: 使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍,不需要实现Serializable接口。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。 通过查看源代码,发现其只在反序列化过程中用到了类型信息。

使用 FastJson2 来做。重写一些序列化器,并实现RedisSerializer接口。源码如下:

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.50</version>
</dependency>

FastJson2JsonRedisSerializer

package com.vipsoft.base.util;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.alibaba.fastjson2.JSONWriter;
import com.alibaba.fastjson2.filter.Filter;

import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;

import java.nio.charset.Charset;

/**
 * Redis使用FastJson序列化
 * 
 * @author ruoyi
 */
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
{
    /**
     * 自动识别json对象白名单配置(仅允许解析的包名,范围越小越安全)
     */
    public static final String[] JSON_WHITELIST_STR = { "org.springframework", "com.vipsoft" };

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(JSON_WHITELIST_STR);

    private Class<T> clazz;

    public FastJson2JsonRedisSerializer(Class<T> clazz)
    {
        super();
        this.clazz = clazz;
    }

    @Override
    public byte[] serialize(T t) throws SerializationException
    {
        if (t == null)
        {
            return new byte[0];
        }
        return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException
    {
        if (bytes == null || bytes.length <= 0)
        {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);
        return (T)JSON.parseObject(str, clazz, AUTO_TYPE_FILTER);
    }
}

Redis.config

package com.vipsoft.base.config;

import com.cuwor.base.util.FastJson2JsonRedisSerializer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@EnableCaching   //开启缓存功能,作用于缓存配置类上或者作用于springboot启动类上
@Configuration
public class RedisConfig {


    /**
     * 创建一个RedisTemplate实例,用于操作Redis数据库。
     * 其中,redisTemplate是一个泛型为<String, Object>的模板对象,可以存储键值对数据;
     * @param factory   factory是一个Redis连接工厂对象,用于建立与Redis服务器的连接
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);

        // 使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(serializer);

        // Hash的key也采用StringRedisSerializer的序列化方式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);

        template.afterPropertiesSet();
        return template;
    }
}

RedisUtil.java

package com.vipsoft.base.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

@Component
public class RedisUtil {

    @Autowired
    private RedisTemplate redisTemplate;

    public <T> T get(String key) {
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        return operation.get(key);
    }

    public <T> boolean set(String key, T value) {
        try {

            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return false;
    }

}

标签:fastjson2,RedisConfig,springframework,org,import,序列化,com,public
From: https://www.cnblogs.com/vipsoft/p/18556118

相关文章

  • Java序列化
    在Java的世界中,序列化是一个不可或缺的概念,它允许我们将对象的状态保存到文件中,或者通过网络传输到其他JVM实例。作为一名Java技术专家和架构师,深入理解序列化机制对于构建高效、可靠的系统至关重要。本文将带你从基础到高级,全面掌握Java序列化。Java序列化基础什么是序列化......
  • JAVA反序列化学习-CommonsCollections6(基于ysoserial)
    环境准备JDK1.8(8u421)我以本地的JDK8版本为准、commons-collections(3.x4.x均可这里使用3.2版本)cc3.2:<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2</version>&l......
  • 通信协议之序列化 | TLV 编码应用
    注:本文为“通信协议之序列化|TLV编码应用”相关文章合辑。通信协议之序列化2012-07-0715:15:34stevenrao于深圳通信协议可以理解两个节点之间为了协同工作实现信息交换,协商一定的规则和约定,例如规定字节序,各个字段类型,使用什么压缩算法或加密算法等。常见的有tc......
  • JAVA反序列化学习-CommonsCollections5(基于ysoserial)
    环境准备JDK1.8(8u421)我以本地的JDK8版本为准、commons-collections(3.x4.x均可这里使用3.2版本)cc3.2:<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2</version>&l......
  • java中使用Jackson代替fastjson进行序列化处理
    方法详解这里会列出常用方法的详解,更多方法可查阅jacksonapi文档ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构对象转json字符串ObjectMapper通过writeValue系列方法将java对象序列化为json,并将json存储成不同的格式:String(writeVa......
  • JAVA反序列化学习-CommonsCollections4(基于ysoserial)
    环境准备JDK1.8(8u421)这里ysoserial没有提及JDK版本的影响,我以本地的JDK8版本为准、commons-collections4(4.0以ysoserial给的版本为准)、javassist(3.12.1.GA)cc4.0、ClassPool<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections......
  • JAVA反序列化学习-CommonsCollections3(基于ysoserial)
    环境准备JDK1.7(7u80)、commons-collections(3.x4.x均可这里使用3.2版本)JDK:https://repo.huaweicloud.com/java/jdk/7u80-b15/jdk-7u80-windows-x64.exe<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</a......
  • JAVA反序列化学习-CommonsCollections2(基于ysoserial)
    环境准备JDK1.8(8u421)这里ysoserial,我以本地的JDK8版本为准、commons-collections4(4.0以ysoserial给的版本为准)、javassist(3.12.1.GA)cc4.0、ClassPool<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId&......
  • JAVA反序列化学习-CommonsCollections1(基于ysoserial)
    准备环境JDK1.7(7u80)、commons-collections(3.x4.x均可这里使用3.2版本)JDK:https://repo.huaweicloud.com/java/jdk/7u80-b15/jdk-7u80-windows-x64.execc3.2:<dependency><groupId>commons-collections</groupId><artifactId>commons-collection......
  • 金蝶erp反序列化RCE+哥斯拉内存马
    漏洞介绍由于金蝶云星空管理中心在处理序列化数据时,未对数据进行签名或校验,攻击手可以写入包含恶意代码的序列化数据,系统在进行反序列化时造成远程命令执行,该“管理中心“是提供给管理员使用的管理端,默认开放于8000端口。影响版本6.x版本:低于6.2.1012.47.x版本:7.0.352.16至7.......