SpringBoot+redisCluster封装RedisTemplate,通过RedisTemplate操作Redis,并简单的实现消息队列、发布订阅的功能;
首先导入Maven:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
在springboot的application.properties配置文件中配置redis集群的地址:
#redis
spring.redis.cluster.nodes=10.2.102.244:6379,10.2.102.244:6380,10.2.102.244:6381
下图是我的一个项目结构:
使用@Configuration注解初始化redisCluter配置,返回出一个封装后的RedisTemplate和一个JedisCluster对象用来操作我们redis集群和封装redis的操作命令:RedisCluterConfig类
package pers.ly.learn.redisCluster.config;
import java.lang.reflect.Field;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.RedisNode;
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.serializer.Jackson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisCluterConfig extends CachingConfigurerSupport{
@Value("${spring.redis.cluster.nodes}")
private String clusterNodes;
@Bean(name="clusterConfig")
public RedisClusterConfiguration clusterConfig(){
RedisClusterConfiguration config = new RedisClusterConfiguration();
String[] nodes = clusterNodes.split(",");
for(String node : nodes){
String[] host = node.split(":");
RedisNode redis = new RedisNode(host[0], Integer.parseInt(host[1]));
config.addClusterNode(redis);
}
return config;
}
@Bean(name="factory")
public RedisConnectionFactory factory(RedisClusterConfiguration clusterConfig){
JedisConnectionFactory redisConnectionFactory=new JedisConnectionFactory(clusterConfig);
// String redisPassword = password;
// redisConnectionFactory.setPassword(redisPassword);
redisConnectionFactory.setPoolConfig(createJedisPoolConfig());
redisConnectionFactory.setTimeout(30000);
redisConnectionFactory.setUsePool(true);
return redisConnectionFactory;
}
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template = new StringRedisTemplate(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
/**
* 通过反射获取JedisCluster
* @param factory
* @return
*/
@Bean
public JedisCluster redisCluster(RedisConnectionFactory factory){
Object object =null;
try {
object= getFieldValueByObject(factory,"cluster");
} catch (Exception e) {
e.printStackTrace();
}
return (JedisCluster)object;
}
@Bean
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
};
}
public Object getFieldValueByObject (Object object , String targetFieldName) throws Exception {
// 获取该对象的Class
Class objClass = object.getClass();
// 获取所有的属性数组
Field[] fields = objClass.getDeclaredFields();
for (Field field:fields) {
// 属性名称
field.setAccessible(true);
String currentFieldName = f