সাধারণ জাভা ইন-মেমরি ক্যাশে খুঁজছেন [বন্ধ]


102

আমি একটি সাধারণ জাভা ইন-মেমরি ক্যাশে খুঁজছি যার ভাল সমঝোতা রয়েছে (সুতরাং লিংকডহ্যাশম্যাপটি যথেষ্ট ভাল নয়) এবং যা নিয়মিতভাবে ডিস্কে সিরিয়ালাইজ করা যায়।

একটি বৈশিষ্ট্য যা আমার প্রয়োজন, তবে এটি খুঁজে পাওয়া শক্ত প্রমাণ করেছে, কোনও বস্তুর কাছে "উঁকি দেওয়ার" উপায়। এর অর্থ হ'ল ক্যাশে বস্তুটিকে অন্যথায় যতক্ষণ ধরে রাখা উচিত হবে না ধরে ক্যাশে থেকে কোনও বস্তু পুনরুদ্ধার করুন।

আপডেট: একটি অতিরিক্ত প্রয়োজনীয়তা যা আমি উল্লেখ করার জন্য অবহেলা করেছি তা হ'ল আমার জায়গায় জায়গায় ক্যাশেযুক্ত বস্তুগুলি (সেগুলিতে ভাসমান অ্যারে রয়েছে) পরিবর্তন করতে সক্ষম হওয়া দরকার।

কেউ কি কোনও সুপারিশ সরবরাহ করতে পারেন?


1
আমি অনুরূপ কিছু খুঁজছি যা "প্রক্রিয়াধীন" এবং হালকা ওজন। আমি এটিকে একটি ডিগ্রি ইক্লিপস প্লাগইনের মধ্যে কিছু ডেটা সঞ্চয় করতে ব্যবহার করতে চাই। এহছে এবং জেসিএস আমার স্বাদের জন্য খুব ভারী ওজন / বিতরণ / জে 2 ইই বলে মনে হচ্ছে।
উরি


আমি অ্যাপাচি ইগনাইট ( ignite.apache.org )
ভগত এস

1
এই প্রশ্নটি বন্ধ হয়ে গেছে (সত্যের 6 বছর পরে) এবং এটি এখনও কিছু লোক আজ ভাবছে যে, কীভাবে এসওর মডারেটর সিস্টেমটি ব্যর্থ হচ্ছে show
ডাস্টিনেভান

উত্তর:


61

যেহেতু এই প্রশ্নটি প্রাথমিকভাবে জিজ্ঞাসা করা হয়েছিল, গুগলের পেয়ারা লাইব্রেরিতে এখন একটি শক্তিশালী এবং নমনীয় ক্যাশে রয়েছে। আমি এটি ব্যবহার করার সুপারিশ করব।


3
অনুগ্রহ করে নোট করুন যে বসন্ত আর পেয়ারা ক্যাশে সমর্থন করে না: stackoverflow.com/questions/44175085/…
পাপী

@ স্যানসিটি কি এটি জ্যাচাকে বাস্তবায়ন করে?
গৌরব

ক্যাফিনও দুর্দান্ত এবং পারফরম্যান্ট ক্যাচিং লাইব্রেরি। জাভা ৮ এর উপর ভিত্তি করে অনুকূল ক্যাচিং লাইব্রেরির কাছাকাছি ক্যাফিন একটি উচ্চ কার্যকারিতা, ক্যাফিন একটি গুগল পেয়ারা অনুপ্রাণিত এপিআই ব্যবহার করে একটি ইন-মেমোরি ক্যাশে সরবরাহ করে
স্লাভাস

37

এহচেছে এটির জন্য একটি দুর্দান্ত সমাধান এবং এটি দেখার জন্য একটি উপায় রয়েছে ( getQuiet () পদ্ধতি) যেমন এটি নিষ্ক্রিয় টাইমস্ট্যাম্পটি আপডেট করে না। অভ্যন্তরীণভাবে, এহচাকে একটি মানচিত্রের সেট, যেমন ধরণের কনকন্টারহ্যাশম্যাপের সাথে প্রয়োগ করা হয়, সুতরাং এতে একই ধরণের সম্মতিযুক্ত সুবিধা রয়েছে।


2
ধন্যবাদ, একটি অতিরিক্ত প্রশ্ন: আমি যদি EHcache থেকে কোনও বস্তু পুনরুদ্ধার করি (বলুন, একটি অ্যারে), এবং এটি সংশোধন করি - তবে ক্যাশে কী অবজেক্টটি আপডেট হবে? অর্থাত। EHCache কি বস্তুর রেফারেন্স বজায় রাখছে?
বিচক্ষণতা

1
আমি তাই বিশ্বাস করি তবে নিরাপদে এটি করার জন্য অবশ্যই অবশ্যই অবজেক্টটিকে অবশ্যই যথাযথভাবে লক করতে হবে।
অ্যালেক্স মিলার

আমি এহচাকে পছন্দ করি তবে এটি 10 ​​মিম জার j উপায় খুব বড়।
মার্কথেগ্রিয়ায়

23

আপনার যদি কিছু সাধারণ প্রয়োজন হয় তবে এটি কি বিলের সাথে খাপ খায়?

Map<K, V> myCache = Collections.synchronizedMap(new WeakHashMap<K, V>());

এটি ডিস্কে সংরক্ষণ করবে না, তবে আপনি বলেছিলেন যে আপনি সহজ চান ...

লিঙ্ক:

(অ্যাডাম মন্তব্য করার সাথে সাথে, মানচিত্রের সিঙ্ক্রোনাইজ করার একটি পারফরম্যান্স হিট হয়েছে saying ধারণাটি চুলচেরা করে না বলে তা নয়, তবে দ্রুত এবং নোংরা সমাধান হিসাবে যথেষ্ট হবে))


4
একটি সম্পূর্ণ বিশাল মানচিত্র সিঙ্ক্রোনাইজ করা একটি বিশাল জরিমানা। আপনি সহজেই একযোগে হ্যাশ ম্যাপে দুর্বল প্রকারগুলি সংরক্ষণ করতে এবং পর্যায়ক্রমে এগুলি সরাতে পারেন।
অ্যাডাম জেন্ট


8
পারফরম্যান্স-ভিত্তিক, কনকন্ট্র্যান্ট হ্যাশম্যাপ একেবারে আরও ভাল পারফর্ম করে তবে এটি আবর্জনা সংগ্রহকারীকে স্মৃতি পুনরায় দাবি করতে দেওয়ার ক্ষেত্রে WeakHashMap এর বৈশিষ্ট্যগুলি ভাগ করে না। এটি আপনার পক্ষে গুরুত্বপূর্ণ বা নাও হতে পারে।
ইভান

4
তারপরে ব্যবহার করুন ConcurrentHashMap<WeakReference<T>>docs.oracle.com/javase/7/docs/api/java/lang/ref/…
jdmichal

19

ইন-মেমরি জাভা ক্যাশের জন্য অন্য বিকল্প হ'ল ক্যাশে 2 কে । ইন-মেমরি পারফরম্যান্স EHCache এবং গুগল পেয়ারা থেকে উন্নত, ক্যাশে 2 কে মাপদণ্ডের পৃষ্ঠাটি দেখুন

ব্যবহারের ধরণটি অন্যান্য ক্যাশেগুলির মতো। এখানে একটি উদাহরণ:

Cache<String,String> cache = new Cache2kBuilder<String, String>() {}
  .expireAfterWrite(5, TimeUnit.MINUTES)    // expire/refresh after 5 minutes
  .resilienceDuration(30, TimeUnit.SECONDS) // cope with at most 30 seconds
                                          // outage before propagating 
                                          // exceptions
  .refreshAhead(true)                       // keep fresh when expiring
  .loader(new CacheLoader<String, String>() {
    @Override
    public String load(final String key) throws Exception {
      return ....;
    }
  })
  .build();
String val = cache.peek("something");
cache.put("something", "hello");
val = cache.get("something");

আপনার যদি নির্ভরযোগ্যতা হিসাবে গুগল পেয়ারা থাকে তবে পেয়ারা ক্যাশে চেষ্টা করে দেখতে পারেন, একটি ভাল বিকল্প হতে পারে।


ক্রুফেক্স, আমি যদি আমার অ্যাপ্লিকেশনটি বন্ধ করি তবে ক্যাশে সমস্ত নিবন্ধিত ডেটা ধ্বংস করবে বা না?
মেনাই আলা এডডাইন - আলাদিন

10

আপনি সহজেই এমকেচ ব্যবহার করতে পারেন । একটি নমুনা কোড নীচে।

void example(){
    Cache<Integer,Integer> cache = CacheBuilder.heapCache().
    cacheLoader(new CacheLoader<Integer, Integer>() {
        public Integer load(Integer key) {
            return null;
        }
    }).capacity(10000).build(); 
}

9

এটা চেষ্টা কর:

import java.util.*;

public class SimpleCacheManager {

    private static SimpleCacheManager instance;
    private static Object monitor = new Object();
    private Map<String, Object> cache = Collections.synchronizedMap(new HashMap<String, Object>());

    private SimpleCacheManager() {
    }

    public void put(String cacheKey, Object value) {
        cache.put(cacheKey, value);
    }

    public Object get(String cacheKey) {
        return cache.get(cacheKey);
    }

    public void clear(String cacheKey) {
        cache.put(cacheKey, null);
    }

    public void clear() {
        cache.clear();
    }

    public static SimpleCacheManager getInstance() {
        if (instance == null) {
            synchronized (monitor) {
                if (instance == null) {
                    instance = new SimpleCacheManager();
                }
            }
        }
        return instance;
    }

}

একটি সিঙ্ক্রোনাইজ করা মানচিত্রে নির্ভর করার সমস্যাগুলি ইতিমধ্যে অন্যান্য উত্তরে আলোচনা করা হয়েছে।
পবিত্রতা

@ সেরজিবি: আমি একটি অনুরূপ সমাধানের সন্ধান করছিলাম যা ক্যাশে বাস্তবায়নের পক্ষে সহজ ... ধন্যবাদ
প্রকৃতি পাথিক

1
public static SimpleCacheManager getInstance() {public synchronized static SimpleCacheManager getInstance() {অন্যথায় হওয়া উচিত if (instance == null) {থ্রেড নিরাপদ নয়। যে ক্ষেত্রে আপনি মনিটর অবজেক্টটি সমস্ত একসাথে সরিয়ে ফেলতে পারেন যেহেতু সমস্ত getInstance () কলগুলির জন্য সিঙ্ক্রোনাইজেশন হয়, দেখুন: javaworld.com/article/2073352/core-java/…
কাভাক্ল্যাওলু

আমি কি সিঙ্গলটনের জন্য এনাম ব্যবহারের পরামর্শ দিতে পারি? dzone.com/articles/java-singletons- using
এর্ক

9

Jcabi- দিক@Cacheable থেকে চেষ্টা করুন । একটি একক টীকা দিয়ে আপনি পুরো পদ্ধতিটির ফলাফলকে মেমরিতে ক্যাশেযোগ্য করে তুলেছেন:

public class Resource {
  @Cacheable(lifetime = 5, unit = TimeUnit.SECONDS)
  public String load(URL url) {
    return url.openConnection().getContent();
  }
}

এছাড়াও, এই নিবন্ধটি পড়ুন: http://www.yegor256.com/2014/08/03/cacheable-java-nnotation.html


3

এটি সম্পর্কে কীভাবে: https://commons.apache.org/proper/commons-jcs/ (জেসিএস এখন অ্যাপাচি কমন্সে থাকায় নতুন ঠিকানায় আপডেট হয়েছে)


দেখে মনে হচ্ছে @ স্যান্সিটি হালকা ক্যাশে চেয়েছিল।
রডল্ফো

0

এহচাকে চেষ্টা করে দেখুন ? এটি আপনাকে আপনার নিজের ক্যাশেগের মেয়াদোত্তীর্ণ অ্যালগরিদমগুলি প্লাগ করতে দেয় যাতে আপনি আপনার উঁকি কার্যকারিতা নিয়ন্ত্রণ করতে পারেন।

আপনি ক্লাস্টার ইত্যাদি জুড়ে ডিস্ক, ডাটাবেসগুলিতে সিরিয়ালাইজ করতে পারেন ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.