前言:
本文介绍下Spring Boot2.x版本下使用Redis的方式,较1.x版有些许改变。本文介绍两种方式来配置,第一种是快速配置,1分钟完成配置。第二种方式,支持定义定义多个Redis实例,可同时操作不同的RedisDB,不会因为线程不安全紊乱,读写错数据库。你可以根据自己需求,选择如何集成Redis。
方式一:Spring Boot2.x1分钟快速集成Redis方式
1.引入Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.注入RedisTemplate使用
import org.springframework.data.redis.core.RedisTemplate;
@Component
public class HelloClass {
@Autowired
private RedisTemplate<String, String> redisTemplate;
private void hello(){
Object object = redisTemplate.opsForHash().get("你的Key", "你的HashKey");
}
}
方式二:通过配置文件配置Redis
此种方式的优点是可以详情配置Redis
1.引入Maven依赖
需要添加两个依赖,排除掉io.lettuce
,并且添加Jedis,2.x版以后,spring boot起步依赖中的jedis被移除了,所以要手动添加回来。
<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>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2.配置文件增加Redis相关参数
# 地址、密码、端口、默认数据库
spring.redis.host=10.10.15.1
spring.redis.password=123456
spring.redis.port=6379
spring.redis.database=0
#最大连接数
spring.redis.pool.max-active=20
#最大空闲
spring.redis.pool.max-idle=20
#最小空闲
spring.redis.pool.min-idle=0
#最大阻塞等待时间(负数表示没限制)
spring.redis.pool.max-wait=-1
3.创建Redis配置类,配置多个RedisDB实例
Redis可以配置单机版、哨兵版、集群,你需要确定你的服务器是单机版的主从配置,还是集群模式。 选择模式不同,模式配置类也不一样,如单机版配置类是RedisStandaloneConfiguration
。在此以单机版为例展示:
本步骤意在实现多个Redis实例(代码中的database0
,database1
),每一个实例对应一个RedisDB数据库,这样当不同人使用不同的实例,就不会出现数据读写串了库的问题。因为Redis是默认是单例的,我们来手动做出多个实例,每个实例对应一个库,这样就可以避免线程不安全问题了。
package com.hello.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import redis.clients.jedis.JedisPoolConfig;
/**
* Redis数据源配置类
* @Title
* @description
* @author 五道口
*
*/
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String hostName;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.pool.max-active}")
private int maxTotal;
@Value("${spring.redis.pool.max-wait}")
private long maxWaitMillis;
/**
* 创建Redis DB0对应的实例
*/
@Bean
public StringRedisTemplate database0() {
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(jedisClientFactory());
return temple;
}
/**
* 创建Redis DB1对应的实例
*/
@Bean
public StringRedisTemplate database1() {
StringRedisTemplate temple = new StringRedisTemplate();
temple.setConnectionFactory(jedisClientFactory());
return temple;
}
@Bean
public JedisConnectionFactory jedisClientFactory() {
// 单机版配置
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
// 设置redis地址
redisStandaloneConfiguration.setHostName(hostName);
// 设置默认使用的数据库
redisStandaloneConfiguration.setDatabase(0);
// 设置密码
redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
// 设置端口号
redisStandaloneConfiguration.setPort(port);
// 获得默认的连接池构造器
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jedisConf = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration
.builder();
// 指定jedisPoolConifig来修改默认配置
jedisConf.poolConfig(jedisPoolConfig());
JedisClientConfiguration jedisClientConfiguration = jedisConf.build();
return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
}
/**
* 连接池配置信息
* @return
*/
@Bean
public JedisPoolConfig jedisPoolConfig() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接数
jedisPoolConfig.setMaxTotal(maxTotal);
// 最大空闲连接数
jedisPoolConfig.setMaxIdle(maxIdle);
// 当池内没有可用的连接时,最大等待时间(负数表示没限制)
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
return jedisPoolConfig;
}
}
4.使用不同RedisTemplate实例
package com.hello.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
@Component
public class RedisTemplateServcie {
// 这个实例对应Redis DB0
@Autowired
@Qualifier("database0")
private RedisTemplate<String, String> database0;
public RedisTemplate<String, String> getDB0() {
return database0;
}
// 这个实例对应Redis DB1
@Autowired
@Qualifier("database1")
private RedisTemplate<String, String> database1;
public RedisTemplate<String, String> getDB1() {
return database1;
}
}
本例只展示两个数据,你还要增加其他数据库实例,自己按照上述方式,增加就好了。
5.如何使用?
@Component
public class HelloClass {
// 在需要使用的地方注入RedisTemplateServcie
@Autowired
RedisTemplateServcie redisTemplateServcie;
private void hello(){
RedisTemplate db0 = redisTemplateServcie.getDB0();
Object object = db0.opsForHash().get("你的Key", "你的HashKey");
}
}
总结
本文完成了对两种Spring Boot2.x集成Redis方式的介绍,如果你只需要对一个数据库简单的读写,第一种方式,一分钟即可配置完成使用。但如果你需要操作多个Redis数据库,并且存在并发的情况,最好用第二种方式,多个Redis实例操作多个数据库的配置方式,希望这两种方式能够帮到你。