ক্যাশে অবৈধতা - কোন সাধারণ সমাধান আছে?


118

"কম্পিউটার বিজ্ঞানে দুটি মাত্র সমস্যা রয়েছে: ক্যাশে অবৈধকরণ এবং নামকরণের জিনিস" "

ফিল কার্লটন

কোনও ক্যাশে অকার্যকর করার কোনও সাধারণ সমাধান বা পদ্ধতি আছে; কোনও এন্ট্রি কখন বাসি হয় তা জানতে, তাই আপনি সর্বদা তাজা তথ্য পাওয়ার নিশ্চয়তা পান?

উদাহরণস্বরূপ, একটি ফাংশন বিবেচনা getData()করুন যা কোনও ফাইল থেকে ডেটা পায়। এটি ফাইলের সর্বশেষ পরিবর্তিত সময়ের উপর ভিত্তি করে এটিকে ক্যাশে করে, যা এটি প্রতিবার ডাকার সময় পরীক্ষা করে।
তারপরে আপনি একটি দ্বিতীয় ফাংশন যুক্ত করুন transformData()যা ডেটা ট্রান্সফার করে, এবং এর ফলাফলটিকে পরবর্তী সময় ডাকা হওয়ার জন্য এটি ক্যাশে করে। ফাইলটির কোনও জ্ঞান নেই - আপনি কীভাবে নির্ভরতা যুক্ত করবেন যে ফাইলটি পরিবর্তিত হলে এই ক্যাশেটি অবৈধ হয়ে যায়?

আপনি getData()প্রতিবার কল করতে পারেন transformData()এবং ক্যাশের তৈরিতে ব্যবহৃত মানের সাথে এটি তুলনা করতে পারেন, তবে এটি খুব ব্যয়বহুল হয়ে উঠতে পারে।


6
আমি বিশ্বাস করি এক্স উইন্ডোজ লেখার সাথে তাঁর কিছু করার আছে
গ্রেগ

1
আমি মনে করি যে শিরোনামটি "ক্যাশে অবৈধকরণ - কোনও সাধারণ সমাধান আছে?" হিসাবে ভাল হবে " এটি ক্যাশে সমস্যা সম্পর্কিত একটি নির্দিষ্ট শ্রেণীর বোঝায়।
আরবেরি ইয়ং

71
না, সে খুব বেশি কম্পিউটার সায়েন্স জানত না। আমি নিশ্চিত যে ওপেনজিএল, এক্স 11, এবং এসএসএলভি 3 তৈরিতে তাঁর জড়িততা তাকে সত্যই এটি বেশি অধ্যয়ন করতে ব্যস্ত করে তুলেছে। :-)
টিম লেশার

80
কম্পিউটার বিজ্ঞানে মাত্র 2 টি সমস্যা রয়েছে: ক্যাশে অবৈধকরণ। নামকরণ জিনিস। এবং একের পর এক ত্রুটি।
দাগ

8
আমি একবার এটি শুনেছিলাম"The two hardest things in Computer Science are cache invalidation, naming things, and off-by-one errors."
জোনাথন রাইনহার্ট

উত্তর:


55

আপনি যে বিষয়ে কথা বলছেন তা হ'ল আজীবন নির্ভরতা শৃঙ্খলাবদ্ধতা, একটি জিনিস অন্যটির উপর নির্ভরশীল যা এর নিয়ন্ত্রণের বাইরেও পরিবর্তন করা যায়।

আপনার কাছ থেকে একটি idempotent ফাংশন থাকে a, bথেকে cযেখানে, যদি aএবং bএকই তারপর cএকই কিন্তু পরীক্ষণ খরচ bউচ্চ পারেন তারপর আপনি হল:

  1. গ্রহণ করুন যে আপনি কখনও কখনও অতিক্রান্ত তথ্য দিয়ে কাজ করেন এবং সর্বদা চেক করেন না b
  2. bযত দ্রুত সম্ভব চেক করার জন্য আপনার স্তরের সেরা চেষ্টা করুন

আপনি আপনার পিষ্টক এবং এটি খেতে পারবেন না ...

আপনি যদি aউপরের উপর ভিত্তি করে একটি অতিরিক্ত ক্যাশে স্তর করতে পারেন তবে এটি প্রাথমিক সমস্যাটিকে কিছুটা হলেও প্রভাবিত করে না। আপনি যদি 1 টি চয়ন করেন তবে আপনি যা কিছু স্বাধীনতা দিয়েছেন তা আপনার কাছে রয়েছে এবং এটি আরও ক্যাশে করতে পারে তবে ক্যাশেড মানটির বৈধতা বিবেচনা করতে হবে b। আপনি যদি 2 টি বেছে নেন তবে আপনাকে অবশ্যই bপ্রতিবার চেক করতে হবে তবে aযদি bচেক আউট হয়ে থাকে তবে ক্যাশে ফিরে যেতে পারেন ।

আপনি যদি ক্যাশে স্তর করেন তবে আপনাকে অবশ্যই সম্মিলিত আচরণের ফলে সিস্টেমের 'বিধি' লঙ্ঘন করেছেন কিনা তা বিবেচনা করতে হবে।

আপনি যদি জানেন যে aসর্বদা এর বৈধতা থাকে bতবে যদি আপনি তেমনভাবে নিজের ক্যাশেটি সাজিয়ে রাখতে পারেন (সিউডোকোড):

private map<b,map<a,c>> cache // 
private func realFunction    // (a,b) -> c

get(a, b) 
{
    c result;
    map<a,c> endCache;
    if (cache[b] expired or not present)
    {
        remove all b -> * entries in cache;   
        endCache = new map<a,c>();      
        add to cache b -> endCache;
    }
    else
    {
        endCache = cache[b];     
    }
    if (endCache[a] not present)     // important line
    {
        result = realFunction(a,b); 
        endCache[a] = result;
    }
    else   
    {
        result = endCache[a];
    }
    return result;
}

একথাও ঠিক যে ধারাবাহিক প্রলেপের (বলুন x) যাতে যতদিন তুচ্ছ হয়, প্রতিটি পর্যায়ে নতুন যোগ ইনপুট বৈধতা সাথে মেলে a: bজন্য সম্পর্ক x: bএবং x: a

তবে এটি বেশ সম্ভব যে আপনি তিনটি ইনপুট পেতে পারেন যার বৈধতা পুরোপুরি স্বতন্ত্র ছিল (বা চক্র ছিল) সুতরাং কোনও লেয়ারিং সম্ভব হবে না। এর অর্থ হল চিহ্নিত করা রেখাটি // গুরুত্বপূর্ণতে পরিবর্তন করতে হবে

যদি (এন্ডক্যাস [এ] মেয়াদ উত্তীর্ণ হয় বা উপস্থিত না থাকে)


3
অথবা হতে পারে, খ পরীক্ষা করার ব্যয় বেশি হলে, আপনি পাবসব ব্যবহার করেন যাতে বি পরিবর্তন হলে এটি সি কে জানায়। পর্যবেক্ষক প্যাটার্নটি সাধারণ।
ব্যবহারকারী 1031420

15

ক্যাশে অবৈধকরণের সমস্যা হ'ল জিনিসগুলি আমাদের সম্পর্কে না জেনে পরিবর্তিত হয়। সুতরাং, কিছু ক্ষেত্রে, এর সমাধান জানা সম্ভব যদি অন্য কোনও জিনিস থাকে যা এটি সম্পর্কে জানত এবং আমাদের অবহিত করতে পারে। প্রদত্ত উদাহরণে, getData ফাংশনটি ফাইল সিস্টেমে ডুবতে পারে যা ফাইলগুলিতে সমস্ত পরিবর্তন সম্পর্কে জানে না, ফাইলটি কী প্রক্রিয়া পরিবর্তন করে তা নির্বিশেষে এবং এই উপাদানটি পরিবর্তিতভাবে সেই উপাদানটি অবহিত করতে পারে যা ডেটা পরিবর্তন করে।

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


3

আপনি যদি প্রতিবার ট্রান্সফর্মটি করতে ডেটা () পেতে যাচ্ছেন তবে আপনি ক্যাশের পুরো সুবিধাটি সরিয়ে ফেলেছেন।

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


3

আইএমএইচও, ফাংশনাল রিঅ্যাকটিভ প্রোগ্রামিং (এফআরপি) এক অর্থে ক্যাশে অবৈধকরণ সমাধানের একটি সাধারণ উপায়।

এফআরপি পরিভাষা মামুলি তথ্য একটি বলা হয়: এখানে কেন সামান্য ত্রুটি । এফআরপি'র অন্যতম লক্ষ্য হ'ল ভুলের অনুপস্থিতির গ্যারান্টি দেওয়া।

এফআরপি আরও বিস্তারিতভাবে এই 'এফআরপি'র মূল বক্তব্য এবং এই এসও উত্তরে ব্যাখ্যা করা হয়েছে

ইন আলাপCell করা একটি ক্যাশে বস্তু / সত্তা প্রতিনিধিত্ব করেন এবং একটি Cellযদি এটা নির্ভরতা এক রিফ্রেশ হয় রিফ্রেশ করা হয়।

এফআরপি নির্ভরতা গ্রাফের সাথে সম্পর্কিত প্লাম্বিং কোডটি গোপন করে এবং নিশ্চিত করে যে কোনও বাসি নেই Cell


আর একটি উপায় (এফআরপি থেকে পৃথক) যা আমি ভাবতে পারি তা bকোনওভাবে রচয়িতা মোনাডে গণিত মান (প্রকারের ) মুড়ে ফেলা হয় Writer (Set (uuid)) bযেখানে Set (uuid)(হাস্কেল নোটেশন) এমন পরিব্যক্তির মানগুলির সমস্ত সনাক্তকারী থাকে যার উপর ভিত্তি করে গণিত মান bনির্ভর করে। সুতরাং, uuidএমন এক ধরণের অনন্য শনাক্তকারী যা পরিবর্তিত মান / ভেরিয়েবল (একটি ডাটাবেসে একটি সারি বলুন) চিহ্নিত করে যার উপর ভিত্তি করে গণনা করা হয় b

এই ধারণাটি সংযুক্তকারীদের সাথে মিশ্রণ করুন যা এই ধরণের লেখক মোনাডকে পরিচালনা করে এবং যদি আপনি কেবল একটি নতুন গণনা করতে এই সংযুক্তকারীগুলি ব্যবহার করেন তবে এটি কোনও ধরণের সাধারণ ক্যাশে অবৈধ সমাধানের দিকে নিয়ে যেতে পারে b। এই জাতীয় সংযোগকারীরা (এর একটি বিশেষ সংস্করণ বলে filter) রাইটার মনড এবং (uuid, a)-এসকে ইনপুট হিসাবে গ্রহণ করে, যেখানে aএকটি পরিবর্তনীয় ডেটা / ভেরিয়েবল দ্বারা চিহ্নিত হয় uuid

সুতরাং প্রতিবার আপনি যখন "আসল" ডেটা পরিবর্তন করেন (uuid, a)(যে কোনও ডাটাবেসে সাধারণকরণের ডেটা বলুন যা থেকে bগণনা করা হয়েছিল) যার bউপর নির্ভর করে টাইপের গুণিত মান নির্ভর করে তবে আপনি ক্যাশেটিকে বাতিল করতে পারেন bযদি আপনি কোনও মানকে পরিবর্তিত aকরেন যার উপর ভিত্তি করে bমানটি নির্ভর করে , কারণ Set (uuid)রাইটার মোনাডের উপর ভিত্তি করে আপনি কখন বলতে পারেন তা কখন ঘটে।

সুতরাং যে কোনও সময় আপনি কোনও প্রদত্তের সাথে কোনও কিছু uuidরূপান্তরিত করার পরে, আপনি এই রূপান্তরটি সমস্ত ক্যাশে-তে সম্প্রচারিত করেন এবং তারা bযে মানগুলিকে চিহ্নিত করে যে পরিবর্তিত মানের উপর নির্ভর করে তা অবৈধ করে দেয় uuidকারণ রাইটার মোনাড যেখানে bমোড়ানো আছে তা বলতে পারে বা এটির bউপর নির্ভর করে কিনা uuidনা.

অবশ্যই, আপনি কেবল নিজের লেখার চেয়ে অনেক বেশি সময় পড়লে এটি কেবল অর্থ প্রদান করে।


তৃতীয়, ব্যবহারিক, পদ্ধতি হ'ল ডেটাবেসগুলিতে ম্যাটারিয়াল ভিউ-গুলি ব্যবহার করা এবং সেগুলি ক্যাশে-এস হিসাবে ব্যবহার করা। এএফআইএকি তারা এই অবৈধ সমস্যাটি সমাধান করার লক্ষ্য নিয়েছে। এটি অবশ্যই অপারেশনগুলিকে সীমাবদ্ধ করে যা পরিবর্তিত ডেটার সাথে পরিবর্তনীয় ডেটা সংযুক্ত করে।


2

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

প্রতিটি ফাংশন এমন একটি বৈশিষ্ট্যের সাথে চিহ্নিত করা যেতে পারে যা এর সমাপ্তির সময়কাল নির্দিষ্ট করে। এইভাবে চিহ্নিত প্রতিটি ফাংশন মেমোমাইজ করা হয় এবং ফলটি ক্যাশে সংরক্ষণ করা হয়, যাতে ফাংশন কল এবং প্যারামিটারগুলির কী হিসাবে ব্যবহৃত হয় with আমি ব্যাকএন্ডের জন্য বেগ ব্যবহার করছি , যা ক্যাশে ডেটা বিতরণ পরিচালনা করে।


1

কোনও ক্যাশে তৈরির কোনও সাধারণ সমাধান বা পদ্ধতি আছে, কোনও এন্ট্রি কখন বাসি হয় তা জানার জন্য, তাই আপনি সর্বদা তাজা তথ্য পাওয়ার গ্যারান্টিযুক্ত?

না, কারণ সমস্ত ডেটা আলাদা। কিছু ডেটা এক মিনিটের পরে "বাসি" হতে পারে, কিছুটা এক ঘন্টার পরে এবং কিছু দিন বা মাসের জন্য ঠিক থাকতে পারে।

আপনার নির্দিষ্ট উদাহরণ সম্বন্ধে সহজ সমাধান ফাইল, যা আপনি উভয় থেকে কল জন্য 'ক্যাশে পরীক্ষণ' ফাংশনটি আছে হয় getDataএবং transformData


1

কোনও সাধারণ সমাধান নেই তবে:

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

  • আপনি এখনও একটি বিজ্ঞপ্তি প্রক্রিয়া (ধাক্কা) ব্যবহার করতে পারেন, ক্যাশে উত্সটি পর্যবেক্ষণ করে, যদি উত্স পরিবর্তন হয় তবে এটি ক্যাশে একটি বিজ্ঞপ্তি প্রেরণ করে যা "নোংরা" হিসাবে চিহ্নিত করা হয়েছে। যদি কেউ কল getData()করে ক্যাশে প্রথমে উত্সটিতে আপডেট হবে, "নোংরা" পতাকাটি সরান; তারপরে তার সামগ্রীটি ফেরত দিন।

সাধারণত কথা বলার পছন্দটি নির্ভর করে:

  • ফ্রিকোয়েন্সি: অনেক কল কল getData()একটি ধাক্কা পছন্দ করবে যাতে একটি গেটটাইমস্ট্যাম্প ফাংশন দ্বারা উত্স বন্যা যাতে উত্স এড়ানোর জন্য
  • উত্সটিতে আপনার অ্যাক্সেস: আপনি কি উত্সের মডেলটির মালিক? যদি তা না হয় তবে সম্ভাবনা হ'ল আপনি কোনও বিজ্ঞপ্তি প্রক্রিয়া যুক্ত করতে পারবেন না।

দ্রষ্টব্য: টাইমস্ট্যাম্পটি হ'ল এইচটিএমএল প্রক্সিগুলি কাজ করার চিরাচরিত পদ্ধতিতে, অন্য একটি পদ্ধতির সঞ্চিত সামগ্রীর একটি হ্যাশ ভাগ করা হচ্ছে। একসাথে 2 সত্তা একসাথে আপডেট হওয়ার জন্য আমি জানি কেবলমাত্র আমি আপনাকে কল করি (টানুন) অথবা আপনি আমাকে কল করেন ... (ধাক্কা) এটাই সব।


0

ক্যাশে শক্ত কারণ আপনার বিবেচনা করা দরকার: 1) ক্যাশে একাধিক নোড, তাদের জন্য sensকমত্যের প্রয়োজন 2) অবৈধ সময় 3) একাধিক পেতে / সেট হওয়ার পরে রেসের শর্ত

এটি ভাল পড়া: https://www.confluent.io/blog/turning-the-database-inside-out-with-apache-samza/


-2

সম্ভবত ক্যাশে-বিস্মৃত অ্যালগরিদমগুলি সবচেয়ে সাধারণ হবে (বা কমপক্ষে হার্ডওয়্যার কনফিগারেশন নির্ভর), কারণ তারা প্রথমে দ্রুত ক্যাশে ব্যবহার করবে এবং সেখান থেকে এগিয়ে যাবে on এখানে এটির একটি এমআইটি বক্তৃতা: ক্যাশে ওবলিভিয়াস অ্যালগোরিদম


3
আমি মনে করি যে তিনি হার্ডওয়্যার ক্যাশে নিয়ে কথা বলছেন না - তিনি তার গেটডাটা () কোডটির বিষয়ে কথা বলছেন যা একটি ফাইল থেকে মেমোরিতে পেয়েছে এমন ডেটা "ক্যাশে" করে feature
অ্যালেক্স 319
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.