Обекти за кеширане в паметта в java

Искам да кеширам обекти в паметта. Изискванията са както следва:

  1. Всеки запис/обект е свързан с уникален ключ.
  2. 400-500 записа/обекта за съхранение. Ако броят на записите се увеличи над определената граница, тогава по-старите записи трябва да бъдат изгонени.
  3. Записите не трябва да се съхраняват повече от 2 минути.
  4. Трябва да се намали, когато JVM изчерпва паметта (вид слаба референция).
  5. Библиотека на трета страна не може да се използва, защото е малък модул и целта е просто да се намали ненужният достъп до мрежата.
  6. Има повече писане, по-малко четене

Сигурността също е проблем тук, защото ще кешираме някои чувствителни данни. Тези данни ще бъдат кеширани в паметта. Трябва ли наистина да се тревожа за сигурността и да криптирам данните?

Търся Java клас, който предоставя подобна функционалност.

В момента мисля да разширя WeakHashMap и да внедря различни частни/публични методи, за да се придържам към изискванията.

Ако имате друга идея, моля споделете тук.


person Rakesh    schedule 18.09.2012    source източник
comment
Third party library shouldn't be use. Това е странно изискване..   -  person Brendan Long    schedule 18.09.2012
comment
@BrendanLong е прав. CacheBuilder на Guava ще бъде отлично решение на този проблем.   -  person condit    schedule 18.09.2012
comment
Ако сте получили задачата да внедрите отново това конкретно колело и задавате тези въпроси, нещо се е объркало.   -  person Dave Newton    schedule 18.09.2012
comment
@Brendan Всъщност липсата на библиотеки на трети страни е МНОГО често срещано изискване, което съм срещал при проекти в корпоративния свят.   -  person Brian Knoblauch    schedule 18.09.2012
comment
Много корпоративни магазини няма да използват решения с отворен код, защото смятат, че това ги излага на отговорност, в случай че разработчиците на решението са го изплагиатствали.   -  person Dexygen    schedule 18.09.2012
comment
С редакцията (5) има още по-малко смисъл за мен. Защо бихте искали да направите своя малък модул по-голям, като включите код за нещо, което вече е направено (по-добро)?   -  person Brendan Long    schedule 18.09.2012


Отговори (3)


Не искате да използвате WeakHashMap. SoftHashMap ще бъде по-близо, но не е наличен в стандартната библиотека. Ако бях на твое място, ще погледна кеш класовете на Guava за подсказки.

Но ето някои допълнителни мисли:

Трябва да се намали, когато JVM изчерпва паметта (вид слаба препратка).

Имаш предвид soft reference. Но както и да е, малко ми намирисва това изискване. Може да е валидно изискване, бих го признал, но рядко наистина имате нужда от това. Ако размерът на вашите записи може да бъде сравнително добре предвиден и ако планирате да имате твърдо ограничение за броя на записите, които искате да кеширате, шансовете са, че нямате нужда от тази сложност.

Не трябва да се използва библиотека на трета страна.

Всички споменаха това и са прави.

Що се отнася до аспекта на сигурността, ефикасността на криптирането на данни, кеширани в паметта, е съмнителна. Ще трябва да имате и ключа за криптиране в паметта. Обзалагам се, че има много неща, за които да се тревожите повече от нападателите, които четат съдържанието на паметта ви.

person Enno Shioji    schedule 18.09.2012

Не, не трябва да правите това. WeakHashMap не е кеш!

Сега е лесно да се разбере защо WeakHashMap не работи за кеширане. Първо, така или иначе няма да работи, защото използва меки препратки за ключовете, а не за стойностите на картата. Но в допълнение към това, събирачът на боклук агресивно възстановява паметта, която се посочва само от слаби препратки. Това означава, че след като загубите последната силна препратка към обект, който работи като ключ в WeakHashMap, събирачът на отпадъци скоро ще възстанови този запис в картата.

...

И така, как, по дяволите, да внедря кеш в Java?

Моето предложение е да използвате една от свободно достъпните реализации на кеша, като JCS, OSCache и други. Тези библиотеки осигуряват по-добро управление на паметта с LRU и FIFO политики, например, препълване на диска, изтичане на данните и много други незадължителни разширени функции.

Както @user463324 споменава, трябва просто да използвате библиотека, която вече прилага това, като Google Guava, който е под Apache 2.0 лиценз, с който никой разумен бизнес не би имал проблем. Не е измислено тук не е добра причина да игнорирате решение.

person Brendan Long    schedule 18.09.2012

Имате две възможности: JCS или Memcache/EHCache

Двете опции са функционално еквивалентни, но имат някои критични разлики. Когато използвате JCS, кешираните обекти не се сериализират/десериализират. Те остават като Java обекти, поради което съхраняването и извличането им е много бързо. Това обаче означава, че вашият кеш е вътре в JVM, следователно използва купчината на JVM и също така не е достъпен за други JVM. [JCS предоставя някакъв вид разпределени възможности като добавка].

От друга страна, Memcache/Ehcache са външни кешове, които извършват сериализация/десериализация, докато извършват операциите put/get. Това може да отмени ползата от кеширането в някои екстремни случаи. така че сравняването на скоростта е от съществено значение. Ако е подходящ, разпределен е, използва собствена памет, може да е на друга кутия. Но това също означава, че трябва да имате предвид сигурността на данните между JVM и външния кеш.

person srini.venigalla    schedule 18.09.2012
comment
OP специално каза, че библиотеката на трета страна не може да се използва - person Raedwald; 30.01.2014