2011-05-06 23 views
10

:EHCache anahtar türü EHCache, önbelleğe bir öğe ekleyerek yılında

cache.put(new Element("key1", "value1")); 

// Element constructors : 
Element(Object key, Object value) 

Ben anahtar endeksi bir Object verebilir görüyoruz.

Bunu, dizin olarak bir dize yerine çoklu int: (userId,siteId,...) oluşan bir "karmaşık" anahtar için nasıl kullanabilirim?

Teşekkür

+0

Bu harika bir soru. Bir önbellek veya harita için çok boyutlu bir anahtar nasıl yaparsınız. @Bozho altındaki cevap, string concat hariç, aşağı yukarı doğrudur. Yeni nesneyi oluşturmak için daha az zaman harcayacaksınız ve büyük olasılıkla sahip olamayacağınız kadar küçük olacaktır (kaba tahmin) bu bitiştirmeyle örtüşen neredeyse 5 dize kreasyonları (userId dizgisi, satır içi ":", userId + dizisi birleştirme ": ", string için siteId, prev str + siteId str dizesinin yeni dizgisi). –

cevap

14

yeni sınıfta sarın: o zaman

public class CacheKey implements Serializable { 
    private int userId; 
    private int siteId; 
    //override hashCode() and equals(..) using all the fields (use your IDE) 
} 

Ve (uygun yapıcı tanımladığınız varsayarak): Eğer dizesi kullanabilirsiniz basit durumlar için

cache.put(new Element(new CacheKey(userId, siteId), value); 

birleştirme:

cache.put(new Element(userId + ":" + siteId, value)); 
+0

Dize birleştirme benim için en uygun olanı değil çünkü mümkün olan en düşük bellek boyutuna ihtiyacım var (birçok kayıt). "Serializable" ile mümkün olan en hafif/en kısa tuşa sahip olacağım mı? EhCache, Key nesnesini nasıl kullanacak? Teşekkürler –

+2

boyut bir sorun olmayacak, endişelenmeyin. ehcache nesnenin karmasını alır (bu nedenle dahil olan tüm alanlarla birlikte hashcode'ı geçersiz kılmanız gerekir) – Bozho

+0

Yeniden diriltildiğim için özür dilerim ama 'Seri hale getirilebilir' uygulamak gerekli mi? Karşılaştırılabilir 'yeterli mi? – OldCurmudgeon

İlgili konular