2013-08-12 25 views
0

我正在學習如何從spymemcached examples如何使用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"); 

我注意到,我想每次緩存或檢索對象緩存使用與spymemcached客戶的memcached對象的Java來緩存Memcached的連接我創建了一個新的memcached客戶端,假設它是一個新的連接,並且memcached沒有連接池機制,因此建議用戶緩存連接以減少從這個問題重新連接的開銷opening closing and reusing connections

我的問題是如何緩存此連接?有人可以給我一個例子,我可以從頭開始。 如果你想知道我嘗試過了什麼,我試圖把我的連接放入memcached,但後來我意識到我必須創建一個連接來獲取它。 :)

在此先感謝。

回答

0

我做了一點研究,無意中發現了this question 後來我想到了我的解決方案,

首先創建一個contextlistener

public class ContextListener implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     Memcached.createClient(); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
    } 

} 

然後我加入添加偵聽到部署描述這些行到網絡。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() 我希望這將幫助其他人在那裏有同樣的問題。

0

這意味着您應該重複使用您打開的連接,而不是爲每個請求打開連接。將連接實例存儲在memcached中沒有任何意義。

緩存案例中的連接意味着將其緩存在應用程序中(保存在內存中並打開),而不是實際將連接存儲在memcached中。

+0

但這並不能真正回答我的問題。 '這僅僅意味着您應該重用您打開的連接,而不是爲每個請求打開連接。將連接實例存儲在memcached中沒有任何意義。「您只是將其解釋爲意思。 – qualebs

2

我注意到,我想緩存或檢索對象我 創建一個新的memcached客戶端,我假設每次都是一個新的連接

不要這樣做; spymemcache使用單個連接來訪問和從memcache進行的所有I/O;它都是按照同步進行的;從spymemcache文檔...

每個MemcachedClient例如建立並維護集羣的單一 連接到每臺服務器。

只要做到以下一次在您的應用程序;確保客戶端可用於您應用中的其他服務,以便他們可以訪問它。

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

使用memClient與內存緩存I/O;無需每次都創建MemcachedClient的新實例;完成。您提供的鏈接可以解答您的所有問題。

你的部署是什麼?網絡應用程序還是獨立?

+0

我正在部署一個Web應用程序。我應該在我的servelet的init()方法中創建連接,然後將它傳遞給其他類,這是正確的嗎? – qualebs

+0

我現在已經解決了這個問題,併發布了答案。 Thanx指出我在正確的方向。 – qualebs