如何使用java spymemcached客户端缓存Memcached连接

时间:2013-08-12 06:40:39

标签: memcached spymemcached

我正在学习如何使用来自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中,但后来我意识到我必须创建一个连接来获取它。 :)

提前致谢。

3 个答案:

答案 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() 我希望这会有同样的问题帮助其他人。