模板类的选择
常用的有两个模板类
public RedisTemplate redisTemplate;
public StringRedisTemplate stringRedisTemplate;
首先要根据存入redis库里的数据是否可读来决定采用这两种的哪一种。
redisTemplate
是经过序列化后存储到redis,它的大多数序列化方式包括默认的序列化方式存到库里的数据,都是人不能直接读的,需要从redis中取出来后通过反序列化的方式转成对象再进行操作
stringRedisTemplate
是对redisTemplate的包装,采用的是StringRedisSerializer 来序列化key和value。我们可以直接通过可视化工具来读redis库里的数据。需要注意的是stringRedisTemplate存储的时候只接受string,不是的话会报错。
如果是链接的库中已经有数据了,则要根据库中数据是否可以人直接读来判断使用那种。
通用配置文件
//端口,ip,库,密码
spring.redis.host = ****
spring.redis.port = ****
//redis数据库默认有16个库,注意你要写入那个库
spring.redis.database = ****
spring.redis.password = ****
//超时时间 用于设置Redis连接超时时间。当Redis连接超时时,会抛出JedisConnectionException异常。该属性的默认值为200毫秒(2秒)
spring.redis.timeout = 10s
//最小空闲连接数
spring.redis.lettuce.pool.min-idle = 0
//最大空闲连接数
spring.redis.lettuce.pool.max-idle = 8
//最大连接数
spring.redis.lettuce.pool.max-active = 8
//获取链接等待时间,
spring.redis.lettuce.pool.max-wait = -1ms
2 stringRedisTemplate
(1)依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
然后注入StringRedisTemplate就可以直接使用了,十分简单方便。
新手无脑stringRedisTemplate,简单易操作,事少。如果有速度和空间需求或者库里已经存了字节数据另说。如果没有。直接用。
3 redisTemplate
它提供了以下几种序列化方式
GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: 序列化object对象为json字符串
JdkSerializationRedisSerializer: 序列化java对象
StringRedisSerializer: 简单的字符串序列化,stringRedisTemplate就是使用这种。
优势对比
JdkSerializationRedisSerializer序列化后长度最小,
Jackson2JsonRedisSerializer效率最高。
如果综合考虑效率和可读性,牺牲部分空间,推荐key使用StringRedisSerializer,保持的key简明易读;value可以使用Jackson2JsonRedisSerializer
如果空间比较敏感,效率要求不高,推荐key使用StringRedisSerializer,保持的key简明易读;value可以使用JdkSerializationRedisSerializer
4两种的区别
StringRedisTemplate就是序列化方式都选StringRedisSerializer的redisTemplate。
但是由于redisTemplate可选的key序列化方式的不同,如果你的项目里两种方式都存在的话。
都写入相同的键值对(“key”,"value’)。那么由于StringRedisTemplate直接存字符”key“到redis,
redisTemplate存入序列化后的值到redis,会导致redis认为这个是两个key,用可视化工具观察到的结果分别为字符串“key”和一串序列化后的乱码。除非redisTemplate的key也选用的是StringRedisSerializer的序列化方式。那么两种template的key就没有区别了。
阿里的
FastJson2JsonRedisSerializer,虽然稳定性不如redis提供的,但是很香。
详细代码:
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport
{
@Bean
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
{
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
serializer.setObjectMapper(mapper);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}