如何在ElastiCache中缓存来自Amazon S3的String?

时间:2015-05-20 19:38:48

标签: java multithreading amazon-web-services amazon-s3 amazon-elasticache

我需要在并发多线程环境中从Amazon S3获取一些字符串资源。我想使用Amazon ElastiCache实现缓存。本质上我想实现这样的方法:

String getSomething(key) {
    String something = elastiCache.get(key);
    if (something == null) {
        something = s3.get(key);
        elastiCache.put(key, something);
    }
    return something;
}

问题是在并发环境中,像这样的代码是竞争条件的主体。如果密钥在elastiCache中到期,多个线程将尝试从s3获取它并将其放回elastiCache。避免它的最简单方法是对方法进行同步。这不是最佳的,因为对getSomething的所有调用都将是交错的,并且当值在elastiCache中时将导致情况变慢。我在MemcachedClient上找到了CAS方法:gets / asyncGets和/ asyncCAS。使用这种方法,我可以使它只有在elastiCache中找不到密钥的线程才会将其放回原处。但有没有一种方法可以避免从多个线程访问s3,而不是使用synchronized?

1 个答案:

答案 0 :(得分:0)

双重检查锁怎么样?像这样:

String getSomething(key) {
    String something = elastiCache.get(key);
    if (something == null) {
        synchronized(this) {
            something = elastiCache.get(key);
            if (something == null) {
                something = s3.get(key);
                elastiCache.put(key, something);
            }
        }
    }
    return something;
}