2012-06-20 31 views
13

Tôi đang cố gắng triển khai bộ nhớ đệm an toàn cho chủ đề hiệu suất cao. Đây là mã tôi đã thực hiện. Tôi không muốn bất kỳ máy tính theo yêu cầu nào. Tôi có thể sử dụng cache.asMap() và truy xuất giá trị một cách an toàn không? Ngay cả khi bộ nhớ cache được đặt để có softValues?Sử dụng ổi để lưu bộ nhớ đệm an toàn hiệu năng cao

import java.io.IOException; 
    import java.util.concurrent.ConcurrentMap; 
    import java.util.concurrent.ExecutionException; 
    import java.util.concurrent.TimeUnit; 
    import java.util.concurrent.TimeoutException; 

    import com.google.common.cache.Cache; 
    import com.google.common.cache.CacheBuilder; 

    public class MemoryCache { 

    private static MemoryCache instance; 
    private Cache<String, Object> cache; 

    private MemoryCache(int concurrencyLevel, int expiration, int size) throws IOException { 

     cache = CacheBuilder.newBuilder().concurrencyLevel(concurrencyLevel).maximumSize(size).softValues() 
      .expireAfterWrite(expiration, TimeUnit.SECONDS).build(); 
    } 

    static public synchronized MemoryCache getInstance() throws IOException { 
     if (instance == null) { 
       instance = new MemoryCache(10000, 3600,1000000); 
     } 
     return instance; 
    } 

    public Object get(String key) { 
     ConcurrentMap<String,Object> map =cache.asMap(); 
     return map.get(key); 
    } 

    public void put(String key, Object obj) { 
     cache.put(key, obj); 
    } 
    } 
+4

Như một sự tò mò, bạn có thực sự mong đợi có 10.000 chủ đề truy cập vào Cache của bạn đồng thời không? Tôi hỏi vì đó là giá trị bạn đang sử dụng như một mức độ đồng thời. – pcalcao

+0

Không, tôi đã xóa thông số đó. Tôi hiện đang sử dụng cấp độ đồng thời mặc định, tức là 4. Cảm ơn bạn đã chỉ ra điểm đó. – systemboot

Trả lời

21

ổi đóng góp ở đây:

Vâng, đó trông giống tốt, mặc dù tôi không chắc chắn những gì các điểm là các gói bộ nhớ cache trong đối tượng khác. (Ngoài ra, Cache.getIfPresent(key) hoàn toàn tương đương với Cache.asMap().get(key).)

+0

Chủ đề bộ nhớ cache của ổi có an toàn không? –

+5

@GaryGauh đúng vậy. –

6

Nếu bạn muốn có hiệu suất cao, tại sao bạn không instanciate Cache tĩnh thay vì sử dụng getInstance() được đồng bộ hóa?

+1

Đồng ý. Sử dụng thành ngữ này sẽ khắc phục sự đồng bộ hóa trên getInstance(): https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom – bennidi

Các vấn đề liên quan