SpringBoot整合Redis,配置RedisTemplate序列化。如果使用StringRedisTemplate,那么不需要配置序列化,但是StringRedisTemplate只能存储简单的String类型数据,如图:
如果使用StringRedisTemplate存储一个常规对象,只能转换成JSON字符串存储,取出后再把JSON字符串转成需要的对象,比较麻烦,所以一般使用RedisTemplate。
使用RedisTemplate之前一般需要配置序列化方式,这里以单节点Redis为例:
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
import lombok.extern.slf4j.Slf4j;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis配置
*/
@Slf4j
@Configuration
public class RedisConfig {
/**
* 实例化 RedisTemplate 对象
* 设置序列化方式
* 默认序列化为:JdkSerializationRedisSerializer
* JdkSerializationRedisSerializer 占用空间小,序列化速度慢,客户端可读性差
* GenericJackson2JsonRedisSerializer 占用空间大,序列化速度快,客户端可读性好
*
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
log.info("redisTemplate init. serializer=GenericJackson2JsonRedisSerializer");
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 设置 key 的序列化器 StringRedisSerializer
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
// 设置 value 的序列化器 GenericJackson2JsonRedisSerializer
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* Redis常用方法
*/
@Component
public class RedisCache {
/**
* 1分钟,单位:秒
*/
private static final long ONE_MINUTE = 60;
@Autowired
private RedisTemplate redisTemplate;
/**
* 存储
* @param key 唯一键
* @param value 值
* @param expireTime 过期时间,单位:秒
* @param <T>
*/
public <T> void set(String key, T value, long expireTime) {
redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
}
/**
* 查询
* @param key 唯一键
* @param <T>
* @return
*/
public <T> T get(String key) {
return (T) redisTemplate.opsForValue().get(key);
}
RedisTemplate默认使用的是JDK 序列化方式(JdkSerializationRedisSerializer) ,这种序列化方式可以不用在配置类里配置,默认即可,这种不推荐使用,这种方式对应客户端来说可读性差,不利于人工排查问题。
所以一般用JSON序列化,JSON序列化方式又有两种,GenericJackson2JsonRedisSerializer和Jackson2JsonRedisSerializer,GenericJackson2JsonRedisSerializer配置更简单方便些。
对比一下JDK 序列化和JSON序列化的可读性,如图:
JDK 序列化:
JSON序列化: