SpringBoot项目整合Redis

78 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情


今天接触了SpringBoot整合Redis,过程依旧坎坷,但收获满满。

最初Java项目中使用Jedis整合Redis,但Jedis是线程不安全的,无法进行多线程操作。故后续版本使用Lettuce替代了Jedis,Lettuce底层采用 Netty,实例可以在多个线程中进行共享。

RedisTemplate

SpringBoot项目通过RedisTemplate类进行基本操作

image.png

对象序列化

redis如果直接存储对象,会出现报错的情况,此时需要通过序列化对象来解决。

实体类需要继承序列化接口

image.png

源码

image.png

在源码中,已经预先定义了RedisTemplate方法,但是,这个 RedisTemplate 的泛型是 <Object, Object>,为了方便,需要一个泛型为 <String, Object> 形式的 RedisTemplate。并且,这个 RedisTemplate 没有设置数据存在 Redis 时,key 及 value 的序列化方式。所以可以直接写个配置类,配置 RedisTemplate。

package edu.lnu.recruitment.common.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
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.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
 * @Package: edu.lnu.recruitment.common.config
 * @ClassName: RedisConfig
 * @Author: huangjk
 * @CreateTime: 2022/10/1 11:00
 * @Description:
 */
@Configuration
public class RedisConfig {
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        // 定义泛型为 <String, Object> 的 RedisTemplate
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        // 设置连接工厂
        template.setConnectionFactory(factory);
        // 定义 Json 序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        // Json 转换工具
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 定义 String 序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

坚持学习,继续努力!