我们有 2 个应用服务器(coldfusion / Java)和一个 memcached。我想像这样设置我的 memcached 服务器/客户端。当服务器 1 为密钥添加值时,它也应该可用于服务器 2。并且以相反的方式也可以。
现在,当我在服务器 1 上为键添加值时,它在第二台服务器上不可读或不可编辑。如何设置
我使用spymemcached作为客户端库。
谢谢你的帮助
我们有 2 个应用服务器(coldfusion / Java)和一个 memcached。我想像这样设置我的 memcached 服务器/客户端。当服务器 1 为密钥添加值时,它也应该可用于服务器 2。并且以相反的方式也可以。
现在,当我在服务器 1 上为键添加值时,它在第二台服务器上不可读或不可编辑。如何设置
我使用spymemcached作为客户端库。
谢谢你的帮助
任何一个:
A. 您没有为服务器 1 和服务器 2 为同一个对象使用相同的密钥。
或者
B. 您不是在与服务器 1 和服务器 2 的同一个 memcached 实例通信
或者
C. 你给对象的生命周期太短了,以至于它在其他服务器可以利用它之前就过期了。
看起来这是一个相当年轻的 Memcached 实现,这可能是一个错误。您可能想在这里提交:http ://code.google.com/p/spymemcached/issues/list
如果您不认为这是一个错误,您能否发布一段调用 Memcached 的代码片段?
另外,请记住,memcached 应被视为不可靠且非持久性存储。你应该编写你的代码,就好像你期望它下降,甚至可能返回空结果一样。
一切都以正确的方式设置,但是设置一个复杂的值(结构或数组)会使这些键/值对对其他服务器不可用。现在我将所有值序列化为 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>