Обновить кэш после изменения объекта - PullRequest
0 голосов
/ 03 мая 2019

Я использую IMemoryCache и запускаю основной проект asp-net. На домашней странице я перечислил несколько фильмов, которые кэшируются в течение примерно 10 минут. Есть ли способ обновить кеш, если фильм был создан / удален / отредактирован, если эти 10 минут не прошли?

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
using MovieManagement.Models;
using MovieManagement.Models.Home;
using MovieManagement.Services.Contracts;
using MovieManagement.ViewModels;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;

namespace MovieManagement.Controllers
{
    public class HomeController : Controller
    {
        private readonly IMovieService movieService;
        private readonly IMemoryCache cacheService;

        public HomeController(IMovieService movieService, IMemoryCache cache)
        {
            this.movieService = movieService ?? throw new ArgumentNullException(nameof(movieService));
            this.cacheService = cache ?? throw new ArgumentNullException(nameof(cache));
        }

        public async Task<IActionResult> Index()
        {
            var model = new HomeIndexViewModel();


            var cachedMovies = await this.cacheService.GetOrCreateAsync("Movies", async entry =>
            {
                entry.AbsoluteExpiration = DateTime.UtcNow.AddSeconds(20);
                var movies = await this.movieService.GetTopRatedMovies();
                return movies;
            });

            model.Movies = cachedMovies;

            return this.View(model);
        }
    }
}

1 Ответ

1 голос
/ 03 мая 2019

Вы можете обновить кэшированные значения при удалении / создании / редактировании с помощью общего частного метода:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Caching.Memory;
    using MovieManagement.Models;
    using MovieManagement.Models.Home;
    using MovieManagement.Services.Contracts;
    using MovieManagement.ViewModels;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Threading.Tasks;

    namespace MovieManagement.Controllers
    {
        public class HomeController : Controller
        {
            private readonly IMovieService movieService;
            private readonly IMemoryCache cacheService;

            public HomeController(IMovieService movieService, IMemoryCache cache)
            {
                this.movieService = movieService ?? throw new ArgumentNullException(nameof(movieService));
                this.cacheService = cache ?? throw new ArgumentNullException(nameof(cache));
            }

            public async Task<IActionResult> Index()
            {
                var model = new HomeIndexViewModel();


                var cachedMovies = await this.cacheService.GetOrCreateAsync("Movies", async entry =>
                {
                    entry.AbsoluteExpiration = DateTime.UtcNow.AddMinutes(10);
                    var movies = await this.movieService.GetTopRatedMovies();
                    return movies;
                });

                model.Movies = cachedMovies;

                return this.View(model);
            }


            [HttpPost]
            public async Task<IActionResult> Delete(int id)
            {

                this.movieService.Delete(id);

                UpdateCachedMovies();

                return RedirectToAction(nameof(Index));

            }

            [HttpPost]
            public async Task<IActionResult> Create(Movie model)
            {

                this.movieService.Add(model);

                UpdateCachedMovies();

                return RedirectToAction(nameof(Index));

            }

            private async void UpdateCachedMovies()
            {
                  this.cacheService.Set("Movies", this.movieService.GetTopRatedMovies(), DateTime.UtcNow.AddMinutes(10));

            }

        }
    }
...