我一直在尝试将ElastiCache客户端与安装在localhost上的memcached服务器一起使用,但均未成功。该Webapp在生产中运行在AWS env中,但是在开发过程中,我想将同一个ElastiCache客户端jar与本地memcached服务器一起使用。我目前正在使用spymemcached客户端jar进行开发。
我想避免使用不同的jar重新编译应用程序以进行生产和开发。有没有一种方法可以配置ElastiCache客户端供本地主机使用?
最佳答案
我一直在尝试同样的事情,而且我想我已经在做。看看Amazon's MemcachedClient的构造函数。您需要将clientMode设置为ClientMode.Static以连接到普通的内存缓存服务器,或者将ClientMode.Dynamic设置为通过自动发现连接到ElastiCache。根据使用的构造函数,您可以传入一个将clientMode设置为static的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;
}
}