وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

پیاده سازی Redis Cache در ASP.NET Core

Redis یکی از انواع دیتابیس های NoSQL است که ساختار آن به صورت Key-Value می باشد و بدلیل سرعت بالایی که دارد معمولا در برنامه های وب از آن به عنوان حافظه ی کش هم استفاده میشود.

در اینجا میخواهیم از این دیتابیس به عنوان یک لایه کش در سطح یک پروژه ی وب که با ASP.NET Core پیاده شده است استفاده کنیم.

قبل از شروع کار باید ابتدا سرور Redis را روی ویندوزی که میخواهیم اپ را روی آن اجرا کنیم نصب کنیم. یکی از روش های ساده برای انجام اینکار از طریق Chocolatey می باشد. کافی ست از طریق توضیحات این صفحه عملیات نصب Chocolatey را برای ویندوز انجام داده و سپس برای نصب پکیج Redis باید دستور زیر را در cmd اجرا کنید :

choco install redis-64

اکنون برای اجرا کردن سرور Redis و در دسترس قرار دادن آن به عنوان یک سرویس ویندوز، باید دستور زیر را در cmd اجرا کنید.

redis-server --service-install --loglevel verbose --service-name redisService

سپس به کلاس Startup برنامه مراجعه کرده و سرویس مربوط به RedisCache.Core را معرفی کنید :


services.AddRedisCache(options =>
{
    options.Configuration ="localhost:6379";
    options.InstanceName ="RedisCacheTestDB" ;
});

با انجام اینکار در سطح برنامه یک نمونه از IRedisCacheService در اختیار شما خواهد بود که حاوی متدهای مورد نیاز برای کار با کش می باشد و به شکل زیر میتوانید از آن استفاده کنید:

    
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        private readonly IRedisCacheService _redisCacheService;
        private readonly IEnumerable _values;

        public ValuesController(IRedisCacheService redisCacheService)
        {
            _redisCacheService = redisCacheService;
            _values = GetSampleValues();
        }


        // GET api/values
        [HttpGet()]
        public IEnumerable Get()
        {
            if (!_redisCacheService.TryGetValue(key: ValuesCacheKeyTemplate.AllValuesCacheKey, result: out IEnumerable values))
            {
                values = _values;//get data from db instead
                _redisCacheService.Set(key: ValuesCacheKeyTemplate.AllValuesCacheKey, data: values, cacheTimeInMinutes: 60);
            }

            return values;
        }



        // GET api/values/1
        [HttpGet("{id}")]
        public ValueModel Get(int id)
        {
            var cacheKey = string.Format(ValuesCacheKeyTemplate.ValueByIdCacheKey, id);
            return _redisCacheService.GetOrSet(key: cacheKey, factory:()=> _values.FirstOrDefault(v => v.Id == id), cacheTimeInMinutes: 60);

        }


        private IEnumerable GetSampleValues()
        {
            return new List
            {
                new ValueModel{Id=1,Prop1="Prop 1",Prop2="Prop 2"},
                new ValueModel{Id=2,Prop1="Prop 3",Prop2="Prop 4"},
                new ValueModel{Id=3,Prop1="Prop 5",Prop2="Prop 6"},
                new ValueModel{Id=4,Prop1="Prop 7",Prop2="Prop 8"},
                new ValueModel{Id=5,Prop1="Prop 9",Prop2="Prop 10"},
            };
        }
    }
    

نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.