目录
一、背景
最近在写springboot系列相关的东西,Redis在目前的互联网开发中几乎是一个绕不过的话题,目前在做的管理系统也用的到。之前的用法是一切都自己封装,spring只发挥容器的作用就好了,随着spring全家桶技术的日渐完善以及目前大众的使用习惯,之前的写法感觉有点跟不上时代,有时还会被嘲笑。但是性能这块是否能扛得住以后再说。今天带大家一起看看如何集成,并对基本使用习惯做一个说明。
二、操作步骤
1.jar依赖导入
<!--springboot对Redis的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- jedis客户端引入-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.3.0</version>
</dependency>
<!--连接池的引入 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
总结:
- spring-boot-starter-data-redis默认引入lettuce客户端,这里使用jedis客户端,所以屏蔽lettuce依赖
- 连接池使用pool2,springboot集成了连接池的设置,不需要像以前那样初始化连接池的配置。在配置文件中配置连接池属性就会生效,这一点大家要注意下。
2.配置管理
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer=new StringRedisSerializer();
// 设置String类型的value的序列化规则和 key的序列化规则
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置hash类型的value的序列化规则和 key的序列化规则
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
总结:
- 首先我没有开启注解,需要注解的小伙伴们可以开启,@EnableCaching。
- 我个人不太习惯完全注解化,在实际开发过程中需要对Redis的过程做调试,注解的感觉不方面,还是推荐自己多写写,一家之言仅供参考。
- 关于系列化,这里仅拿json做一个演示,也支持其他方式。
3.配置文件
#redis配置,使用jedis客户端
#Redis服务器地址
spring.redis.host=localhost
#Redis服务器连接端口
spring.redis.port=6379
#Redis数据库索引(默认为0)
spring.redis.database=0
spring.redis.ssl=false
##以下为连接池属性,如果配置就加载连接池,如果没有配置就是单例模式
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=50
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=20
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=2
#连接池最大阻塞等待时间(使用负值表示没有限制)(毫秒)
spring.redis.jedis.pool.max-wait=3000
#空闲链接检测线程检测周期。如果为负值,表示不运行检测线程。(单位:毫秒,默认为-layer)
spring.redis.jedis.pool.time-between-eviction-runs=6000
#连接超时时间(毫秒)
spring.redis.timeout=5000
总结:
- 上面配置是个单实例使用连接池版本
- 集群版的后面补充
- 再强调一下,连接池信息有声明就生效,没声明不生效
- 上面连接池参数不是最优的设置,仅仅拿来说明问题。以后开专题做专门介绍
4.具体使用
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
RedisTemplate redisTemplate;
@GetMapping(value = {"/haha"})
public String getUser(){
User user= new User();
user.setName("name");
user.setPassword("password");
//存储对象
redisTemplate.opsForValue("bbb",user);
//取对象,强转之前要先做判null操作,不然报错,我这里就不操作了。
user= (User) redisTemplate.opsForValue().get("bbb");
log.info(user.toString());
return "hahah";
}
}
- springboot提供了两个模板,RedisTemplate<Object,Object> 和StringRedisTemplate,看名知意。
- 使用RedisTemplate<Object,Object> 需要声明序列化和实例化对象,如上“配置管理”。
- 一般使用习惯是要封装一个RedisUtil工具类,需要做几次转换(如上)。这里就看出没有直接使用jedis方便。看个人习惯吧!
三、总结
- springboot集成Redis的方案有好多,至于哪个是最好的,我觉得适合自己的就最好。
- 使用springboot集成好的,优点是书写时简单了,缺点就是什么也看不到了。