এমভিসি অ্যাপ্লিকেশনটিতে কীভাবে ডেটা ক্যাশে করবেন


252

আমি এমভিসি অ্যাপ্লিকেশনটিতে পৃষ্ঠা ক্যাচিং এবং আংশিক পৃষ্ঠা ক্যাশে সম্পর্কিত প্রচুর তথ্য পড়েছি। তবে, আপনি কীভাবে ডেটা ক্যাশে করবেন তা আমি জানতে চাই।

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

এটি কীভাবে কার্যকর হবে, কোথায় এটি কার্যকর করা উচিত (মডেল?) এবং যদি এটি কাজ করে তবে এর উদাহরণ কী কেউ দেখতে পারে?

আমি এটি প্রচলিত এএসপি.এনইটি অ্যাপ্লিকেশনগুলিতে সাধারনত খুব অচল তথ্যের জন্য দেখেছি।


1
নীচের উত্তরগুলি পর্যালোচনা করার সময়, আপনার নিয়ন্ত্রণকারীর ডেটা অ্যাক্সেস এবং ক্যাশে উদ্বেগগুলির জন্য / দায়বদ্ধতার জ্ঞান থাকতে চান কিনা তা বিবেচনা করতে ভুলবেন না। সাধারণত আপনি এটি আলাদা করতে চান। এটি করার জন্য ভাল উপায়ের
ssmith

উত্তর:


75

আপনার মডেলটিতে System.Web dll উল্লেখ করুন এবং System.Web.Caching.Cache ব্যবহার করুন

    public string[] GetNames()
    {
      string[] names = Cache["names"] as string[];
      if(names == null) //not in cache
      {
        names = DB.GetNames();
        Cache["names"] = names;
      }
      return names;
    }

কিছুটা সরলীকৃত তবে আমার ধারণা এটি কার্যকর হবে would এটি এমভিসি নির্দিষ্ট নয় এবং ডেটা ক্যাশে করার জন্য আমি সবসময় এই পদ্ধতিটি ব্যবহার করেছি।


89
আমি এই সমাধানটির প্রস্তাব দিচ্ছি না: বিনিময়ে, আপনি আবারও একটি নাল বস্তু পেতে পারেন, কারণ এটি ক্যাশে পুনরায় পড়ছে এবং এটি ইতিমধ্যে ক্যাশে থেকে ফেলে দেওয়া হয়েছে। আমি বরং করব: পাবলিক স্ট্রিং [] getNames () {স্ট্রিং [] noms = ক্যাশে ["নাম"]; if (noms == নাল) {noms = DB.GetNames (); ক্যাশে ["নাম"] = noms; } প্রত্যাবর্তন (noms); }
অলি

আমি অলির সাথে একমত .. সত্যিকারের ডিবির কাছে কল থেকে ফলাফল পাওয়া তাদের ক্যাশে থেকে পাওয়ার চেয়ে ভাল
ক্লাইবার

1
এই DB.GetNames().AsQueryableপ্রশ্নটি বিলম্ব করার পদ্ধতি নিয়ে কাজ করে?
চেজ ফ্লোরেল

আপনি যদি স্ট্রিং [] থেকে আয়মূল্য <স্ট্রিং>
টার্জেটাইল

12
যদি আপনি মেয়াদোত্তীকরণ সেট না করেন..তখন ডিফল্টরূপে ক্যাশে সমাপ্ত হবে?
চাকা

403

এখানে আমি ব্যবহার করি একটি দুর্দান্ত এবং সাধারণ ক্যাশে সহায়ক শ্রেণি / পরিষেবা:

using System.Runtime.Caching;  

public class InMemoryCache: ICacheService
{
    public T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class
    {
        T item = MemoryCache.Default.Get(cacheKey) as T;
        if (item == null)
        {
            item = getItemCallback();
            MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(10));
        }
        return item;
    }
}

interface ICacheService
{
    T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class;
}

ব্যবহার:

cacheProvider.GetOrSet("cache key", (delegate method if cache is empty));

ক্যাশে সরবরাহকারী ক্যাশে "ক্যাশে আইডি" নামে কিছু আছে কিনা তা যাচাই করবে এবং যদি তা না থাকে তবে ডেটা আনার জন্য এবং এটি ক্যাশে সংরক্ষণ করার জন্য একটি প্রতিনিধি পদ্ধতির কল করবে।

উদাহরণ:

var products=cacheService.GetOrSet("catalog.products", ()=>productRepository.GetAll())

3
আমি এটিকে এমনভাবে গ্রহণ করেছি যাতে পরিবর্তে এইচটিটিপি কনটেক্সট.ক্রেনার.সেশন ব্যবহার করে ব্যবহারকারী সেশনের জন্য ক্যাশেিং ব্যবস্থাটি ব্যবহার করা যায়। আমি আমার বেসকন্ট্রোলার ক্লাসে একটি ক্যাশে সম্পত্তিও রেখেছি যাতে এর সহজ অ্যাক্সেস এবং আপডেট ইউনিট পরীক্ষার জন্য ডিআইয়ের জন্য কনস্ট্রাক্টরকে আপডেট করে। আশাকরি এটা সাহায্য করবে.
ওয়েস্টডিস্কগল্ফ

1
অন্যান্য নিয়ামকদের মধ্যে পুনরায় ব্যবহারযোগ্যতার জন্য আপনি এই শ্রেণি এবং পদ্ধতিটিকে স্থিতিশীলও করতে পারেন।
অ্যালেক্স

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

3
@ ব্রেন্ডান - এবং আরও খারাপ এটির পরিবর্তে পদ্ধতিটির নাম এবং পরামিতিগুলি থেকে অনুমান করার পরিবর্তে ক্যাশে কীগুলির জন্য এটিতে ম্যাজিক স্ট্রিং রয়েছে।
স্মিথ

5
এটি দুর্দান্ত একটি নিম্ন স্তরের সমাধান। অন্যরা যেমন ইঙ্গিত করেছে, আপনি এটিকে কোনও প্রকার নিরাপদ, ডোমেন-নির্দিষ্ট শ্রেণিতে আবদ্ধ করতে চান। আপনার কন্ট্রোলারে সরাসরি এটি অ্যাক্সেস করা যাদু স্ট্রিংয়ের কারণে রক্ষণাবেক্ষণের দুঃস্বপ্ন হয়ে উঠবে।
জোশ নোয়ে

43

আমি টিটির পোস্টটি উল্লেখ করছি এবং নিম্নলিখিত পদ্ধতির পরামর্শ দিচ্ছি:

আপনার মডেলটিতে System.Web dll উল্লেখ করুন এবং System.Web.Caching.Cache ব্যবহার করুন

public string[] GetNames()
{ 
    var noms = Cache["names"];
    if(noms == null) 
    {    
        noms = DB.GetNames();
        Cache["names"] = noms; 
    }

    return ((string[])noms);
}

আপনাকে ক্যাশে থেকে পুনরায় পঠিত কোনও মান ফিরিয়ে দেওয়া উচিত নয়, কারণ আপনি কখনই জানতে পারবেন না যে সেই নির্দিষ্ট মুহুর্তে এটি এখনও ক্যাশে রয়েছে কিনা in এমনকি আপনি বিবৃতিতে এটি আগে sertedোকানো হলেও এটি ইতিমধ্যে চলে গেছে বা কখনও ক্যাশে যুক্ত হয়নি - আপনি জানেন না।

সুতরাং আপনি ডাটাবেস থেকে পঠিত ডেটা যুক্ত করুন এবং এটি সরাসরি ফিরিয়ে দিন, ক্যাশে থেকে পুনর্বার পড়া নয়।


কিন্তু লাইনটি Cache["names"] = noms;ক্যাশে রাখছে না?
ওমর

2
@ বাডি হ্যাঁ তা করে। তবে এই উদাহরণটি প্রথম অলির উল্লেখের চেয়ে আলাদা, কারণ তিনি আবার ক্যাশে অ্যাক্সেস করেন না - সমস্যাটি হ'ল কেবল করছেন: ফিরুন (স্ট্রিং []] ক্যাশে ["নাম"]; .. কুল ফলাফল একটি নাল মান ফিরে আসার ফলে, কারণ এটি সমাপ্ত হয়ে গেছে। এটি সম্ভবত না, তবে এটি ঘটতে পারে। এই উদাহরণটি আরও ভাল because
জ্যামিবারো

বা ... ক্যাশে থেকে মানটি পুনরায় পঠিত হয়, যদি তা এখনও বিদ্যমান থাকে (! = নাল)। অতএব, ক্যাশিংয়ের পুরো পয়েন্ট। এটি কেবল এটি বলার জন্য যে এটি নাল মানগুলির জন্য ডাবল-চেক করে এবং প্রয়োজনীয় যেখানে ডাটাবেসটি পড়ে reads খুব স্মার্ট, ধন্যবাদ অলি!
শন কেন্ডল

আপনি কি দয়া করে এমন কোনও লিঙ্ক ভাগ করতে পারেন যেখানে আমি কী মান ভিত্তিক অ্যাপ্লিকেশন ক্যাশে সম্পর্কে পড়তে পারি। আমি লিঙ্কগুলি সন্ধান করতে সক্ষম নই।
অবিচ্ছেদ্য

@ অলি, সিএসএইচটিএমএল বা এইচটিএমএল পৃষ্ঠা থেকে এই ক্যাশে রেকর্ডগুলি কীভাবে গ্রহণ করবেন
দীপান রাজ

37

.NET 4.5+ ফ্রেমওয়ার্কের জন্য

রেফারেন্স যুক্ত করুন: System.Runtime.Caching

বিবৃতি ব্যবহার করে যুক্ত করুন: using System.Runtime.Caching;

public string[] GetNames()
{ 
    var noms = System.Runtime.Caching.MemoryCache.Default["names"];
    if(noms == null) 
    {    
        noms = DB.GetNames();
        System.Runtime.Caching.MemoryCache.Default["names"] = noms; 
    }

    return ((string[])noms);
}

.NET ফ্রেমওয়ার্ক 3.5 এবং পূর্ববর্তী সংস্করণগুলিতে, এএসপি.এনইটি System.Web.Casing নেমস্পেসে একটি ইন-মেমরি ক্যাশে বাস্তবায়ন সরবরাহ করে। .NET ফ্রেমওয়ার্কের পূর্ববর্তী সংস্করণগুলিতে ক্যাশিংটি কেবলমাত্র সিস্টেম.ভেদে নামস্থানে উপলব্ধ ছিল এবং সুতরাং এএসপি.এনইটি ক্লাসের উপর নির্ভরতা প্রয়োজন। .NET ফ্রেমওয়ার্ক 4-এ, সিস্টেম.আরটাইম.ক্যাচিং নেমস্পেসে এমন এপিআই রয়েছে যা ওয়েব এবং অ ওয়েব-ওয়েব অ্যাপ্লিকেশন উভয়ের জন্যই তৈরি করা হয়েছে।

অধিক তথ্য:


কোথা Db.GerNames()থেকে আসছে?
জুনিয়র

ডিবি.গেটনামস ডাল থেকে কেবলমাত্র একটি পদ্ধতি যা ডাটাবেস থেকে কিছু নাম আনে। এটি যা আপনি সাধারণত পুনরুদ্ধার করবেন is
juFo

এটি বর্তমানের প্রাসঙ্গিক সমাধান হিসাবে এটি শীর্ষে থাকা উচিত
বাইশিমো অডেস

2
ধন্যবাদ, সিস্টেম.আরুনটাইম যোগ করার দরকার। পাশাপাশি নুগেট প্যাকেজও (v4.5)।
স্টিভ গ্রিন

26

স্টিভ স্মিথ দুটি দুর্দান্ত ব্লগ পোস্ট করেছেন যা এটি দেখায় যে কীভাবে তাঁর এএসপি.এনইটি এমভিসিতে তার ক্যাশেডেপোসিটোরি প্যাটার্নটি ব্যবহার করতে হয়। এটি কার্যকরভাবে সংগ্রহস্থল প্যাটার্ন ব্যবহার করে এবং আপনার বিদ্যমান কোডটি পরিবর্তন না করে আপনাকে ক্যাচিংয়ের অনুমতি দেয়।

http://ardalis.com/Introducing-the-CachedRepository-Pattern

http://ardalis.com/building-a-cachedrepository-via-strategy-pattern

এই দুটি পোস্টে তিনি আপনাকে এই প্যাটার্নটি কীভাবে স্থাপন করবেন তা দেখিয়েছেন এবং এটি কেন কার্যকর তাও ব্যাখ্যা করেছেন। এই নিদর্শনটি ব্যবহার করে আপনি কোনও বিদ্যমান ক্যাচিং যুক্তি না দেখে আপনার বিদ্যমান কোড ব্যতীত ক্যাশে পাবেন। মূলত আপনি ক্যাশেড সংগ্রহস্থল ব্যবহার করুন যেন এটি অন্য কোনও সংগ্রহস্থল were


1
দুর্দান্ত পোস্ট! ভাগ করে নেওয়ার জন্য ধন্যবাদ!!
ভাল

2013-08-31 পর্যন্ত নিহত লিঙ্কগুলি।
সিবিওনো


আপনি কি দয়া করে এমন কোনও লিঙ্ক ভাগ করতে পারেন যেখানে আমি কী মান ভিত্তিক অ্যাপ্লিকেশন ক্যাশে সম্পর্কে পড়তে পারি। আমি লিঙ্কগুলি সন্ধান করতে সক্ষম নই।
অবিচ্ছেদ্য

4

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


এটি আউজুরের জন্য নির্দিষ্ট, সাধারণভাবে এএসপি.এনইটি এমভিসি নয়।
হেনরি সি

3

@ হারভোজে হুডোর উত্তর বাড়ানো হচ্ছে ...

কোড:

using System;
using System.Runtime.Caching;

public class InMemoryCache : ICacheService
{
    public TValue Get<TValue>(string cacheKey, int durationInMinutes, Func<TValue> getItemCallback) where TValue : class
    {
        TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
        if (item == null)
        {
            item = getItemCallback();
            MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
        }
        return item;
    }

    public TValue Get<TValue, TId>(string cacheKeyFormat, TId id, int durationInMinutes, Func<TId, TValue> getItemCallback) where TValue : class
    {
        string cacheKey = string.Format(cacheKeyFormat, id);
        TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
        if (item == null)
        {
            item = getItemCallback(id);
            MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
        }
        return item;
    }
}

interface ICacheService
{
    TValue Get<TValue>(string cacheKey, Func<TValue> getItemCallback) where TValue : class;
    TValue Get<TValue, TId>(string cacheKeyFormat, TId id, Func<TId, TValue> getItemCallback) where TValue : class;
}

উদাহরণ

একক আইটেম ক্যাশিং (যখন প্রতিটি আইটেম তার আইডির উপর ভিত্তি করে ক্যাশে করা হয় কারণ আইটেমের ধরণের জন্য পুরো ক্যাটালগ ক্যাশে করা খুব নিবিড় হবে)।

Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);

কিছু কিছু ক্যাচিং

IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);

টিআইডি কেন?

দ্বিতীয় সহায়কটি বিশেষত দুর্দান্ত কারণ বেশিরভাগ ডেটা কীগুলি যৌগিক নয়। আপনি প্রায়শই সম্মিলিত কী ব্যবহার করলে অতিরিক্ত পদ্ধতি যুক্ত করা যেতে পারে। এভাবে আপনি সমস্ত ধরণের স্ট্রিং কনকেন্টেশন বা স্ট্রিং করা এড়াতে পারেন the এটি ডেটা অ্যাক্সেসের পদ্ধতিটি পাস করা আরও সহজ করে তোলে কারণ আপনাকে মোড়কের পদ্ধতিতে আইডিটি পাস করতে হবে না ... বেশিরভাগ ব্যবহারের ক্ষেত্রে পুরো জিনিসটি খুব সংক্ষিপ্ত এবং সংবেদনশীল হয়ে ওঠে।


1
আপনার ইন্টারফেস সংজ্ঞাগুলিতে "পিরিয়ডআইনমিনিটস" প্যারাম অনুপস্থিত। ;-)
টেক0

3

এখানে হ্রভোজে হুডোর উত্তরের উন্নতি's এই বাস্তবায়নে কয়েকটি মূল উন্নতি হয়েছে:

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

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

ICache.cs

public interface ICache
{
    T GetOrSet<T>(Func<T> getItemCallback, object dependsOn, TimeSpan duration) where T : class;
}

InMemoryCache.cs

using System;
using System.Reflection;
using System.Runtime.Caching;
using Newtonsoft.Json;

public class InMemoryCache : ICache
{
    private static readonly object CacheLockObject = new object();

    public T GetOrSet<T>(Func<T> getItemCallback, object dependsOn, TimeSpan duration) where T : class
    {
        string cacheKey = GetCacheKey(getItemCallback, dependsOn);
        T item = MemoryCache.Default.Get(cacheKey) as T;
        if (item == null)
        {
            lock (CacheLockObject)
            {
                item = getItemCallback();
                MemoryCache.Default.Add(cacheKey, item, DateTime.Now.Add(duration));
            }
        }
        return item;
    }

    private string GetCacheKey<T>(Func<T> itemCallback, object dependsOn) where T: class
    {
        var serializedDependants = JsonConvert.SerializeObject(dependsOn);
        var methodType = itemCallback.GetType();
        return methodType.FullName + serializedDependants;
    }
}

ব্যবহার:

var order = _cache.GetOrSet(
    () => _session.Set<Order>().SingleOrDefault(o => o.Id == orderId)
    , new { id = orderId }
    , new TimeSpan(0, 10, 0)
);

2
if (item == null)লক ভিতরে হতে হবে। এখন যখন ifএটি লকের আগে হয়, তখন রেসের শর্তটি ঘটতে পারে। বা আরও ভাল, আপনার ifলকটির আগে রাখা উচিত , তবে লকটির ভিতরে প্রথম লাইন হিসাবে ক্যাশেটি এখনও খালি রয়েছে কিনা তা পরীক্ষা করে দেখুন। কারণ যদি একই সাথে দুটি থ্রেড আসে তবে তারা উভয়ই ক্যাশে আপডেট করে। আপনার বর্তমান লক সহায়ক নয়।
আল কেপ

3
public sealed class CacheManager
{
    private static volatile CacheManager instance;
    private static object syncRoot = new Object();
    private ObjectCache cache = null;
    private CacheItemPolicy defaultCacheItemPolicy = null;

    private CacheEntryRemovedCallback callback = null;
    private bool allowCache = true;

    private CacheManager()
    {
        cache = MemoryCache.Default;
        callback = new CacheEntryRemovedCallback(this.CachedItemRemovedCallback);

        defaultCacheItemPolicy = new CacheItemPolicy();
        defaultCacheItemPolicy.AbsoluteExpiration = DateTime.Now.AddHours(1.0);
        defaultCacheItemPolicy.RemovedCallback = callback;
        allowCache = StringUtils.Str2Bool(ConfigurationManager.AppSettings["AllowCache"]); ;
    }
    public static CacheManager Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new CacheManager();
                    }
                }
            }

            return instance;
        }
    }

    public IEnumerable GetCache(String Key)
    {
        if (Key == null || !allowCache)
        {
            return null;
        }

        try
        {
            String Key_ = Key;
            if (cache.Contains(Key_))
            {
                return (IEnumerable)cache.Get(Key_);
            }
            else
            {
                return null;
            }
        }
        catch (Exception)
        {
            return null;
        }
    }

    public void ClearCache(string key)
    {
        AddCache(key, null);
    }

    public bool AddCache(String Key, IEnumerable data, CacheItemPolicy cacheItemPolicy = null)
    {
        if (!allowCache) return true;
        try
        {
            if (Key == null)
            {
                return false;
            }

            if (cacheItemPolicy == null)
            {
                cacheItemPolicy = defaultCacheItemPolicy;
            }

            String Key_ = Key;

            lock (Key_)
            {
                return cache.Add(Key_, data, cacheItemPolicy);
            }
        }
        catch (Exception)
        {
            return false;
        }
    }

    private void CachedItemRemovedCallback(CacheEntryRemovedArguments arguments)
    {
        String strLog = String.Concat("Reason: ", arguments.RemovedReason.ToString(), " | Key-Name: ", arguments.CacheItem.Key, " | Value-Object: ", arguments.CacheItem.Value.ToString());
        LogManager.Instance.Info(strLog);
    }
}

3
কিছু ব্যাখ্যা যুক্ত করার বিষয়ে বিবেচনা করুন
মাইক দেবেলা

2

আমি এটি এইভাবে ব্যবহার করেছি এবং এটি আমার পক্ষে কাজ করে। https://msdn.microsoft.com/en-us/library/system.web.caching.cache.add(v=vs.110).aspx পরামিতি তথ্য system.web.caching.cache.add জন্য পরামিতি তথ্য।

public string GetInfo()
{
     string name = string.Empty;
     if(System.Web.HttpContext.Current.Cache["KeyName"] == null)
     {
         name = GetNameMethod();
         System.Web.HttpContext.Current.Cache.Add("KeyName", name, null, DateTime.Noew.AddMinutes(5), Cache.NoSlidingExpiration, CacheitemPriority.AboveNormal, null);
     }
     else
     {
         name = System.Web.HttpContext.Current.Cache["KeyName"] as string;
     }

      return name;

}

এটির পুরো নেমস্পেসের সাথে পুরোপুরি যোগ্যতার জন্য স্টাফের অতিরিক্ত অতিরিক্তগুলি !!
নিনজানেল

1

আমি দুটি ক্লাস ব্যবহার করি। প্রথমে একটি ক্যাশে কোর অবজেক্ট:

public class Cacher<TValue>
    where TValue : class
{
    #region Properties
    private Func<TValue> _init;
    public string Key { get; private set; }
    public TValue Value
    {
        get
        {
            var item = HttpRuntime.Cache.Get(Key) as TValue;
            if (item == null)
            {
                item = _init();
                HttpContext.Current.Cache.Insert(Key, item);
            }
            return item;
        }
    }
    #endregion

    #region Constructor
    public Cacher(string key, Func<TValue> init)
    {
        Key = key;
        _init = init;
    }
    #endregion

    #region Methods
    public void Refresh()
    {
        HttpRuntime.Cache.Remove(Key);
    }
    #endregion
}

দ্বিতীয়টি হ'ল ক্যাশে অবজেক্টের তালিকা:

public static class Caches
{
    static Caches()
    {
        Languages = new Cacher<IEnumerable<Language>>("Languages", () =>
                                                          {
                                                              using (var context = new WordsContext())
                                                              {
                                                                  return context.Languages.ToList();
                                                              }
                                                          });
    }
    public static Cacher<IEnumerable<Language>> Languages { get; private set; }
}

0

আমি বলব এই অবিচলিত ডেটা ইস্যুতে সিঙ্গেলনকে বাস্তবায়ন করা যদি আপনি পূর্ববর্তী সমাধানগুলিকে আরও জটিল মনে করেন তবে এই বিষয়ে একটি সমাধান হতে পারে

 public class GPDataDictionary
{
    private Dictionary<string, object> configDictionary = new Dictionary<string, object>();

    /// <summary>
    /// Configuration values dictionary
    /// </summary>
    public Dictionary<string, object> ConfigDictionary
    {
        get { return configDictionary; }
    }

    private static GPDataDictionary instance;
    public static GPDataDictionary Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new GPDataDictionary();
            }
            return instance;
        }
    }

    // private constructor
    private GPDataDictionary() { }

}  // singleton

এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে তাই আমি যার দ্বারা
এটির


-8

আপনি এএসপি এমভিসি তে অন্তর্নির্মিত ক্যাচিং ব্যবহার করে দেখতেও পারেন:

আপনি ক্যাশে করতে চান এমন নিয়ামক পদ্ধতিতে নিম্নলিখিত বৈশিষ্ট্য যুক্ত করুন:

[OutputCache(Duration=10)]

এই ক্ষেত্রে এর ক্রিয়া ফলাফল 10 সেকেন্ডের জন্য ক্যাশে করা হবে।

এই বিষয়ে আরও এখানে


4
আউটপুট ক্যাশ অ্যাকশন রেন্ডারিংয়ের জন্য, প্রশ্নটি পৃষ্ঠায় নয় ক্যাশিং ডেটা সম্পর্কিত ছিল।
কুলকোডার

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