Spring Boot项目系列(6)集成redis,根据fastjson,构建序列化方式

前言

项目中的缓存,目前使用最广泛的缓存数据库,我想就是redis了,redis作为一个基于内存的非关系型数据库,实现了分布式部署,实现了数据持久化,具有高可用,高性能的特点。本项目使用了springboot框架,集成了redis进行简单的使用,并配置自己的RedisTemplate,SpringBoot连接redis有默认的生态,连接成功后我们一般适应RedisTemplate对象来操作redis,RedisTemplate直接加入在spring的生态环境当中,我们在springboot项目中可以直接注入使用。但是springboot连接redis的默认RedisTemplate是RedisTemplate<Object,Object>,默认的序列化方式满足不了我们的使用,我们希望将在java代码里面的代码的对象存入redis时,使用的是json字符串的格式存储在redis中,而不是一串谁都看不懂的二进制码,在读取的时候可以直接使用java中的对象接收,redis中存储的字符串。

项目架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F5T1YH05-1604365452082)(C:\Users\swj\AppData\Roaming\Typora\typora-user-images\image-20201030144430033.png)]

项目jar包引入
<properties>
    <java.version>1.8</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <spring-boot.version>2.3.0.RELEASE</spring-boot.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--原生redis连接包-jedis-->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.2.0</version>
    </dependency>
    <!--redis集成springboot的配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
   <!--序列化配置包-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.47</version>
    </dependency>
    <!--使用lettuce连接池-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>

</dependencies>
项目配置
# 应用名称
spring.application.name=redis


# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=192.168.44.128
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=1000

springboot自我实现连接redis的jar包,直接加入使用即可,值得注意的是,springboot连接jar的底层连接池,在当前版本较高的springboot项目,redis连接池我们有2种选择,jedis和lettuce

集成redis

1.创建redis配置类-RedisConfiguration

重新注入自己的模板

@Configuration
public class RedisConfiguration {

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        //连接redis模板
        RedisTemplate<String,Object> template = new RedisTemplate<String,Object>();
        template.setConnectionFactory(factory);

        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //加入自己的序列化方式
        FastJson2JsonRedisSerializer fastJsonRedisSerializer = new FastJson2JsonRedisSerializer(Object.class);

        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);

        template.setKeySerializer(stringRedisSerializer);
        template.setHashKeySerializer(stringRedisSerializer);
        return template;

    }
}

2.使用fastjson创建自己的序列化方式,上一个类需要使用到-FastJson2JsonRedisSerializer

public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {

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

    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, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        //加入本配置,否则在解析的时候会报错
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
        if (bytes == null || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);

        return (T) JSON.parseObject(str, clazz);
    }
}

3.测试使用-RedisService

@Service
public class RedisService {

    private Logger logger = LoggerFactory.getLogger(RedisService.class);

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    public void setString(){
        User user = new User();
        user.setPassword("123");
        user.setUsername("swj");
        redisTemplate.opsForValue().set("mystringkey",user);
        User ss = (User) redisTemplate.opsForValue().get("mystringkey");
        logger.info("String测试:{}",ss.toString());
    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值