【问题标题】:Use AWS ElastiCache client for local memcached server将 AWS ElastiCache 客户端用于本地 memcached 服务器
【发布时间】:2014-03-10 01:01:24
【问题描述】:

我一直在尝试将 ElastiCache 客户端与安装在 localhost 上的 memcached 服务器一起使用,但没有成功。生产中的 web 应用程序在 AWS env 中运行,但在开发过程中,我想将相同的 ElastiCache 客户端 jar 与我的本地 memcached 服务器一起使用。我目前正在回退使用 spymemcached 客户端 jar 进行开发。

我想避免使用不同的 jar 重新编译应用程序以进行生产和开发。有没有办法配置 ElastiCache 客户端以供 localhost 使用?

【问题讨论】:

  • 我正在为同样的事情苦苦挣扎,并迅速得出答案是“不”的结论......

标签: java amazon-elasticache


【解决方案1】:

我一直在尝试同样的事情,我想我已经成功了。看看Amazon's MemcachedClient 的构造函数。您需要将 clientMode 设置为 ClientMode.Static 以连接到普通的 memcached 服务器或 ClientMode.Dynamic 以通过自动发现连接到 ElastiCache。根据您使用的构造函数,您可以传入一个将 clientMode 设置为静态的 ConnectionFactory,也可以传入一个不包含“.cfg.”的地址。

我使用的是 Spring,所以我创建了一个扩展 MemcachedClientFactoryBean 的类,以在 connectionFactory 上设置 clientMode。

<bean id="memcachedClient" class="au.com.mycompany.MyMemcachedClientFactoryBean">
    <property name="servers" value="${memcached.server}"/>
    <property name="protocol" value="BINARY"/>
    <property name="transcoder">
      <bean class="net.spy.memcached.transcoders.SerializingTranscoder">
        <property name="compressionThreshold" value="1024"/>
      </bean>
    </property>
    <property name="opTimeout" value="1000"/>
    <property name="timeoutExceptionThreshold" value="1998"/>
    <property name="hashAlg">
        <value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value>
    </property>
    <property name="locatorType" value="CONSISTENT"/> 
    <property name="failureMode" value="Redistribute"/>
    <property name="useNagleAlgorithm" value="false"/>
  </bean>

这是我的 FactoryBean

package au.com.mycompany;

import net.spy.memcached.AddrUtil;
import net.spy.memcached.ClientMode;
import net.spy.memcached.ConnectionFactoryBuilder;
import net.spy.memcached.MemcachedClient;
import net.spy.memcached.spring.MemcachedClientFactoryBean;

public class MyMemcachedClientFactoryBean extends MemcachedClientFactoryBean {
    private final ConnectionFactoryBuilder connectionFactoryBuilder = new ConnectionFactoryBuilder();
    private String servers;

    @Override
    public Object getObject() throws Exception {
        if (servers.contains("127.0.0.1")) {
           connectionFactoryBuilder.setClientMode(ClientMode.Static);
        } else {
           connectionFactoryBuilder.setClientMode(ClientMode.Dynamic);
        }
        return new MemcachedClient(connectionFactoryBuilder.build(), AddrUtil.getAddresses(servers));
    }

    @Override
    public void setServers(final String newServers) {
        this.servers = newServers;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 2014-11-18
    • 2017-10-07
    • 2019-09-12
    • 2017-04-24
    • 1970-01-01
    相关资源
    最近更新 更多