Redis 集群与 Spring Boot 集成 [英] Redis cluster integration with Spring boot

查看:54
本文介绍了Redis 集群与 Spring Boot 集成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 redis 集群,其中包含主服务器、从服务器和 3 个哨兵服务器.主从映射到 dns 名称为 node1-redis-dev.com, node2-redis-dev.com.redis服务器版本为2.8

I have a redis cluster with master, slave and 3 sentinel servers. The master and slave is map to dns names as node1-redis-dev.com, node2-redis-dev.com. The redis server version is 2.8

我将以下内容包含在我的 application.properties 文件中.

I include below in my application.properties file.

spring.redis.cluster.nodes=node1-redis-dev.com:6379,node2-redis-dev.com:6379
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=-1
spring.redis.pool.max-wait=-1

但是当我检查 StringRedisTemplate 时,我在 JedisConnectionFactory 的 hostName 属性下看到 localhost 而不是集群信息.

But when I inspect the StringRedisTemplate, I see localhost instead of cluster information under hostName property of JedisConnectionFactory.

我也在 JedisPool 的 creationStackTrace 属性中看到了异常.

Also I see the exception in creationStackTrace property of JedisPool.

java.lang.Exception
    at org.apache.commons.pool2.impl.BaseGenericObjectPool.<init>(BaseGenericObjectPool.java:139)
    at org.apache.commons.pool2.impl.GenericObjectPool.<init>(GenericObjectPool.java:107)
    at redis.clients.util.Pool.initPool(Pool.java:43)
    at redis.clients.util.Pool.<init>(Pool.java:31)
    at redis.clients.jedis.JedisPool.<init>(JedisPool.java:80)
    at redis.clients.jedis.JedisPool.<init>(JedisPool.java:74)
    at redis.clients.jedis.JedisPool.<init>(JedisPool.java:55)
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.createRedisPool(JedisConnectionFactory.java:228)
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.createPool(JedisConnectionFactory.java:204)

CasheRepository 类如下所示,

The CasheRepository class looks like below,

@Component
@CacheConfig(cacheNames = "enroll", cacheManager = "enrollCM")
public class EnrollCashRepository {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;    
    //Other methods 
}

我使用的是 spring boot 1.3.4 和 spring-boot-starter-redis 1.2.7,它导入了 jedis 2.7.3 依赖项.

I am using spring boot 1.3.4 with spring-boot-starter-redis 1.2.7 which import jedis 2.7.3 dependency.

将 redis 集群与 Spring Boot 应用程序集成在一起,我缺少什么?

What am I missing with integrate redis cluster with Spring boot applicatiom?

推荐答案

以下应该有效

application.properties

application.properties

spring.redis.cluster.nodes=127.0.0.1:6379
spring.redis.cluster.max-redirects=3

ClusterConfigurationProperties.java

ClusterConfigurationProperties.java

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class ClusterConfigurationProperties {

/*
 * spring.redis.cluster.nodes[0] = 127.0.0.1:7379 spring.redis.cluster.nodes[1]
 * = 127.0.0.1:7380 ...
 */
private List<String> nodes;
/**
 * spring.redis.cluster.max-redirects=3
 */
private int maxRedirects;

/**
 * Get initial collection of known cluster nodes in format {@code host:port}.
 *
 * @return
 */
public List<String> getNodes() {
    return nodes;
}

public void setNodes(List<String> nodes) {
    this.nodes = nodes;
}

public int getMaxRedirects() {
    return maxRedirects;
}

public void setMaxRedirects(int maxRedirects) {
    this.maxRedirects = maxRedirects;
}

}

RedisConfig.java

RedisConfig.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import io.lettuce.core.ReadFrom;

@Configuration
public class RedisConfig {

@Autowired
private ClusterConfigurationProperties clusterProperties;

@Bean
LettuceConnectionFactory redisConnectionFactory(RedisClusterConfiguration redisConfiguration) {

    LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
            .readFrom(ReadFrom.REPLICA_PREFERRED).build();

    return new LettuceConnectionFactory(redisConfiguration, clientConfig);
}

@Bean
RedisClusterConfiguration redisConfiguration() {
    RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(clusterProperties.getNodes());
    redisClusterConfiguration.setMaxRedirects(clusterProperties.getMaxRedirects());

    return redisClusterConfiguration;
}

@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@Primary
RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    template.setKeySerializer(new StringRedisSerializer());
    // other settings...
    return template;
}
}

这篇关于Redis 集群与 Spring Boot 集成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆