0

我正在学习如何使用 memcached 和spymemcached 示例中的 spymemcached 客户端缓存对象

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 没有连接池机制,因此建议用户缓存连接以减少重新连接的开销问题打开关闭和重用连接

我的问题是如何缓存此连接?有人可以给我一个我可以开始的例子。如果您想知道我尝试了什么,我尝试将我的连接放在 memcached 中,但后来我意识到我必须创建一个连接才能获得它。:)

提前致谢。

4

3 回答 3

2

我注意到,每次我想缓存或检索一个对象时,我都会创建一个新的 memcached 客户端,假设它是一个新连接

不要这样做;spymemcache 对所有进出 memcache 的 I/O 使用单个连接;这一切都是异步完成的;来自 spymemcache 文档...

每个 MemcachedClient 实例都会建立并维护与集群中每个服务器的单个连接。

只需在您的应用程序中执行以下操作;确保客户端可用于您应用中的其他服务,以便他们可以访问它。

MemcachedClient memClient = new MemcachedClient(new InetSocketAddress(host, port)); 

用于memClient内存缓存的 I/O;无需每次都创建一个新的 MemcachedClient 实例;完毕。您提供的链接回答了您的所有问题。

你的部署是什么?网络应用程序还是独立的?

于 2013-08-12T18:54:18.253 回答
0

这只是意味着您应该重用打开的连接,而不是为每个请求打开连接。将连接实例存储在 memcached 中是没有意义的。

在这种情况下缓存连接意味着将其缓存在您的应用程序中(将其保存在内存中并打开),而不是将连接实际存储在 memcached 中。

于 2013-08-12T18:40:23.157 回答
0

我做了更多的研究并偶然发现了这个问题 然后我想出了我的解决方案,

首先创建了一个上下文监听器

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

于 2013-08-14T06:51:27.030 回答