一、Spring boot引入redis依赖
Spring boot对redis的支持很好,只需在pom.xml文件中加入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
进入spring-boot-starter-data-redis,最下面可以看到redis所引用的依赖,由以前的jedis变成了lettuce。
jedis和lettuce主要的区别如下:
jedis和lettuce都是redis的客户端
jedis是直接连接Redis server,多线程环境下,是非线程安全的。每个线程都去拿自己的jedis实例,当连接数量增多时,资源消耗比较大。
lettuce的连接是基于Netty的,连接实例可以在多个线程之间共享,当多线程使用同一连接实例时,是线程安全的。
所以,在spring boot新版本中,集成的redis客户端,已经修改为lettuce。
二、配置文件配置
写这一块,是想学习下怎么通过查看spring-boot-autoconfigure包,了解引入工具包怎么在文件中配置属性,而不是通过百度来查找。
如上图,点开spring的自动配置包的spring.factories文件,搜索redis,可以看到redis自动配置的类,点开。
按上面截图,点开RedisProperties类,如下面的截图,定义里在application文件里配置redis连接属性的前缀以及属性名。
所有在spring boot的application文件中如下配置,就可以被源码中redisTemplate识别。
#配置rediszuowe
spring.redis.host=127.0.0.1
spring.redis.port=6379
三、自定义封装redisTemplate
用上面的方法,自动注入原生的redisTemplate来操作redis数据的存储,存储到数据库中的数据,会因为序列化的问题,不方便直接用redis客户端查看,只能通过代码中redisTemplate查询出来(同样的序列化方式反序列化出来),主要原因是原生的redisTemplate选择的是jdk的序列化方式,如下代码截图。
所以需要自定义redisTemplate,重新指定序列方式,方便数据存储到redis后,方便redis客户端查看。一般key使用String的序列化方式,value使用jackson的json结构序列化方式。
@Configuration
public class RedisConfig {
/**
* 创建redisTemplate,key选择String的序列化,value选择json的序列化
* @param factory
* @return
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
//设置json序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance);
//String的序列化
StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();
//key选择String的序列化
redisTemplate.setKeySerializer(stringRedisSerializer);
//value选择jackson序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
//hashKey采用String的序列化
redisTemplate.setHashKeySerializer(stringRedisSerializer);
//hashValue采用jackson序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}