Skip to content

পোস্ট

ASP.Net Core-এ Request Caching বাস্তবায়ন

৮ জুলাই, ২০১৯ • 4 মিনিট পড়া

ASP.Net Core-এ Request Caching বাস্তবায়ন

একটি অ্যাপ্লিকেশনের উন্নয়নের কোনো পর্যায়ে, সাধারণত বেশ তাড়াতাড়ি, আপনি বুঝতে পারেন যে অ্যাপ্লিকেশনটি ধীর। কিছু গবেষণার পরে, অপরাধী হল অপ্রয়োজনীয়ভাবে একই ডেটা পুনরুদ্ধার করা, এবং একটি আলো জ্বলে ওঠে, এবং আপনি ভাবেন: “আমার কিছু ক্যাশিং প্রয়োজন।”

ক্যাশিং একটি অমূল্য প্যাটার্ন যা ডাটাবেস বা তৃতীয় পক্ষের API-তে অপ্রয়োজনীয় কল দূর করার জন্য। Microsoft IMemoryCache সময়-ভিত্তিক ক্যাশিংয়ের জন্য প্রদান করে, তবে কখনও কখনও সময়-ভিত্তিক ক্যাশিং আপনার প্রয়োজন নয়। এই নিবন্ধে, আমরা Request Scoped ক্যাশিং এবং এটি কীভাবে আমাদের উপকার করতে পারে তা দেখি।

Request ক্যাশিং কী? Request ক্যাশিং একটি ওয়েব অনুরোধের জীবনকালের জন্য ডেটা ক্যাশ করার একটি প্রক্রিয়া। dot-net-এ, আমরা HttpContext.Items সংগ্রহের সাথে কিছু ক্ষমতা রাখি, তবে HttpContext তার injectability-এর জন্য পরিচিত নয়।

Request Scoped ক্যাশিংয়ের কয়েকটি সুবিধা রয়েছে: প্রথমত, এটি স্টেল ডেটার উদ্বেগ দূর করে। বেশিরভাগ পরিস্থিতিতে, একটি অনুরোধ এক সেকেন্ডের কম সময়ে সম্পাদিত হয় এবং যা সাধারণত ডেটা স্টেল হওয়ার জন্য যথেষ্ট দীর্ঘ নয়। এবং দ্বিতীয়ত, মেয়াদ শেষ হওয়া একটি উদ্বেগ নয় কারণ অনুরোধ শেষ হলে ডেটা মারা যায়।

বাক্সের বাইরে, Asp.Net Core-এর কোনো injectable ক্যাশিং নেই। আগে উল্লেখ করা হয়েছে, HttpContext.Items একটি বিকল্প, তবে এটি একটি মার্জিত সমাধান নয়।

ভাগ্যক্রমে আমাদের জন্য, ASP.Net Core আমাদের অন্তর্নির্মিত নির্ভরতা ইনজেকশন (DI) ফ্রেমওয়ার্ক ব্যবহার করে একটি injectable Request Caching বাস্তবায়ন তৈরি করার সরঞ্জাম দেয়।

অন্তর্নির্মিত DI ফ্রেমওয়ার্কের নির্ভরতার জন্য তিনটি জীবনকাল রয়েছে: Singleton, Scoped, এবং TransientSingleton অ্যাপ্লিকেশনের জীবনকালের জন্য, Scoped অনুরোধের জীবনকালের জন্য এবং Transient প্রতিটি অনুরোধের সাথে একটি নতুন উদাহরণ।

আমি IMemoryCache ইন্টারফেসের পরে মডেল করা একটি ইন্টারফেস তৈরি করেছি জিনিসগুলি সামঞ্জস্যপূর্ণ রাখতে।

ইন্টারফেস

public interface IRequestCache
{
    /// <summary>
    /// Add the value into request cache. If the key already exists, the value is overwritten.
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <typeparam name="TValue"></typeparam>
    void Add<TValue>(string key, TValue value);

    /// <summary>
    /// Remove the key from the request cache
    /// </summary>
    /// <param name="key"></param>
    void Remove(string key);

    /// <summary>
    /// Retrieve the value by key, if the key is not in the cache then the add func is called
    /// adding the value to cache and returning the added value.
    /// </summary>
    /// <param name="key"></param>
    /// <param name="add"></param>
    /// <typeparam name="TValue"></typeparam>
    /// <returns></returns>
    TValue RetrieveOrAdd<TValue>(string key, Func<TValue> add);

    /// <summary>
    /// Retrieves the value by key. When the key does not exist the default value for the type is returned.
    /// </summary>
    /// <param name="key"></param>
    /// <typeparam name="TValue"></typeparam>
    /// <returns></returns>
    TValue Retrieve<TValue>(string key);
}

বাস্তবায়ন

public class RequestCache : IRequestCache
{
    IDictionary<string, object> _cache = new Dictionary<string, object>();

    /// <summary>
    /// Add the value into request cache. If the key already exists, the value is overwritten.
    /// </summary>
    /// <param name="key"></param>
    /// <param name="value"></param>
    /// <typeparam name="TValue"></typeparam>
    public void Add<TValue>(string key, TValue value)
    {
        _cache[key] = value;
    }

    /// <summary>
    /// Remove the key from the request cache
    /// </summary>
    /// <param name="key"></param>
    public void Remove(string key)
    {
        if (_cache.ContainsKey(key))
        {
            _cache.Remove(key);
        }
    }

    /// <summary>
    /// Retrieve the value by key, if the key is not in the cache then the add func is called
    /// adding the value to cache and returning the added value.
    /// </summary>
    /// <param name="key"></param>
    /// <param name="add"></param>
    /// <typeparam name="TValue"></typeparam>
    /// <returns></returns>
    public TValue RetrieveOrAdd<TValue>(string key, Func<TValue> add)
    {
        if (_cache.ContainsKey(key))
        {
            return (TValue)_cache[key];
        }

        var value = add();

        _cache[key] = value;

        return value;
    }

    /// <summary>
    /// Retrieves the value by key. When the key does not exist the default value for the type is returned.
    /// </summary>
    /// <param name="key"></param>
    /// <typeparam name="TValue"></typeparam>
    /// <returns></returns>
    public TValue Retrieve<TValue>(string key)
    {
        if (_cache.ContainsKey(key))
        {
            return (TValue)_cache[key];
        }

        return default(TValue);
    }
}

ASP.Net Core-এর DI ফ্রেমওয়ার্ক ব্যবহার করে আমরা এটি Scoped হিসাবে সংযুক্ত করব।

services.AddScoped<IRequestCache, RequestCache>();

ব্যবহার

public class UserService
{
    private readonly IRequestCache _cache;
    private readonly IUserRepository _userRepository;

    public UserService(IRequestCache cache, IUserRepository userRepository)
    {
        _cache = cache;
        _userRepository = userRepository;
    }

    public User RetrieveUserById(int userId)
    {
        var buildCacheKey = UserService.BuildCacheKey(userId);

        return _cache.RetrieveOrAdd(BuildCacheKey, () => { return _userRepository.RetrieveUserBy(userId); });
    }

    public void Delete(int userId)
    {
        var buildCacheKey = UserService.BuildCacheKey(userId);

        _userRepository.Delete(userId);
        _cache.Remove(BuildCacheKey(userId));
    }

    private static string BuildCacheKey(int userId)
    {
        return $"user_{userId}";
    }
}

এটাই! Request Caching এখন আপনার প্রয়োজনীয় যেকোনো জায়গায় injectable।

Git Repository পরিদর্শন করুন এবং কোডটি একটি স্পিন দিতে অনুভব করুন।

লেখক: চাক কনওয়ে একজন এআই ইঞ্জিনিয়ার যার কাছে প্রায় ৩০ বছরের সফটওয়্যার ইঞ্জিনিয়ারিং অভিজ্ঞতা রয়েছে। তিনি ব্যবহারিক এআই সিস্টেম তৈরি করেন—কন্টেন্ট পাইপলাইন, অবকাঠামো এজেন্ট এবং সরঞ্জাম যা বাস্তব সমস্যার সমাধান করে—এবং তার শেখার বিষয়গুলি শেয়ার করেন। তার সাথে সোশ্যাল মিডিয়ায় সংযোগ করুন: X (@chuckconway) অথবা তাকে YouTube এবং SubStack এ দেখুন।

↑ শীর্ষে ফিরে যান

আপনি এটিও পছন্দ করতে পারেন