java - 使用 AWS ElastiCache 客户端作为本地 memcached 服务器

标签 java amazon-elasticache

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

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

最佳答案

我刚刚尝试过同样的事情,我想我已经成功了。看看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;
    }
}

关于java - 使用 AWS ElastiCache 客户端作为本地 memcached 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21715466/

相关文章:

java - DAO 仅用于访问数据库吗?

java - 造成堆污染的 Java 代码的明显正确示例是什么?

java - 将文件中的数字存储到数组中

python - 获取 ElastiCache 标签

JavaFX TreeView 在任何深度匹配给定值找到 TreeItem

java - 如何检查值是否存在/为什么 ResultSet 在 SQLite 中关闭?

java - 我的 Elasticache Redis 节点中的当前连接数不断增加

redis - redis-py 能否可靠地使用 AWS ElastiCache Redis 集群?

java - NotSslRecordException : not an SSL/TLS record