我正在学习如何使用来自spymemcached examples的spymemcached客户端的memcached来缓存对象
MemcachedClient c=new MemcachedClient(new InetSocketAddress("hostname", portNum));
// Store a value (async) for one hour
c.set("someKey", 3600, someObject);
// Retrieve a value (synchronously).
Object myObject=c.get("someKey");
我注意到每次我想要缓存或检索一个对象时,我都会创建一个新的memcached客户端,假设它是一个新连接,而memcached没有连接池机制,因此建议用户缓存连接以减少开销。重新连接此问题opening closing and reusing connections。
我的问题是如何缓存此连接?有人可以给我一个我可以开始的例子。 如果你想知道我尝试了什么,我试图将我的连接放在memcached中,但后来我意识到我必须创建一个连接来获取它。 :)
提前致谢。
答案 0 :(得分:2)
我注意到每次我想要缓存或检索一个对象我 创建一个新的memcached客户端,假定它是一个新的连接
不要这样做; spymemcache对来自memcache的所有I / O使用单个连接;这一切都是异步完成的;来自spymemcache docs ...
每个MemcachedClient实例都建立并维护一个 连接到群集中的每个服务器。
在您的应用中执行以下 一次 ;确保客户端可用于您应用中的其他服务,以便他们可以访问它。
MemcachedClient memClient = new MemcachedClient(new InetSocketAddress(host, port));
将memClient
用于带有memcache的I / O;无需每次都创建一个新的MemcachedClient实例;完成。您提供的链接可以回答您的所有问题。
您的部署是什么?网络应用程序还是独立的?
答案 1 :(得分:0)
这只是意味着您应该重复使用您打开的连接,而不是为每个请求打开连接。在memcached中存储连接实例是没有意义的。
在案例中缓存连接意味着在应用程序中缓存它(将其保存在内存中并打开),而不是实际将连接存储在memcached中。
答案 2 :(得分:0)
我做了一些研究并偶然发现this question 然后我想出了我的解决方案,
首先创建了一个contextlistener
public class ContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
Memcached.createClient();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
}
然后我通过将这些行添加到web.xml
将监听器添加到部署描述符中<listener>
<description>Used with memcached to initialize connection</description>
<listener-class>com.qualebs.managers.ContextListener</listener-class>
</listener>
我创建了一个Memcached类并添加了这些方法
static void createClient() {
try {
client = new MemcachedClient(new InetSocketAddress("localhost", 11211));
} catch (IOException ex) {
Logger.getLogger(Memcached.class.getName()).log(Level.SEVERE, ex.getMessage(), ex);
}
}
static MemcachedClient getClient() throws IOException {
return client;
}
现在我需要使用memcached连接,只需调用Memcached.getClient() 我希望这会有同样的问题帮助其他人。