持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
今天接触了SpringBoot整合Redis,过程依旧坎坷,但收获满满。
最初Java项目中使用Jedis整合Redis,但Jedis是线程不安全的,无法进行多线程操作。故后续版本使用Lettuce替代了Jedis,Lettuce底层采用 Netty,实例可以在多个线程中进行共享。
RedisTemplate
SpringBoot项目通过RedisTemplate类进行基本操作
对象序列化
redis如果直接存储对象,会出现报错的情况,此时需要通过序列化对象来解决。
实体类需要继承序列化接口
源码
在源码中,已经预先定义了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;
}
}
坚持学习,继续努力!