【问题标题】:One Memcached server for many clients一个用于多个客户端的 Memcached 服务器
【发布时间】:2012-01-05 17:04:57
【问题描述】:

我们有 2 个应用服务器(coldfusion / Java)和一个 memcached。 我想像这样设置我的 memcached 服务器/客户端。当服务器 1 为密钥添加值时,它应该也可用于服务器 2。并且以相反的方式也可以。

现在,当我在服务器 1 上为键添加值时,它在第二台服务器上不可读或不可编辑。 如何设置

我使用spymemcached 作为客户端库。

感谢您的帮助

【问题讨论】:

  • 首先我要指出的是,memcached 和 spymemcached 都非常可靠,每天都有成千上万的人使用。您还尝试做一些非常基本的事情,这些事情在测试期间很容易被捕获,或者 spymemcached 或 memcached 这让我相信您的代码中存在错误。你可以在这里发布代码吗?另外,如果您使用的是 2.7 系列的 spymemcached,您可以从返回给您的 Future 中调用 getStatus() 函数来查看您的请求中是否有错误。

标签: java coldfusion memcached spymemcached


【解决方案1】:

要么:

A.您没有为服务器 1 和服务器 2 为同一个对象使用相同的密钥。

B.您不是在与服务器 1 和服务器 2 的同一个 memcached 实例通信

C.您为该对象提供了如此短的生命周期,以至于它在其他服务器可以利用它之前就过期了。

【讨论】:

  • A - 键相同 B - 只有一个内存缓存实例 C - 寿命为 3600 并且值在第一台服务器上可用
  • 我断言某处存在错误。假设您使用的是 Memcached 和 Spymemcached 的稳定版本,这不会留下很大的回旋余地。我会退后一步,回到基础。创建一个简单的 Java 类,其中包含插入/检索值的 main。在不同的机器上运行它以确保它正常工作。使用 Wireshark 绝对确保您传递的是相同的密钥。使用 memcached 可用的命令行工具检查内容。例如,从两台服务器插入相同的值并运行“stats items”。它有 1 把钥匙还是 2 把钥匙?
  • 只有一个ke,现在是'test'。我在一台服务器上插入值,而在另一台服务器上它是“未定义的”。当我尝试在其他服务器上使用 ADD 覆盖它时,我收到状态“OperationStatus success=false: NOT_STORED”。
  • 您确定他们正在与同一个实例交谈吗?这听起来不对。
  • 只有一个实例。我将在星期一在更多服务器上对其进行测试。我认为 memcached 服务器的版本对于当前版本的 spymemcached 客户端来说可能太旧了。我知道 Coldfusion 的不同版本在服务器上可能是个问题。
【解决方案2】:

看起来这是一个相当年轻的 Memcached 实现,这可能是一个错误。你可以在这里提交:http://code.google.com/p/spymemcached/issues/list

如果你不认为这是一个错误,你能发布一个调用 Memcached 的代码的 sn-p 吗?

另外,请记住,memcached 应被视为不可靠且非持久性存储。您应该编写代码,就好像您期望它会下降,甚至可能返回空结果一样。

【讨论】:

  • 这可能是旧版本的 memcached 引擎中的错误吗?因为我在 Windows 下使用它,我发现的唯一工作版本是 1.2.4(如果我没记错的话)
【解决方案3】:

一切都以正确的方式设置,但是设置一个复杂的值(结构或数组)会使这些键/值对对其他服务器不可用。 现在我将所有值序列化为 JSON,它工作正常。也许在 Memcached 1.4.5 版本中它已更改,但对于 1.2.6 版本,序列化值是修复它的好方法。

<!--- Setting up Memcached Client --->
<!--- Add code in OnApplicationStart in Application.cfc --->
<cfset AU = createObject("java", "net.spy.memcached.AddrUtil").init() />
<cfset Application.MemCacheD  = createObject("java", "net.spy.memcached.MemcachedClient").init(AU.getAddresses("127.0.0.1:11211")) />
<!--- Adding values: --->
<cfset memCacheName = "myKey" />
<cfset myValue = StructNew() />
<cfset myValue['var1'] = 'var1 value' />
<cfset Application.MemCacheD.add(memCacheName, 3600, serializeJSON(myValue)) />
<!--- Getting values: --->
<cfset memCacheName = "myKey" />
<cfset MemCachedRet = Application.MemCacheD.get(memCacheName) />
<cfif isDefined('MemCachedRet')>
    <!--- value is available from mamcached --->
<cfelse>
    <!--- get value from db and save to memcached --->
</cfif>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多