我正在尝试使用AutoDiscovery测试亚马逊的新Memcached客户端.我有一个memcached节点,我可以使用XMemcached 1.3.5以及标准的SpyMemcached库连接到该节点.
我按照这里的说明操作:http://docs.amazonwebservices.com/AmazonElastiCache/latest/UserGuide/AutoDiscovery.html
代码几乎与示例相同,并且是:
String configEndpoint = "<server name>.rgcl8z.cfg.use1.cache.amazonaws.com";
Integer clusterPort = 11211;
MemcachedClient client = new MemcachedClient(new InetSocketAddress(configEndpoint, clusterPort));
client.set("theKey", 3600, "This is the data value");
Run Code Online (Sandbox Code Playgroud)
我在创建连接时在日志中看到以下内容.我尝试设置值时发生错误:
2013-01-04 22:05:30.445 INFO net.spy.memcached.MemcachedConnection: Added {QA sa=/<ip>:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue
2013-01-04 22:05:32.861 INFO net.spy.memcached.ConfigurationPoller: Starting configuration poller.
2013-01-04 22:05:32.861 INFO net.spy.memcached.ConfigurationPoller: Endpoint to use for configuration access in this poll NodeEndPoint - HostName:<our-server>.rgcl8z.cfg.use1.cache.amazonaws.com IpAddress:<ip> Port:11211
2013-01-04 22:05:32.950 WARN net.spy.memcached.MemcachedClient: Configuration endpoint timed …Run Code Online (Sandbox Code Playgroud) 我在netty中编写服务器,我需要调用memcached.我正在使用spymemcached,可以轻松地进行同步memcached调用.我希望这个memcached调用是异步的.那可能吗?netty提供的示例似乎没有帮助.
我尝试使用回调:ExecutorService在我的处理程序中创建了一个池,并向该池提交了一个回调工作程序.像这样:
公共类MyHandler扩展ChannelInboundMessageHandlerAdapter <MyPOJO>实现CallbackInterface {
Run Code Online (Sandbox Code Playgroud)... private static ExecutorService pool = Executors.newFixedThreadPool(20); @Override public void messageReceived(ChannelHandlerContext ctx, MyPOJO pojo) { ... CallingbackWorker worker = new CallingbackWorker(key, this); pool.submit(worker); ... } public void myCallback() { //get response this.ctx.nextOutboundMessageBuf().add(response); }}
CallingbackWorker 好像:
public class CallingbackWorker实现Callable {
Run Code Online (Sandbox Code Playgroud)public CallingbackWorker(String key, CallbackInterface c) { this.c = c; this.key = key; } public Object call() { //get value from key c.myCallback(value); }
然而,当我这样做,this.ctx.nextOutboundMessageBuf()在myCallback卡住.
总的来说,我的问题是:如何在Netty中进行异步memcached调用?
我已经在 tomcat 容器中部署了我的 web 应用程序,但由于可能存在连接泄漏,web 应用程序不断尝试连接到侦听端口 11211 和 11212 的本地 memcached 服务器失败。我正在使用 spy-memcached 客户端。
我定义了一个 ContextListener ,它基本上关闭了所有活动的 memcached 客户端连接。
但是,当我取消部署我的 web 应用程序时,在我看来 tomcat 仍在尝试继续尝试连接到 memcached 服务器的失败尝试,它不应该。我已经使用 netstat 检查了 memcached 服务器上的活动 tcp 连接,但我找不到任何条目。
我也重新启动了 tomcat 服务器,但无济于事。
我应该如何限制 tomcat 进行这些连接?
2011-11-13 21:21:34.575 INFO net.spy.memcached.MemcachedConnection: Reconnecting due to failure to connect to {QA sa=localhost/127.0.0.1:11212, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0}
java.net.ConnectException: Connection refused
at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:407)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:275)
at net.spy.memcached.MemcachedClient.run(MemcachedClient.java:2030)
2011-11-13 21:21:34.576 WARN net.spy.memcached.MemcachedConnection: Closing, and reopening {QA …Run Code Online (Sandbox Code Playgroud) 我正在使用特定于应用程序的 json 对象加载本地 Couchbase 实例。
相关代码是:
CouchbaseClient getCouchbaseClient()
{
List<URI> uris = new LinkedList<URI>();
uris.add(URI.create("http://localhost:8091/pools"));
CouchbaseConnectionFactoryBuilder cfb = new CouchbaseConnectionFactoryBuilder();
cfb.setFailureMode(FailureMode.Retry);
cfb.setMaxReconnectDelay(1500); // to enqueue an operation
cfb.setOpTimeout(10000); // wait up to 10 seconds for an operation to succeed
cfb.setOpQueueMaxBlockTime(5000); // wait up to 5 seconds when trying to
// enqueue an operation
return new CouchbaseClient(cfb.buildCouchbaseConnection(uris, "my-app-bucket", ""));
}
Run Code Online (Sandbox Code Playgroud)
存储条目的方法(我正在使用来自Bulk Load 和 Exponential Backoff 的建议):
void continuosSet(CouchbaseClient cache, String key, int exp, Object value, int tries)
{
OperationFuture<Boolean> …Run Code Online (Sandbox Code Playgroud) 我正在使用memcached,并使用 Javaspymemcache连接到它。
我的问题是:
是否MemcachedClient有内置的连接池?
我可以重用类的实例在 memcached 上进行并发操作,还是每次需要时都需要创建一个新实例?
我最近升级到Spring Security 4.2.3.RELEASE.我也在使用spymemcached v 2.8.4.我遇到了这种情况,由于某些原因,Spring正在尝试序列化服务实现类.我无法弄清楚这是从哪里来的.异常引用的代码行是
Set<Session> userSessions = (Set<Session>) memcachedClient.get(userId);
...
memcachedClient.set(userId, sessionTimeoutInSeconds.intValue(), userSessions); // dies here
Run Code Online (Sandbox Code Playgroud)
带着神秘的错误("java.io.NotSerializableException:org.mainco.subco.ecom.service.ContractServiceImpl"被埋在里面)......
09:06:47,771 ERROR [io.undertow.request] (default task-58) UT005023: Exception handling request to /myproject/registration/save: java.lang.IllegalArgumentException: Non-serializable object
at net.spy.memcached.transcoders.BaseSerializingTranscoder.serialize(BaseSerializingTranscoder.java:110)
at net.spy.memcached.transcoders.SerializingTranscoder.encode(SerializingTranscoder.java:162)
at net.spy.memcached.MemcachedClient.asyncStore(MemcachedClient.java:282)
at net.spy.memcached.MemcachedClient.set(MemcachedClient.java:733)
at net.spy.memcached.MemcachedClient.set(MemcachedClient.java:126)
at org.mainco.subco.session.service.MemcachedSessionService.associateUser(MemcachedSessionService.java:365)
at org.mainco.subco.session.service.MemcachedSessionService.setSessionSecurityContext(MemcachedSessionService.java:288)
at org.mainco.subco.core.security.SubcoSecurityContextRepository.saveContext(subcoSecurityContextRepository.java:116)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:114)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) …Run Code Online (Sandbox Code Playgroud) 我在 Memcached 中存储了一个大小为 7-10MB 的对象,在放置该对象后,尝试检索它。在这种情况下我会遇到缓存未命中的情况。知道为什么吗?该解决方案适用于较小的物体尺寸。
背景信息:
我使用 Memcached 存储一组大约 7-10 MB 大小的大型对象。由于某种原因,我不可能将该对象拆分为多个较小的键。我希望缓存是冗余且温暖的,因此,我使用稍微复杂的缓存放置过程,如下所述:
keySet = makeRedundantKeys(key) // Appends a unique num to the key
putAsync(keys in keyset)
while(!timeout || countNonNullKeys > desiredQuorumOfKeys) {
countNonNullKeys = getSyncKeys(key in keySet)
sleep(backoffTime);
}
Run Code Online (Sandbox Code Playgroud)
我遇到很多失败,其中 getSyncKeys 需要大约 700 毫秒才能获取一个密钥。知道为什么会发生这种情况吗?仅对于大物体才能观察到这种情况。<1MB 的较小对象可以正常工作并在 ~2ms pAvg 内返回数据。这些是良好的 m4.2xlarge EC2 主机,具有高网络性能。另外,我的 TCP 重传段图飙升至 1500/分钟,这看起来很可疑。
我正在使用Spymemcached访问服务器上的Memcached.我使用以下命令启动了memcached
memcached -m 4096 -p 11211 -u memcache -l 127.0.0.1 -d -vvv
Run Code Online (Sandbox Code Playgroud)
我正在使用以下驱动程序将一些键/值对放入Memcache.出于某种原因,在最后一次get操作之后,该main功能才会挂起; 它永远不会终止.
import java.net.InetSocketAddress;
import net.spy.memcached.MemcachedClient;
public class memcache {
public static void main(String args[]) {
//Connect to Memcache.
MemcachedClient c=null;
try{
c = new MemcachedClient(
new InetSocketAddress("127.0.0.1", 11211));
} catch (Exception e) {
System.err.println("Could not connect to Memcached.");
System.exit(-1);
}
System.out.println("Connected to Memcached.");
Object myObject = null;
for (int i = 0; i < 10; i++)
{
c.set(new String("HELLO"), 3600, i+1);
myObject=c.get("HELLO");
String …Run Code Online (Sandbox Code Playgroud) 我有一个Java应用程序设置,它有多个memcached服务器节点与spymemcached客户端通信.
我想知道是否可以在运行时添加或删除服务器节点,而不会干扰所有现有的缓存节点(我知道应该更改一些节点).
这是我所知道的(或理解):
可以设置自定义哈希算法DefaultConnectionFactory,这有助于我们使用Consistent Hashing甚至使用内置的KetamaConnectionFactory.
因此,我们应该能够添加或删除仅包含一个或几个现有节点的节点.
有可能用spymemcached吗?
如果是,那怎么样?
任何人都可以指出我正确的方向?
在高层次上,我有一个MemcachedPoolService类,它有两个方法:getClientInstance()和returnClientInstance(client).正如所料,getClientInstance()向调用者返回MemcachedClient(spymemcachced)的实例,而returnClientInstance(client)将MemcachedClient返回给池.MemcachedPoolService需要可供其他所有需要访问Memcached的@Stateless服务(注入)使用.
目前我将MemcachedPoolService标记为@Singleton,但是当多个客户端尝试访问该应用程序时,我收到以下错误:
[0m[31m16:54:22,968 ERROR [org.jboss.as.ejb3.invocation] (http-/0.0.0.0:8080-10)
JBAS014134: EJB Invocation failed on component MemcachedPoolService for method public
net.spy.memcached.MemcachedClient com.apexlab.cache.MemcachedPoolService.getClientInstance():
javax.ejb.EJBTransactionRolledbackException: JBAS014373: EJB 3.1 PFD2 4.8.5.5.1 concurrent
access timeout on org.jboss.invocation.InterceptorContext$Invocation@24bf375e - could not
obtain lock within 5000MILLISECONDS
Run Code Online (Sandbox Code Playgroud)
为生产环境设置我的MemcachedPoolService(以及我的Web应用程序)以避免获取并发超时异常的最佳方法是什么?