Spring Boot2.x集成Redis(两种方式)

前言:

本文介绍下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实例操作多个数据库的配置方式,希望这两种方式能够帮到你。


版权声明:本文为x541211190原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。