2012-05-01 25 views
0

我想在java中創建高速緩存以存儲用戶會話。它就像一個緩存,它將爲每個用戶存儲例如5個元素。我需要一些必須能夠記住這些數據的java數據結構。到目前爲止,我創造了這個Java代碼:如何在Java中創建高速緩存以存儲用戶會話

import java.sql.SQLException; 
import java.util.ArrayList; 
import java.util.List; 

public class SessionCache { 

    public SessionCache() { 
    } 

    /* Create object to store sessions */ 
    private List<ActiveSessionsObj> dataList = new ArrayList<>(); 

    public static class ActiveSessionsObj { 
     private int one; 
     private int two; 
     private int three; 
     private int four; 
     private int five; 

     private ActiveSessionsObj(int one, int two, int three, int four, int five) { 
      throw new UnsupportedOperationException("Not yet implemented"); 
     } 
    } 

    public List<ActiveSessionsObj> addCache(int one, int two, int three, int four, int five){ 

     dataList.add(new ActiveSessionsObj(
         one, 
         two, 
         three, 
         four, 
         five)); 
      return dataList;  
    } 

} 

我是新來的Java,我需要幫助我如何將數據添加到結構,我怎麼才能把結構的數據。我需要使用一個鍵來做到這一點。這可能嗎?或者是否有更合適的數據結構來根據畝需求來存儲數據?

最良好的祝願

回答

4

想必每個用戶都有一個唯一的ID,所以Map實現似乎是一個明智的選擇,其中的關鍵是用戶ID和值是ActiveSessionsObj

Map<String, ActiveSessionsObj> cache = 
    new HashMap<String, ActiveSessionsObj>(); 

見Javadoc文檔添加(put()),並刪除(remove())從Map元素:

public void addCache(String user_id,int one,int two,int three,int four,int five) 
{ 
    // You may want to check if an entry already exists for a user, 
    // depends on logic in your application. Otherwise, this will 
    // replace any previous entry for 'user_id'. 
    cache.put(user_id, new ActiveSessionsObj(one, two, three, four, five)); 
} 
+0

我需要這樣的東西:http://pastebin.com/wELvi0e9但netbeans顯示我的錯誤。什麼是插入數據的適當方式? –

+1

@PeterPenzov,以添加到「Map」的示例更新答案。 – hmjd

+0

我更新了代碼http://pastebin.com/dkkBaXhY有什麼遺漏嗎?我不知道我必須插入公共ActiveSessionsObj(int one,int two,int three,int four,int five) –

2

基本上,你不需要一個列表SessionCache,只是定義了一些私有屬性,並提供了一些重溫get set方法來訪問這些屬性。

2

你應該利用Map接口的實例用於存儲你的數據對象。您需要確保每位用戶擁有唯一的密鑰;如果你這樣做,你可以只使用該密鑰作爲輸入到HashMap

此外,爲使您的SessionCache較少依賴的內部細節你ActiveSessionsObj你應該讓你addCache方法採取ActiveSessionsObjs之一。隨着地圖的實現,這將看起來更像:

public void addCache(String key, ActiveSessionsObj data){ 

    dataMap.put(key, data); 

} 

這將是很好的做法,不從SessionCache回報您的地圖爲您以其它方式破壞緩存的encapsulation

+0

你能告訴我這段代碼是否正確:http://pastebin.com/xdfEFGf6現在我沒有運行服務器來測試它。 –

+0

對我來說沒問題。如果你知道你的緩存只處理ActiveSessionsObjs,你可以讓getCache對象返回一個ActiveSessionsObj而不僅僅是一個對象。而且,正如我之前所說的,如果addCache方法只需要使用ActiveSessionsObj而不是一堆東西來構建緩存,那麼它將使緩存更加靈活。想想當您需要將新數據項添加到會話對象時會發生什麼情況。 –

+0

另外,如果您在服務器上運行此功能,並且您可能有多個線程同時訪問緩存,則應注意緩存的線程安全性。最簡單的事情是讓所有公共方法都是「同步」的。 –