当前位置: 首页 > 知识库问答 >
问题:

访问弹性缓存-Jedis和Spring

高博涉
2023-03-14

我们刚刚开始使用AWS,并要求使用AWS ElasticCache和带有Spring的Redis绝地。Spring数据redis 1.8.8。发布aws java sdk 1.11.228 Spring 4.2.9。释放绝地武士2.9.0

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

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;
}

}

共有1个答案

王子明
2023-03-14

使用AWS弹性缓存(Redis java客户端)spring数据Redis实现缓存。3个主节点和2个从节点,以及使用spring@Cachable和@cacheexecute注释的SSL。请提供任何意见,如果你看到任何问题或它可以以更好的方式完成。

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;
}

}

 类似资料:
  • 如题所示,我正在努力通过EC2实例连接到我的elasticache实例。我有一个orm连接到EC2实例中的redis,但它在我的日志中失败了,所以我登录到EC2实例,尝试手动连接到redis实例,但超时了: < code >无法连接到位于的Redis 它们位于不同的VPC中(弹性缓存实例和EC2实例),但在我的弹性缓存实例的安全组中,我在端口6379处有来自任何来源的自定义TCP入站规则。 哈尔普

  • 关于如何打开缓存有什么建议吗?

  • 我是infinispan的新手,通过实验学习。在尝试访问不同名称的远程缓存失败后,我需要一些帮助。下面是我的infinispan客户端-服务器模式未嵌入的场景。 1) 我在infinispan集群中启动了node1,并将默认远程缓存名称设置为node1\u cache--Hotrod服务器已启动 2) 已在infinispan群集中启动node2,并将默认远程缓存名称设置为node2\u cach

  • 我们正在使用@Cacheable和@CacheEvict来实现缓存。 问题是,构建缓存需要3分钟以上。根据应用程序逻辑,首先清除缓存,然后创建缓存。在此期间,如果有任何用户访问我们的应用程序,应用程序将无法发送数据,因为缓存仍在构建中。 是否有任何spring方法可以首先构建缓存,然后用新缓存替换旧缓存(除了@CachePut之外)。 谢谢,斯里坎特。

  • 问题内容: 谁能给我大概的时间(以纳秒为单位),以访问L1,L2和L3高速缓存以及Intel i7处理器上的主内存? 虽然这不是专门针对编程的问题,但了解某些速度细节对于某些低延迟编程挑战而言是必需的。 问题答案: 这是针对i7和Xeon系列处理器的性能分析指南。我要强调,这是您需要的,还有更多(例如,请查看第22页上的一些时间和周期)。 此外,此页面 还提供了有关时钟周期等的一些详细信息。第二个

  • 在本章中,我们将了解Grav中的性能和缓存概念。 表现(Performance) 术语“性能”指的是系统性能,使其能够处理更高的系统负载并修改系统以处理更高的负载。 考虑以下与Grav表现有关的要点 - 要获得更好的opcache性能,可以使用PHP opcache和usercache 。 opcache适用于PHP 5.4,使用PHP 5.5,PHP 5.6和Zend opcache可以更快地运