访问 ElasticCache - Jedis 和 spring [英] Access ElasticCache - Jedis and spring

查看:36
本文介绍了访问 ElasticCache - Jedis 和 spring的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们刚刚开始使用 AWS,需要将 AWS ElasticCache 与 Redis-jedis 与 Spring 结合使用.Spring-data-redis 1.8.8.RELEASEaws-java-sdk 1.11.228春季 4.2.9.RELEASE绝地武士 2.9.0

We are just starting on AWS and have requirement to use AWS ElasticCache with Redis-jedis with Spring. Spring-data-redis 1.8.8.RELEASE aws-java-sdk 1.11.228 Spring 4.2.9.RELEASE jedis 2.9.0

我能够使用以下代码将数据连接并缓存到本地 redis.我尝试将代码更改为 https://github.com/fishercoder1534/AmazonElastiCacheExample/tree/master/src/main/java ,但没有成功.非常感谢一些指导和一些示例代码的帮助.AWS ElasticCache 当前配置为选项 1,但很快也需要转到选项 2.1. 非复制集群 - Redis 集群禁用,无副本2. 复制集群 - Redis 集群启用和 Redis 集群禁用只读副本.

I was able to connect and cache data to local redis with below code. I have tried making code changes as https://github.com/fishercoder1534/AmazonElastiCacheExample/tree/master/src/main/java , but not been successful. Would really appreciate some guidance and help with some sample code. AWS ElasticCache is currently configured as option 1, but would also need to go to option 2 soon. 1. Non-replicated cluster - Redis cluster-disabled with no replicas  2. Replicated cluster - Redis cluster-enabled and Redis cluster disabled with read replicas.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.Jedis;
import org.springframework.cache.interceptor.KeyGenerator;
import java.lang.reflect.Method;
import java.util.List;

@Configuration
@EnableCaching
// @PropertySource("classpath:/redis.properties")
public class CacheConfig extends CachingConfigurerSupport {
// private @Value("${redis.host}") String redisHost;
// private @Value("${redis.port}") int redisPort;

//@Bean
  public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
      @Override
      public Object generate(Object o, Method method, Object... objects) {
        // This will generate a unique key of the class name, the method name, and all method parameters appended.
        StringBuilder sb = new StringBuilder();
        sb.append(o.getClass().getName());
        sb.append(method.getName());
        for (Object obj : objects) {
          sb.append(obj.toString());
        }
        return sb.toString();
      }
    };
  }


@Bean
public JedisConnectionFactory redisConnectionFactory() {
    JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();

    // Defaults for redis running on Local Docker 
    redisConnectionFactory.setHostName("192.168.99.100");
    redisConnectionFactory.setPort(6379);

    return redisConnectionFactory;
}

@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
    RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
    redisTemplate.setConnectionFactory(cf);
    redisTemplate.setDefaultSerializer(new JdkSerializationRedisSerializer()); 
    return redisTemplate;
}

@Bean
public CacheManager cacheManager(RedisTemplate<String, String> redisTemplate) {
    RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);

    // Number of seconds before expiration. Defaults to unlimited (0)
    cacheManager.setDefaultExpiration(1200);
    cacheManager.getCacheNames().forEach(cacheM-> {System.out.println(cacheM);});
    return cacheManager;
}

}

推荐答案

使用 AWS Elastic Cache + Lettuce(Redis java 客户端)+ spring-data-redis 实现缓存.使用 spring @Cachable 和 @CacheEvict 注释的 3 个主站和 2 个从站和 SSL.如果您发现任何问题或可以以更好的方式完成,请提供任何意见.

Implemented Caching with AWS Elastic Cache + Lettuce (Redis java Client) + spring-data-redis. 3 master with 2 slaves and SSL using spring @Cachable and @CacheEvict annotation. Please provide any inputs if you see any issue or it can be done in a better way.

Spring  4.3.12.RELEASE
Spring-data-redis   1.8.8.RELEASE
aws-java-sdk    1.11.228
Lettuce (Redis java Client) 4.4.2.Final

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
long expirationDate = 1200;

static AWSCredentials credentials = null;
static {
    try {
        //credentials = new ProfileCredentialsProvider("default").getCredentials();
        credentials = new SystemPropertiesCredentialsProvider().getCredentials();
    } catch (Exception e) {
        System.out.println("Got exception..........");
        throw new AmazonClientException("Cannot load the credentials from the credential profiles file. "
                + "Please make sure that your credentials file is at the correct "
                + "location (/Users/USERNAME/.aws/credentials), and is in valid format.", e);
    }       
}

@Bean
public LettuceConnectionFactory redisConnectionFactory() {
    AmazonElastiCache elasticacheClient = AmazonElastiCacheClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(credentials)).withRegion(Regions.US_EAST_1).build();
    DescribeCacheClustersRequest dccRequest = new DescribeCacheClustersRequest();
    dccRequest.setShowCacheNodeInfo(true);

    DescribeCacheClustersResult clusterResult = elasticacheClient.describeCacheClusters(dccRequest);

    List<CacheCluster> cacheClusters = clusterResult.getCacheClusters();
    List<String> clusterNodes = new ArrayList <String> ();
    try {
        for (CacheCluster cacheCluster : cacheClusters) {
            for (CacheNode cacheNode : cacheCluster.getCacheNodes()) {
                String addr = cacheNode.getEndpoint().getAddress();
                int port = cacheNode.getEndpoint().getPort();
                String url =  addr + ":" + port;
                if(<CLUSTER NAME>.equalsIgnoreCase(cacheCluster.getReplicationGroupId()))
                    clusterNodes.add(url);  
            }
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
    LettuceConnectionFactory redisConnectionFactory = new LettuceConnectionFactory(new RedisClusterConfiguration(clusterNodes));
    redisConnectionFactory.setUseSsl(true);
    redisConnectionFactory.afterPropertiesSet();
    return redisConnectionFactory;
}

    @Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
    RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
    redisTemplate.setConnectionFactory(cf);
    redisTemplate.setDefaultSerializer(new JdkSerializationRedisSerializer()); 
    return redisTemplate;
}

@Bean
public CacheManager cacheManager(RedisTemplate<String, String> redisTemplate) {
    RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);

    // Number of seconds before expiration. Defaults to unlimited (0)
    cacheManager.setDefaultExpiration(expirationDate);
    cacheManager.setLoadRemoteCachesOnStartup(true);
    return cacheManager;
}

}

这篇关于访问 ElasticCache - Jedis 和 spring的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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