本文介绍了访问 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.RELEASEaws-java-sdk 1.11.228Spring 4.2.9.RELEASEjedis 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-03 12:32