springboot整合redisTemplate
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<guava-version>27.0-jre</guava-version>
<jedis-version>2.9.0</jedis-version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--引入模板引擎的相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- springboot整合redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava-version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8.1</version>
</dependency>
</dependencies>
在整合的时候,我想起来,以前都是配置连接池,后来都是直接配置RedisConnectionFactory,然后试了一下,加入没有jedis的pom配置,会报如下错误:
Caused by: org.springframework.beans.factory.BeanCreationException:
Error creating bean with name ‘taskConnectionFactory’ defined in class
path resource [net/rdd/config/TaskServiceConfig.class]: Bean
instantiation via factory method failed; nested exception is
org.springframework.beans.BeanInstantiationException: Failed to
instantiate
[org.springframework.data.redis.connection.RedisConnectionFactory]:
Factory method ‘taskConnectionFactory’ threw exception; nested
exception is java.lang.NoClassDefFoundError:
org/apache/commons/pool2/impl/GenericObjectPoolConfig
尽管试了一下,发现必须要配置jedis的配置,然后看了一下源码:发现factory内部是维护了一个连接池,后期整理一下;
然后是连接的配置类:
package net.rdd.config;
import net.rdd.listener.RedisMessageListener;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisPassword;
import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.scripting.support.ResourceScriptSource;
@Configuration
public class RedisServiceConfig {
@Value("${redis.task.host}")
private String redisHost;
@Value("${redis.task.port}")
private int redisPort;
@Value("${redis.task.pass}")
private String redisPass;
@Value("${redis.task.db}")
private int redisDb;
@Bean
@Primary
public RedisConnectionFactory taskConnectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setPort(redisPort);
connectionFactory.setHostName(redisHost);
connectionFactory.setDatabase(redisDb);
connectionFactory.setPassword(redisPass);
return connectionFactory;
}
@Bean
public RedisTemplate taskRedisTemplate() {
RedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(taskConnectionFactory());
return template;
}
@Bean
public RedisConnectionFactory rddConnectionFactory() {
// 推荐使用
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setPort(redisPort);
redisStandaloneConfiguration.setHostName(redisHost);
redisStandaloneConfiguration.setDatabase(3);
redisStandaloneConfiguration.setPassword(RedisPassword.of(redisPass));
JedisConnectionFactory redisStandaloneConfigurationFactory = new JedisConnectionFactory(redisStandaloneConfiguration);
// JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
// connectionFactory.setPort(redisPort);
// connectionFactory.setHostName(redisHost);
// connectionFactory.setDatabase(3);
// connectionFactory.setPassword(redisPass);
//
//todo something wrong
/**
* org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
*/
// JedisShardInfo jedisShardInfo = new JedisShardInfo(redisHost,redisPort );
// jedisShardInfo.setConnectionTimeout(10000);
// jedisShardInfo.setSoTimeout(10000);
// jedisShardInfo.setPassword(redisPass);
// JedisConnectionFactory jedisShardInfoFactory = new JedisConnectionFactory(jedisShardInfo);
return redisStandaloneConfigurationFactory;
}
@Bean("rddRedisTemplate")
public StringRedisTemplate rddRedisTemplate() {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(rddConnectionFactory());
// RedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// RedisSerializer stringRedisSerializer = new StringRedisSerializer();
// // key 的序列化采用 StringRedisSerializer
// template.setKeySerializer(stringRedisSerializer);
// template.setHashKeySerializer(stringRedisSerializer);
// // value 值的序列化采用 GenericJackson2JsonRedisSerializer
// template.setValueSerializer(genericJackson2JsonRedisSerializer);
// template.setHashValueSerializer(genericJackson2JsonRedisSerializer);
return template;
}
@Bean
public RedisScript<Boolean> lockScript() {
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/redis-lock.lua")));
redisScript.setResultType(Boolean.class);
return redisScript;
}
@Bean
public RedisScript<Boolean> unlockScript() {
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<Boolean>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/redis-unlock.lua")));
redisScript.setResultType(Boolean.class);
return redisScript;
}
@Bean
//key过期监听,指定数据库
RedisMessageListenerContainer keyExpirationListenerContainer(RedisMessageListener listener) {
RedisMessageListenerContainer listenerContainer = new RedisMessageListenerContainer();
listenerContainer.setConnectionFactory(taskConnectionFactory());
listenerContainer.addMessageListener(listener, new PatternTopic("__keyevent@" + redisDb + "__:expired"));
return listenerContainer;
}
}
然后具体使用,注入对应的类就好了:
@Autowired
@Qualifier(value = "taskRedisTemplate")
private RedisTemplate taskRedisTemplate;
@Autowired
@Qualifier(value = "rddRedisTemplate")
private RedisTemplate rddRedisTemplate;
@Test
public void test02() {
taskRedisTemplate.opsForValue().set("dssd","fdsfds");
rddRedisTemplate.opsForValue().set("322","ewew");
}
这样,简单的配置就好了.源码参考地址:https://github.com/stackXu/SpringBootRedis