0

任何人都可以建议任何设计模式来动态区分 java 代码中的 memcahce 实例吗?

以前在我的应用程序中只有一个以这种方式配置的 memcache 实例

第1步:

dev.memcached.location=33.10.77.88:11211

dev.memcached.poolsize=5

第2步:

然后我在代码中访问该内存缓存,如下所示,

private MemcachedInterface() throws IOException {

    String location =stringParam("memcached.location", "33.10.77.88:11211");

    MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(location));

}

然后我使用上面的 MemcachedInterface() 在代码中调用该 memcache,如下所示,

第 3 步:

MemcachedInterface.getSoleInstance();

然后我使用该 MemcachedInterface() 来获取/设置数据,如下所示,

MemcachedInterface.set(MEMCACHED_CUTS, "{}"); resp = MemcachedInterface.gets(MEMCACHED_CUTSS);

我的问题是如果我在我们的架构中引入一个新的 memcache 实例,配置如下,

第1步:

dev.memcached.location=33.10.77.89:11211 dev.memcached.poolsize=5

因此,第一个 memcache 实例位于 33.10.77.88:11211 中,第二个 memcache 实例位于 33.10.77.89:11211 中

直到这没问题……但是……

这种情况下如何处理Step-2和Step-3,动态获取MemcachedInterface。

1)我是否应该在步骤 2 中再使用一个名为 MemcachedInterface2() 的接口

现在真正的问题来了,

我的应用程序中有 4 个网络服务器。以前都在写入 MemcachedInterface(),但现在我将介绍另外一个 memcache 实例,例如:MemcachedInterface2() ws1 和 ws2 应该写入 MemcachedInterface(),ws3 和 ws4 应该写入 ex :MemcachedInterface2()

所以,如果我使用上面提到的另一个名为 MemcachedInterface2() 的接口,

这是一个代码负担,因为我应该将所有使用 WS3 和 WS4 的类更改为 Ex:MemcachedInterface2() 。

任何人都可以建议一种代码更改有限的方法吗?

4

3 回答 3

0

xmemcached 支持一致散列,这将允许您的客户端从池中选择正确的 memcached 服务器实例。您可以参考这个答案以获得更多详细信息客户端是否需要担心多个内存缓存服务器?

所以,如果我理解正确,你将不得不

  1. 在所有 webapps 中只使用一个 memcached 客户端
  2. 由于您在 memcached 客户端周围有自己的包装类MemcachedInterface,因此您必须向此接口添加一些方法,以便将服务器添加/删除到现有客户端。请参阅用户指南(向下滚动一点):https ://code.google.com/p/xmemcached/wiki/User_Guide#JMX_Support
于 2012-10-09T11:42:35.143 回答
0

据我所知,您在不同的机器上运行重复的代码,就像并行 Web 服务一样。因此,我建议这样做以区分每个;

  1. 使用 Singleton Facade 服务来包装你的 memcached 客户端。(我想你已经在这样做了)
  2. 使用封装。封装您的 memcached 客户端以与您的代码分离。interface L2Cache
  3. 对于每个服务器,在全局变量中为它们命名。通过 JVM 或您自己的配置文件通过 jar 或其他方式分配这些值。虚拟机:--Dcom.projectname.servername=server-1
  4. 使用这个全局变量作为参数,配置你的 Service getInstance 方法。
public static L2Cache getCache() { 
if (System.getProperty("com.projectname.servername").equals("server-1"))
   return new L2CacheImpl(SERVER_1_L2_REACHIBILITY_ADDRESSES, POOL_SIZE);
}

祝你的设计好运!

于 2012-10-09T11:54:19.907 回答
0

您应该在配置中将所有 memcached 服务器实例以空格分隔。

例如 33.10.77.88:11211 33.10.77.89:11211

因此,在您的代码中(Step2):

private MemcachedInterface() throws IOException 
{
    String location =stringParam("memcached.location", "33.10.77.88:11211 33.10.77.89:11211");
    MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(location));
}

然后在第 3 步中,您无需更改任何内容...例如MemcachedInterface.getSoleInstance();.

You can read more in memcached tutorial article:

Use Memcached for Java enterprise performance, Part 1: Architecture and setup http://www.javaworld.com/javaworld/jw-04-2012/120418-memcached-for-java-enterprise-performance.html

Use Memcached for Java enterprise performance, Part 2: Database-driven web apps http://www.javaworld.com/javaworld/jw-05-2012/120515-memcached-for-java-enterprise-performance-2.html

于 2012-10-25T22:49:54.130 回答