Samouczek: tworzenie rankingu z odkładaniem do pamięci podręcznej na platformie ASP.NETTutorial: Create a cache-aside leaderboard on ASP.NET

W tym samouczku zaktualizujesz aplikację internetową platformy ASP.NET o nazwie ContosoTeamStats , utworzoną w ramach przewodnika Szybki start platformy ASP.NET dla usługi Azure Cache for Redis, w taki sposób, aby zawierała ranking korzystający ze wzorca odkładania do pamięci podręcznej i usługi Azure Cache for Redis.In this tutorial you will update the ContosoTeamStats ASP.NET web app, created in the ASP.NET quickstart for Azure Cache for Redis, to include a leaderboard that uses the cache-aside pattern with Azure Cache for Redis. Przykładowa aplikacja wyświetla listę statystyk zespołu z bazy danych i demonstruje różne sposoby korzystania z usługi Azure Cache for Redis do przechowywania danych w pamięci podręcznej i pobierania ich w celu podniesienia wydajności.The sample application displays a list of team statistics from a database and demonstrates different ways to use Azure Cache for Redis to store and retrieve data from the cache to improve performance. Wykonanie instrukcji z samouczka umożliwi uzyskanie działającej aplikacji internetowej wykonującej odczyt i zapis w bazie danych, zoptymalizowanej przy użyciu usługi Azure Cache for Redis i hostowanej na platformie Azure.When you complete the tutorial you have a running web app that reads and writes to a database, optimized with Azure Cache for Redis, and hosted in Azure.

Ten samouczek zawiera informacje na temat wykonywania następujących czynności:In this tutorial, you learn how to:

  • Zwiększ przepływność danych i ogranicz obciążenie bazy danych, przechowując i pobierając dane przy użyciu usługi Azure Cache for Redis.Improve data throughput and reduce database load by storing and retrieving data using Azure Cache for Redis.
  • Użyj sortowanego zestawu Redis do pobrania pierwszych pięciu zespołów.Use a Redis sorted set to retrieve the top five teams.
  • Aprowizuj zasoby platformy Azure dla aplikacji przy użyciu szablonu usługi Resource Manager.Provision the Azure resources for the application using a Resource Manager template.
  • Opublikuj aplikację na platformie Azure przy użyciu programu Visual Studio.Publish the application to Azure using Visual Studio.

Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem Utwórz bezpłatne konto .If you don't have an Azure subscription, create a free account before you begin.

Wymagania wstępnePrerequisites

Do ukończenia tego samouczka niezbędne są:To complete this tutorial, you must have the following prerequisites:

Dodawanie rankingu do projektuAdd a leaderboard to the project

W tej części samouczka dla projektu ContosoTeamStats zostanie skonfigurowany ranking przedstawiający statystyki zwycięstw, przegranych i remisów fikcyjnych drużyn.In this section of the tutorial, you configure the ContosoTeamStats project with a leaderboard that reports the win, loss, and tie statistics for a list of fictional teams.

Dodawanie platformy Entity Framework do projektuAdd the Entity Framework to the project

  1. W programie Visual Studio otwórz rozwiązanie ContosoTeamStats utworzone w przewodniku Szybki start platformy ASP.NET dla usługi Azure Cache for Redis.In Visual Studio, open the ContosoTeamStats Solution that you created in the ASP.NET quickstart for Azure Cache for Redis.

  2. Kliknij pozycje Narzędzia > Menedżer pakietów NuGet > Konsola menedżera pakietów .Click Tools > NuGet Package Manager > Package Manager Console .

  3. Uruchom następujące polecenie w oknie Konsola menedżera pakietów , aby zainstalować platformę EntityFramework:Run the following command from the Package Manager Console window to install EntityFramework:

    Install-Package EntityFramework
    

Aby uzyskać więcej informacji dotyczących tego pakietu, zobacz stronę pakietu NuGet programu EntityFramework.For more information about this package, see the EntityFramework NuGet page.

Dodawanie modelu zespołuAdd the Team model

  1. Kliknij prawym przyciskiem myszy pozycję Modele w Eksploratorze rozwiązań , a następnie wybierz kolejno pozycje Dodaj , Klasa .Right-click Models in Solution Explorer , and choose Add , Class .

  2. Wprowadź Team dla nazwy klasy i kliknij przycisk Dodaj .Enter Team for the class name and click Add .

    Dodawanie klasy modelu

  3. Zastąp instrukcje using na początku pliku Team.cs poniższymi instrukcjami using:Replace the using statements at the top of the Team.cs file with the following using statements:

    using System;
    using System.Collections.Generic;
    using System.Data.Entity;
    using System.Data.Entity.SqlServer;
    
  4. Zastąp definicję klasy Team poniższym fragmentem kodu, który zawiera zaktualizowaną definicję klasy Team oraz niektóre inne klasy pomocnika platformy Entity Framework.Replace the definition of the Team class with the following code snippet that contains an updated Team class definition as well as some other Entity Framework helper classes. W tym samouczku stosowane jest podejście Code First z platformą Entity Framework.This tutorial is using the code first approach with Entity Framework. Takie podejście umożliwia platformie Entity Framework utworzenie bazy danych z poziomu kodu.This approach allows Entity Framework to create the database from your code. Więcej informacji na temat podejścia typu Code First na platformie Entity Framework używanego w tym samouczku znajduje się w artykule Code first to a new database (Rozwiązanie Code First dla nowej bazy danych).For more information on the code first approach to Entity Framework that's used in this tutorial, see Code first to a new database.

    public class Team
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Wins { get; set; }
        public int Losses { get; set; }
        public int Ties { get; set; }
    
        static public void PlayGames(IEnumerable<Team> teams)
        {
            // Simple random generation of statistics.
            Random r = new Random();
    
            foreach (var t in teams)
            {
                t.Wins = r.Next(33);
                t.Losses = r.Next(33);
                t.Ties = r.Next(0, 5);
            }
        }
    }
    
    public class TeamContext : DbContext
    {
        public TeamContext()
            : base("TeamContext")
        {
        }
    
        public DbSet<Team> Teams { get; set; }
    }
    
    public class TeamInitializer : CreateDatabaseIfNotExists<TeamContext>
    {
        protected override void Seed(TeamContext context)
        {
            var teams = new List<Team>
            {
                new Team{Name="Adventure Works Cycles"},
                new Team{Name="Alpine Ski House"},
                new Team{Name="Blue Yonder Airlines"},
                new Team{Name="Coho Vineyard"},
                new Team{Name="Contoso, Ltd."},
                new Team{Name="Fabrikam, Inc."},
                new Team{Name="Lucerne Publishing"},
                new Team{Name="Northwind Traders"},
                new Team{Name="Consolidated Messenger"},
                new Team{Name="Fourth Coffee"},
                new Team{Name="Graphic Design Institute"},
                new Team{Name="Nod Publishers"}
            };
    
            Team.PlayGames(teams);
    
            teams.ForEach(t => context.Teams.Add(t));
            context.SaveChanges();
        }
    }
    
    public class TeamConfiguration : DbConfiguration
    {
        public TeamConfiguration()
        {
            SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
        }
    }
    
  5. W Eksploratorze rozwiązań kliknij dwukrotnie plik Web.config , aby go otworzyć.In Solution Explorer , double-click Web.config to open it.

    Web.config

  6. Dodaj następującą sekcję connectionStrings wewnątrz sekcji configuration.Add the following connectionStrings section inside the configuration section. Nazwa parametrów połączenia musi być zgodna z nazwą klasy kontekstu bazy danych platformy Entity Framework, którą jest TeamContext.The name of the connection string must match the name of the Entity Framework database context class, which is TeamContext.

    W tych parametrach połączenia przyjęto założenie, że spełniono wymagania wstępne i zainstalowano SQL Server Express LocalDB, które jest częścią obciążenia programowania dla programu .NET Desktop zainstalowanego z programem Visual Studio 2019.This connection string assumes you have met the Prerequisites and installed SQL Server Express LocalDB, which is part of the .NET desktop development workload installed with Visual Studio 2019.

    <connectionStrings>
        <add name="TeamContext" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Teams.mdf;Integrated Security=True" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    W poniższym przykładzie pokazano nową sekcję connectionStrings znajdującą się po sekcji configSections wewnątrz sekcji configuration:The following example shows the new connectionStrings section following configSections inside the configuration section:

    <configuration>
        <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </configSections>
        <connectionStrings>
        <add name="TeamContext" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Teams.mdf;Integrated Security=True"     providerName="System.Data.SqlClient" />
        </connectionStrings>
        ...
    

Dodawanie elementu TeamsController i widokówAdd the TeamsController and views

  1. Skompiluj projekt w programie Visual Studio.In Visual Studio, build the project.

  2. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy folder Kontrolery i wybierz kolejno pozycje Dodaj , Kontroler .In Solution Explorer , right-click the Controllers folder and choose Add , Controller .

  3. Wybierz pozycję Kontroler MVC 5 z widokami używający narzędzia Entity Framework i kliknij przycisk Dodaj .Choose MVC 5 Controller with views, using Entity Framework , and click Add . Jeśli po kliknięciu przycisku Dodaj występuje błąd, upewnij się, czy został wcześniej utworzony projekt.If you get an error after clicking Add , ensure that you have built the project first.

    Dodawanie klasy kontrolera

  4. Wybierz pozycję Zespół (ContosoTeamStats.Models) z listy rozwijanej Klasa modelu .Select Team (ContosoTeamStats.Models) from the Model class drop-down list. Wybierz pozycję TeamContext (ContosoTeamStats.Models) z listy rozwijanej Klasa kontekstu danych .Select TeamContext (ContosoTeamStats.Models) from the Data context class drop-down list. Wpisz nazwę TeamsController w polu tekstowym Kontroler (jeśli nie została automatycznie wypełniona).Type TeamsController in the Controller name textbox (if it is not automatically populated). Kliknij przycisk Dodaj , aby utworzyć klasę kontrolera i dodać widoki domyślne.Click Add to create the controller class and add the default views.

    Konfigurowanie kontrolera

  5. W Eksploratorze rozwiązań rozwiń folder Global.asax i kliknij dwukrotnie plik Global.asax.cs , aby go otworzyć.In Solution Explorer , expand Global.asax and double-click Global.asax.cs to open it.

    Global.asax.cs

  6. Dodaj dwie poniższe instrukcje using na początku pliku pod innymi instrukcjami using:Add the following two using statements at the top of the file under the other using statements:

    using System.Data.Entity;
    using ContosoTeamStats.Models;
    
  7. Dodaj poniższy wiersz kodu na końcu metody Application_Start:Add the following line of code at the end of the Application_Start method:

    Database.SetInitializer<TeamContext>(new TeamInitializer());
    
  8. W Eksploratorze rozwiązań rozwiń folder App_Start i kliknij dwukrotnie pozycję RouteConfig.cs.In Solution Explorer , expand App_Start and double-click RouteConfig.cs.

    RouteConfig.cs

  9. W metodzie RegisterRoutes zastąp element controller = "Home" w trasie Default elementem controller = "Teams", jak pokazano w poniższym przykładzie:In the RegisterRoutes method, replace controller = "Home" in the Default route with controller = "Teams" as shown in the following example:

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Teams", action = "Index", id = UrlParameter.Optional }
    );
    

Konfigurowanie widoku układuConfigure the Layout view

  1. W Eksploratorze rozwiązań rozwiń folder Widoki , a następnie folder Współużytkowane , a następnie kliknij dwukrotnie pozycję _Layout.cshtml .In Solution Explorer , expand the Views folder and then the Shared folder, and double-click _Layout.cshtml .

    _Layout.cshtml

  2. Zmień zawartość elementu title i zastąp ciąg My ASP.NET Application ciągiem Contoso Team Stats, jak pokazano w poniższym przykładzie:Change the contents of the title element and replace My ASP.NET Application with Contoso Team Stats as shown in the following example:

    <title>@ViewBag.Title - Contoso Team Stats</title>
    
  3. W sekcji body dodaj następującą nową instrukcję Html.ActionLink dla projektu Contoso Team Stats zaraz pod linkiem dla elementu Azure Cache for Redis Test .In the body section, add the following new Html.ActionLink statement for Contoso Team Stats just below the link for Azure Cache for Redis Test .

    @Html.ActionLink("Contoso Team Stats", "Index", "Teams", new { area = "" }, new { @class = "navbar-brand" })`
    

    Zmiany kodu

  4. Naciśnij klawisze Ctrl+F5 , aby utworzyć i uruchomić aplikację.Press Ctrl+F5 to build and run the application. Ta wersja aplikacji odczytuje wyniki bezpośrednio z bazy danych.This version of the application reads the results directly from the database. Zwróć uwagę na akcje Utwórz nowe , Edytuj , Szczegóły oraz Usuń , które zostały automatycznie dodane do aplikacji przez szkielet Kontroler MVC 5 z widokami używający narzędzia Entity Framework .Note the Create New , Edit , Details , and Delete actions that were automatically added to the application by the MVC 5 Controller with views, using Entity Framework scaffold. W następnej sekcji samouczka dodasz pamięć podręczną Azure Cache for Redis w celu optymalizacji dostępu do danych i zapewnienia dodatkowych funkcji w aplikacji.In the next section of the tutorial, you'll add Azure Cache for Redis to optimize the data access and provide additional features to the application.

    Aplikacja startowa

Konfigurowanie aplikacji dla usługi Azure Cache for RedisConfigure the app for Azure Cache for Redis

W tej sekcji samouczka skonfigurujesz przykładową aplikację do przechowywania i pobierania statystyk zespołu Contoso z wystąpienia usługi Azure Cache for Redis za pomocą klienta pamięci podręcznej StackExchange.Redis.In this section of the tutorial, you configure the sample application to store and retrieve Contoso team statistics from an Azure Cache for Redis instance by using the StackExchange.Redis cache client.

Dodawanie połączenia pamięci podręcznej do kontrolera zespołówAdd a cache connection to the Teams Controller

Pakiet biblioteki klienta StackExchange.Redis został już zainstalowany w ramach przewodnika Szybki start.You already installed the StackExchange.Redis client library package in the quickstart. Oprócz tego skonfigurowano ustawienia aplikacji CacheConnection tak, aby była używana lokalnie i z opublikowaną usługą App Service.You also have already configured the CacheConnection app setting to be used locally, and with the published App Service. Użyj tej samej biblioteki klienta i informacji CacheConnection w elemencie TeamsController .Use this same client library and CacheConnection information in the TeamsController .

  1. W Eksploratorze rozwiązań rozwiń folder Kontrolery i kliknij dwukrotnie plik TeamsController.cs , aby go otworzyć.In Solution Explorer , expand the Controllers folder and double-click TeamsController.cs to open it.

    Kontroler zespołów

  2. Dodaj dwie poniższe instrukcje using do pliku TeamsController.cs :Add the following two using statements to TeamsController.cs :

    using System.Configuration;
    using StackExchange.Redis;
    
  3. Dodaj dwie poniższe właściwości do klasy TeamsController:Add the following two properties to the TeamsController class:

    // Redis Connection string info
    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() =>
    {
        string cacheConnection = ConfigurationManager.AppSettings["CacheConnection"].ToString();
        return ConnectionMultiplexer.Connect(cacheConnection);
    });
    
    public static ConnectionMultiplexer Connection
    {
        get
        {
            return lazyConnection.Value;
        }
    }
    

Aktualizacja elementu TeamsController do odczytywania informacji z pamięci podręcznej lub bazy danychUpdate the TeamsController to read from the cache or the database

W tym przykładzie statystyki zespołu można pobrać z bazy danych lub z pamięci podręcznej.In this sample, team statistics can be retrieved from the database or from the cache. Statystyki zespołu są przechowywane w pamięci podręcznej jako zserializowany obiekt List<Team>, a także jako posortowany zestaw korzystający z typów danych Redis.Team statistics are stored in the cache as a serialized List<Team>, and also as a sorted set using Redis data types. Podczas pobierania elementów z zestawu posortowanego możesz pobrać część z nich, wszystkie lub przesłać zapytanie o określone elementy.When retrieving items from a sorted set, you can retrieve some, all, or query for certain items. W tym przykładzie prześlesz do zestawu posortowanego zapytanie dotyczące najlepszych 5 zespołów uporządkowanych według liczby zwycięstw.In this sample, you'll query the sorted set for the top 5 teams ranked by number of wins.

Do korzystania z usługi Azure Cache for Redis nie jest wymagane przechowywanie statystyk zespołu w wielu formatach w pamięci podręcznej.It is not required to store the team statistics in multiple formats in the cache in order to use Azure Cache for Redis. W tym samouczku używa się wielu formatów, aby przedstawić różne sposoby i różne typy danych, których można użyć do buforowania danych.This tutorial uses multiple formats to demonstrate some of the different ways and different data types you can use to cache data.

  1. Dodaj poniższe instrukcje using na początku pliku TeamsController.cs razem z innymi instrukcjami using:Add the following using statements to the TeamsController.cs file at the top with the other using statements:

    using System.Diagnostics;
    using Newtonsoft.Json;
    
  2. Zastąp bieżącą implementację metody public ActionResult Index() następującą implementacją:Replace the current public ActionResult Index() method implementation with the following implementation:

    // GET: Teams
    public ActionResult Index(string actionType, string resultType)
    {
        List<Team> teams = null;
    
        switch(actionType)
        {
            case "playGames": // Play a new season of games.
                PlayGames();
                break;
    
            case "clearCache": // Clear the results from the cache.
                ClearCachedTeams();
                break;
    
            case "rebuildDB": // Rebuild the database with sample data.
                RebuildDB();
                break;
        }
    
        // Measure the time it takes to retrieve the results.
        Stopwatch sw = Stopwatch.StartNew();
    
        switch(resultType)
        {
            case "teamsSortedSet": // Retrieve teams from sorted set.
                teams = GetFromSortedSet();
                break;
    
            case "teamsSortedSetTop5": // Retrieve the top 5 teams from the sorted set.
                teams = GetFromSortedSetTop5();
                break;
    
            case "teamsList": // Retrieve teams from the cached List<Team>.
                teams = GetFromList();
                break;
    
            case "fromDB": // Retrieve results from the database.
            default:
                teams = GetFromDB();
                break;
        }
    
        sw.Stop();
        double ms = sw.ElapsedTicks / (Stopwatch.Frequency / (1000.0));
    
        // Add the elapsed time of the operation to the ViewBag.msg.
        ViewBag.msg += " MS: " + ms.ToString();
    
        return View(teams);
    }
    
  3. Dodaj następujące trzy metody do klasy TeamsController, aby wdrożyć typy akcji playGames, clearCache i rebuildDB z instrukcji switch dodanej w poprzednim fragmencie kodu.Add the following three methods to the TeamsController class to implement the playGames, clearCache, and rebuildDB action types from the switch statement added in the previous code snippet.

    Metoda PlayGames aktualizuje statystyki zespołu, symulując sezon gier, zapisuje wyniki w bazie danych i czyści obecnie nieaktualne dane z pamięci podręcznej.The PlayGames method updates the team statistics by simulating a season of games, saves the results to the database, and clears the now outdated data from the cache.

    void PlayGames()
    {
        ViewBag.msg += "Updating team statistics. ";
        // Play a "season" of games.
        var teams = from t in db.Teams
                    select t;
    
        Team.PlayGames(teams);
    
        db.SaveChanges();
    
        // Clear any cached results
        ClearCachedTeams();
    }
    

    Metoda RebuildDB ponownie inicjuje bazę danych z domyślnym zestawem zespołów, generuje ich statystyki i czyści obecnie nieaktualne dane z pamięci podręcznej.The RebuildDB method reinitializes the database with the default set of teams, generates statistics for them, and clears the now outdated data from the cache.

    void RebuildDB()
    {
        ViewBag.msg += "Rebuilding DB. ";
        // Delete and re-initialize the database with sample data.
        db.Database.Delete();
        db.Database.Initialize(true);
    
        // Clear any cached results
        ClearCachedTeams();
    }
    

    Metoda ClearCachedTeams usuwa wszystkie buforowane statystyki zespołów z pamięci podręcznej.The ClearCachedTeams method removes any cached team statistics from the cache.

    void ClearCachedTeams()
    {
        IDatabase cache = Connection.GetDatabase();
        cache.KeyDelete("teamsList");
        cache.KeyDelete("teamsSortedSet");
        ViewBag.msg += "Team data removed from cache. ";
    }
    
  4. Dodaj poniższe cztery metody do klasy TeamsController, aby wdrożyć różne sposoby pobierania statystyk zespołu z pamięci podręcznej i bazy danych.Add the following four methods to the TeamsController class to implement the various ways of retrieving the team statistics from the cache and the database. Każda z tych metod zwraca obiekt List<Team>, który jest następnie wyświetlany w widoku.Each of these methods returns a List<Team>, which is then displayed by the view.

    Metoda GetFromDB odczytuje statystyki zespołu z bazy danych.The GetFromDB method reads the team statistics from the database.

    List<Team> GetFromDB()
    {
        ViewBag.msg += "Results read from DB. ";
        var results = from t in db.Teams
            orderby t.Wins descending
            select t;
    
        return results.ToList<Team>();
    }
    

    Metoda GetFromList odczytuje statystyki zespołu z pamięci podręcznej jako zserializowany obiekt List<Team>.The GetFromList method reads the team statistics from cache as a serialized List<Team>. Jeśli statystyki nie będą obecne w pamięci podręcznej, wystąpi chybienie w pamięci podręcznej.If the statistics are not present in the cache, a cache miss occurs. W przypadku chybienia w pamięci podręcznej statystyki zespołu są odczytywane z bazy danych, a następnie zapisywane w pamięci podręcznej do użytku przy następnym żądaniu.For a cache miss, the team statistics are read from the database and then stored in the cache for the next request. W tym przykładzie używana jest serializacja JSON.NET do serializacji obiektów platformy .NET podczas zapisu w pamięci podręcznej i odczytu z niej.In this sample, JSON.NET serialization is used to serialize the .NET objects to and from the cache. Aby uzyskać więcej informacji, zobacz Praca z obiektami .NET w usłudze Azure Cache for Redis.For more information, see How to work with .NET objects in Azure Cache for Redis.

    List<Team> GetFromList()
    {
        List<Team> teams = null;
    
        IDatabase cache = Connection.GetDatabase();
        string serializedTeams = cache.StringGet("teamsList");
        if (!String.IsNullOrEmpty(serializedTeams))
        {
            teams = JsonConvert.DeserializeObject<List<Team>>(serializedTeams);
    
            ViewBag.msg += "List read from cache. ";
        }
        else
        {
            ViewBag.msg += "Teams list cache miss. ";
            // Get from database and store in cache
            teams = GetFromDB();
    
            ViewBag.msg += "Storing results to cache. ";
            cache.StringSet("teamsList", JsonConvert.SerializeObject(teams));
        }
        return teams;
    }
    

    Metoda GetFromSortedSet odczytuje statystyki zespołu z buforowanego zestawu posortowanego.The GetFromSortedSet method reads the team statistics from a cached sorted set. W przypadku braku trafienia pamięci podręcznej, statystyki zespołu są odczytywane z bazy danych i przechowywane w pamięci podręcznej jako zestaw posortowany.If there is a cache miss, the team statistics are read from the database and stored in the cache as a sorted set.

    List<Team> GetFromSortedSet()
    {
        List<Team> teams = null;
        IDatabase cache = Connection.GetDatabase();
        // If the key teamsSortedSet is not present, this method returns a 0 length collection.
        var teamsSortedSet = cache.SortedSetRangeByRankWithScores("teamsSortedSet", order: Order.Descending);
        if (teamsSortedSet.Count() > 0)
        {
            ViewBag.msg += "Reading sorted set from cache. ";
            teams = new List<Team>();
            foreach (var t in teamsSortedSet)
            {
                Team tt = JsonConvert.DeserializeObject<Team>(t.Element);
                teams.Add(tt);
            }
        }
        else
        {
            ViewBag.msg += "Teams sorted set cache miss. ";
    
            // Read from DB
            teams = GetFromDB();
    
            ViewBag.msg += "Storing results to cache. ";
            foreach (var t in teams)
            {
                Console.WriteLine("Adding to sorted set: {0} - {1}", t.Name, t.Wins);
                cache.SortedSetAdd("teamsSortedSet", JsonConvert.SerializeObject(t), t.Wins);
            }
        }
        return teams;
    }
    

    Metoda GetFromSortedSetTop5 odczytuje pierwsze pięć zespołów z buforowanego zestawu posortowanego.The GetFromSortedSetTop5 method reads the top five teams from the cached sorted set. Rozpoczyna od sprawdzenia pamięci podręcznej pod kątem istnienia klucza teamsSortedSet.It starts by checking the cache for the existence of the teamsSortedSet key. Jeśli klucz ten nie jest obecny, wywołana zostaje metoda GetFromSortedSet w celu odczytu statystyk zespołu i zapisania ich w pamięci podręcznej.If this key is not present, the GetFromSortedSet method is called to read the team statistics and store them in the cache. Następnie zostaje przesłane zapytanie do buforowanego zestawu posortowanego, które zwraca pięć najlepszych zespołów.Next, the cached sorted set is queried for the top five teams, which are returned.

    List<Team> GetFromSortedSetTop5()
    {
        List<Team> teams = null;
        IDatabase cache = Connection.GetDatabase();
    
        // If the key teamsSortedSet is not present, this method returns a 0 length collection.
        var teamsSortedSet = cache.SortedSetRangeByRankWithScores("teamsSortedSet", stop: 4, order: Order.Descending);
        if(teamsSortedSet.Count() == 0)
        {
            // Load the entire sorted set into the cache.
            GetFromSortedSet();
    
            // Retrieve the top 5 teams.
            teamsSortedSet = cache.SortedSetRangeByRankWithScores("teamsSortedSet", stop: 4, order: Order.Descending);
        }
    
        ViewBag.msg += "Retrieving top 5 teams from cache. ";
        // Get the top 5 teams from the sorted set
        teams = new List<Team>();
        foreach (var team in teamsSortedSet)
        {
            teams.Add(JsonConvert.DeserializeObject<Team>(team.Element));
        }
        return teams;
    }
    

Aktualizacja metod Utwórz, Edytuj i Usuń w celu pracy z pamięcią podręcznąUpdate the Create, Edit, and Delete methods to work with the cache

Kod tworzenia szkieletu, który został wygenerowany w ramach tego przykładu, zawiera metody dodawania, edytowania i usuwania zespołów.The scaffolding code that was generated as part of this sample includes methods to add, edit, and delete teams. Za każdym razem, gdy zespół jest dodawany, edytowany lub usuwany, dane w pamięci podręcznej stają się nieaktualne.Anytime a team is added, edited, or removed, the data in the cache becomes outdated. W tej sekcji zmodyfikujesz te trzy metody w celu czyszczenia buforowanych zespołów w taki sposób, aby pamięć podręczna była odświeżana.In this section, you'll modify these three methods to clear the cached teams so that the cache will be refreshed.

  1. Przejdź do metody Create(Team team) w klasie TeamsController.Browse to the Create(Team team) method in the TeamsController class. Dodaj wywołanie metody ClearCachedTeams, jak pokazano w poniższym przykładzie:Add a call to the ClearCachedTeams method, as shown in the following example:

    // POST: Teams/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "ID,Name,Wins,Losses,Ties")] Team team)
    {
        if (ModelState.IsValid)
        {
            db.Teams.Add(team);
            db.SaveChanges();
            // When a team is added, the cache is out of date.
            // Clear the cached teams.
            ClearCachedTeams();
            return RedirectToAction("Index");
        }
    
        return View(team);
    }
    
  2. Przejdź do metody Edit(Team team) w klasie TeamsController.Browse to the Edit(Team team) method in the TeamsController class. Dodaj wywołanie metody ClearCachedTeams, jak pokazano w poniższym przykładzie:Add a call to the ClearCachedTeams method, as shown in the following example:

    // POST: Teams/Edit/5
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "ID,Name,Wins,Losses,Ties")] Team team)
    {
        if (ModelState.IsValid)
        {
            db.Entry(team).State = EntityState.Modified;
            db.SaveChanges();
            // When a team is edited, the cache is out of date.
            // Clear the cached teams.
            ClearCachedTeams();
            return RedirectToAction("Index");
        }
        return View(team);
    }
    
  3. Przejdź do metody DeleteConfirmed(int id) w klasie TeamsController.Browse to the DeleteConfirmed(int id) method in the TeamsController class. Dodaj wywołanie metody ClearCachedTeams, jak pokazano w poniższym przykładzie:Add a call to the ClearCachedTeams method, as shown in the following example:

    // POST: Teams/Delete/5
    [HttpPost, ActionName("Delete")]
    [ValidateAntiForgeryToken]
    public ActionResult DeleteConfirmed(int id)
    {
        Team team = db.Teams.Find(id);
        db.Teams.Remove(team);
        db.SaveChanges();
        // When a team is deleted, the cache is out of date.
        // Clear the cached teams.
        ClearCachedTeams();
        return RedirectToAction("Index");
    }
    

Dodawanie metod buforowania do widoku indeksu zespołówAdd caching methods to the Teams Index view

  1. W Eksploratorze rozwiązań rozwiń folder Widoki , a następnie folder Zespoły i kliknij dwukrotnie plik Index.cshtml .In Solution Explorer , expand the Views folder, then the Teams folder, and double-click Index.cshtml .

    Index.cshtml

  2. W początkowej części pliku odszukaj następujący element akapitu:Near the top of the file, look for the following paragraph element:

    Tabela akcji

    Ten link tworzy nowy zespół.This link creates a new team. Zastąp element akapitu poniższą tabelą.Replace the paragraph element with the following table. Ta tabela zawiera linki akcji do tworzenia nowego zespołu, odtwarzania nowego sezonu gier, czyszczenia pamięci podręcznej, pobierania zespołów z pamięci podręcznej w wielu formatach, pobierania zespołów z bazy danych i odbudowy bazy danych przy użyciu nowych przykładowych danych.This table has action links for creating a new team, playing a new season of games, clearing the cache, retrieving the teams from the cache in several formats, retrieving the teams from the database, and rebuilding the database with fresh sample data.

    <table class="table">
        <tr>
            <td>
                @Html.ActionLink("Create New", "Create")
            </td>
            <td>
                @Html.ActionLink("Play Season", "Index", new { actionType = "playGames" })
            </td>
            <td>
                @Html.ActionLink("Clear Cache", "Index", new { actionType = "clearCache" })
            </td>
            <td>
                @Html.ActionLink("List from Cache", "Index", new { resultType = "teamsList" })
            </td>
            <td>
                @Html.ActionLink("Sorted Set from Cache", "Index", new { resultType = "teamsSortedSet" })
            </td>
            <td>
                @Html.ActionLink("Top 5 Teams from Cache", "Index", new { resultType = "teamsSortedSetTop5" })
            </td>
            <td>
                @Html.ActionLink("Load from DB", "Index", new { resultType = "fromDB" })
            </td>
            <td>
                @Html.ActionLink("Rebuild DB", "Index", new { actionType = "rebuildDB" })
            </td>
        </tr>
    </table>
    
  3. Przewiń w dół pliku index. cshtml i Dodaj następujący element, tak aby tr był ostatnim wierszem w ostatniej tabeli w pliku:Scroll to the bottom of the Index.cshtml file and add the following tr element so that it is the last row in the last table in the file:

    <tr><td colspan="5">@ViewBag.Msg</td></tr>
    

    W tym wierszu wyświetlana jest wartość ViewBag.Msg zawierająca raport o stanie dotyczący bieżącej operacji.This row displays the value of ViewBag.Msg which contains a status report about the current operation. Wartość ViewBag.Msg zostaje ustawiona po kliknięciu jednego z linków akcji z poprzedniego kroku.The ViewBag.Msg is set when you click any of the action links from the previous step.

    Komunikat o stanie

  4. Naciśnij klawisz F6 , aby utworzyć projekt.Press F6 to build the project.

Lokalne uruchamianie aplikacjiRun the app locally

Uruchom aplikację lokalnie na swojej maszynie, aby sprawdzić funkcje dodane w celu obsługi zespołów.Run the application locally on your machine to verify the functionality that has been added to support the teams.

Podczas tego testu aplikacja i baza danych działają lokalnie.In this test, the application and database, are both running locally. Usługa Azure Cache for Redis jest jednak hostowana zdalnie na platformie Azure.However, the Azure Cache for Redis is hosted remotely in Azure. To powoduje, że pamięć podręczna będzie prawdopodobnie mieć wydajność nieznacznie niższą niż baza danych.Therefore, the cache will likely under-perform the database slightly. Aby uzyskać najlepszą wydajność, aplikacja klienta i wystąpienie usługi Azure Cache for Redis powinny być w tej samej lokalizacji.For best performance, the client application and Azure Cache for Redis instance should be in the same location. W następnej części wdrożysz wszystkie zasoby na platformie Azure, aby zobaczyć, jak pamięć podręczna podnosi wydajność.In the next section, you will deploy all resources to Azure to see the improved performance from using a cache.

Aby uruchomić aplikację lokalnie:To run the app locally:

  1. Naciśnij klawisze CTRL + F5 , aby uruchomić aplikację.Press Ctrl+F5 to run the application.

    Aplikacja uruchomiona lokalnie

  2. Przetestuj wszystkie nowe metody dodane do widoku.Test each of the new methods that were added to the view. Ponieważ w tych testach pamięć podręczna jest zdalna, wydajność bazy danych powinna nieco przewyższać wydajność pamięci podręcznej.Since the cache is remote in these tests, the database should slightly outperform the cache.

Publikowanie i uruchamianie na platformie AzurePublish and run in Azure

Inicjowanie obsługi administracyjnej bazy danych aplikacjiProvision a database for the app

W tej sekcji zostanie zainicjowana Nowa baza danych w SQL Database, aby aplikacja mogła korzystać z usługi na platformie Azure.In this section, you will provision a new database in SQL Database for the app to use while hosted in Azure.

  1. W witrynie Azure Portal kliknij pozycję Utwórz zasób w prawym lewym rogu.In the Azure portal, Click Create a resource in the upper left-hand corner of the Azure portal.

  2. Na stronie Nowy kliknij pozycje Bazy danych > SQL Database .On the New page, click Databases > SQL Database .

  3. Dla nowej bazy danych SQL Database użyj następujących ustawień:Use the following settings for the new SQL Database:

    UstawienieSetting       Sugerowana wartośćSuggested value OpisDescription
    Nazwa bazy danychDatabase name ContosoTeamsDatabaseContosoTeamsDatabase Prawidłowe nazwy baz danych znajdują się w temacie identyfikatory baz danych.For valid database names, see Database Identifiers.
    SubskrypcjaSubscription Twoja subskrypcjaYour subscription Wybierz tę samą subskrypcję, która została użyta do utworzenia pamięci podręcznej i hostowania usługi App Service.Select the same subscription you used to create the cache and host the App Service.
    Grupa zasobówResource group TestResourceGroupTestResourceGroup Kliknij pozycję Użyj istniejącej i użyj tej samej grupy zasobów, w której umieszczono pamięć podręczną i usługę App Service.Click Use existing and use the same resource group where you placed your cache and App Service.
    Wybierz źródłoSelect source Pusta baza danychBlank database Zacznij od pustej bazy danych.Start with a blank database.
  4. W obszarze Serwer kliknij pozycje Skonfiguruj wymagane ustawienia > Utwórz nowy serwer i podaj następujące informacje, a następnie kliknij przycisk Wybierz :Under Server , click Configure required settings > Create a new server and provide the following information and then click the Select button:

    UstawienieSetting       Sugerowana wartośćSuggested value OpisDescription
    Nazwa serweraServer name Dowolna nazwa unikatowa w skali globalnejAny globally unique name Prawidłowe nazwy serwera opisano w artykule Naming rules and restrictions (Reguły i ograniczenia nazewnictwa).For valid server names, see Naming rules and restrictions.
    Identyfikator logowania administratora serweraServer admin login Dowolna prawidłowa nazwaAny valid name Prawidłowe nazwy logowania można znaleźć w temacie identyfikatory baz danych.For valid login names, see Database Identifiers.
    HasłoPassword Dowolne prawidłowe hasłoAny valid password Hasło musi mieć co najmniej 8 znaków i musi zawierać znaki z trzech z następujących kategorii: wielkie litery, małe litery, cyfry i znaki inne niż alfanumeryczne.Your password must have at least 8 characters and must contain characters from three of the following categories: upper case characters, lower case characters, numbers, and non-alphanumeric characters.
    LokalizacjaLocation East USEast US Wybierz ten sam region, w którym utworzono pamięć podręczną i usługę App Service.Select the same region where you created the cache and App Service.
  5. Kliknij pozycję Przypnij do pulpitu nawigacyjnego , a następnie pozycję Utwórz , aby utworzyć nową bazę danych i nowy serwer.Click Pin to dashboard and then Create to create the new database and server.

  6. Po utworzeniu nowej bazy danych kliknij pozycję Pokaż parametry połączenia bazy danych i skopiuj parametry połączenia ADO.NET .Once the new database is created, click Show database connection strings and copy the ADO.NET connection string.

    Pokazywanie parametrów połączeń

  7. W witrynie Azure Portal przejdź do usługi App Service i kliknij pozycję Ustawienia aplikacji , a następnie pozycję Dodaj nowe parametry połączenia w sekcji Parametry połączenia.In the Azure portal, navigate to your App Service and click Application Settings , then Add new connection string under the Connection strings section.

  8. Dodaj nowe parametry połączenia o nazwie TeamContext , aby zachować zgodność z klasą kontekstu bazy danych platformy Entity Framework.Add a new connection string named TeamContext to match the Entity Framework database context class. Wklej parametry połączenia dla nowej bazy danych jako wartość.Paste the connection string for your new database as the value. Pamiętaj, aby zastąpić następujące symbole zastępcze w parametrach połączenia, a następnie kliknij pozycję Zapisz :Be sure to replace the following placeholders in the connection string and click Save :

    Symbol zastępczyPlaceholder Sugerowana wartośćSuggested value
    {your_username}{your_username} Użyj identyfikatora logowania administratora serwera dla właśnie utworzonego serwera.Use the server admin login for the server you just created.
    {your_password}{your_password} Użyj hasła dla właśnie utworzonego serwera.Use the password for the server you just created.

    Gdy dodasz nazwę użytkownika i hasło jako ustawienie aplikacji, wartości te nie zostaną umieszczone w kodzie.By adding the username and password as an Application Setting, your username and password are not included in your code. To podejście pomaga chronić te poświadczenia.This approach helps protect those credentials.

Publikowanie aktualizacji aplikacji na platformie AzurePublish the application updates to Azure

W tym kroku samouczka opublikujesz aktualizacje aplikacji na platformie Azure w celu uruchamiania jej w chmurze.In this step of the tutorial, you'll publish the application updates to Azure to run it in the cloud.

  1. Kliknij prawym przyciskiem myszy projekt ContosoTeamStats w programie Visual Studio i wybierz polecenie Publikuj .Right-click the ContosoTeamStats project in Visual Studio and choose Publish .

    Publikowanie

  2. Kliknij pozycję Opublikuj , aby użyć tego samego profilu publikowania, który został utworzony w ramach przewodnika Szybki start.Click Publish to use the same publishing profile you created in the quickstart.

  3. Po zakończeniu publikowania program Visual Studio uruchomi aplikację w domyślnej przeglądarce internetowej.Once publishing is complete, Visual Studio launches the app in your default web browser.

    Dodano pamięć podręczną

    W poniższej tabeli opisano każdy link akcji z przykładowej aplikacji:The following table describes each action link from the sample application:

    AkcjaAction OpisDescription
    Kliknięcie przycisku NoweCreate New Tworzenie nowego zespołu.Create a new Team.
    Play Season (Odtwarzaj sezon)Play Season Odtwarzanie sezonu gier, aktualizacja statystyk zespołu i czyszczenie nieaktualnych danych zespołu z pamięci podręcznej.Play a season of games, update the team stats, and clear any outdated team data from the cache.
    Clear Cache (Wyczyść pamięć podręczną)Clear Cache Czyszczenie statystyk zespołu z pamięci podręcznej.Clear the team stats from the cache.
    List from Cache (Lista z pamięci podręcznej)List from Cache Pobieranie statystyk zespołu z pamięci podręcznej.Retrieve the team stats from the cache. W przypadku braku trafienia pamięci podręcznej ładuje statystyki z bazy danych i zapisuje je w pamięci podręcznej do użytku następnym razem.If there is a cache miss, load the stats from the database and save to the cache for next time.
    Sorted Set from Cache (Zestaw posortowany z pamięci podręcznej)Sorted Set from Cache Pobieranie statystyk zespołu z pamięci podręcznej przy użyciu zestawu posortowanego.Retrieve the team stats from the cache using a sorted set. W przypadku braku trafienia pamięci podręcznej ładuje statystyki z bazy danych i zapisuje je w pamięci podręcznej przy użyciu zestawu posortowanego.If there is a cache miss, load the stats from the database and save to the cache using a sorted set.
    Top 5 Teams from Cache (5 najlepszych zespołów z pamięci podręcznej)Top 5 Teams from Cache Pobieranie najlepszych 5 zespołów z pamięci podręcznej przy użyciu zestawu posortowanego.Retrieve the top 5 teams from the cache using a sorted set. W przypadku braku trafienia pamięci podręcznej ładuje statystyki z bazy danych i zapisuje je w pamięci podręcznej przy użyciu zestawu posortowanego.If there is a cache miss, load the stats from the database and save to the cache using a sorted set.
    Load from DB (Ładuj z bazy danych)Load from DB Pobieranie statystyk zespołu z bazy danych.Retrieve the team stats from the database.
    Rebuild DB (Odbuduj bazę danych)Rebuild DB Odbudowywanie bazy danych i ponowne jej ładowanie z użyciem przykładowych danych zespołu.Rebuild the database and reload it with sample team data.
    Edytuj / Szczegóły / UsuńEdit / Details / Delete Edytowanie zespołu, wyświetlanie szczegółów dla zespołu, usuwanie zespołu.Edit a team, view details for a team, delete a team.

Klikaj różne akcje i eksperymentuj z pobieraniem danych z różnych źródeł.Click some of the actions and experiment with retrieving the data from the different sources. Zwróć uwagę na różnice czasu, który jest potrzebny do realizacji różnych sposobów pobierania danych z bazy danych i pamięci podręcznej.Note the differences in the time it takes to complete the various ways of retrieving the data from the database and the cache.

Czyszczenie zasobówClean up resources

Po zakończeniu pracy z przykładową aplikacją z samouczka możesz usunąć używane zasoby platformy Azure w celu oszczędności kosztów i zasobów.When you are finished with the sample tutorial application, you can delete the Azure resources used in order to conserve cost and resources. Wszystkie zasoby powinny być zawarte w tej samej grupie zasobów, więc można je usunąć razem w ramach jednej operacji, usuwając grupę zasobów.All of your resources should be contained in the same resource group, you can delete them together in one operation by deleting the resource group. Instrukcje dla tego tematu korzystały z grupy zasobów o nazwie TestResources .The instructions for this topic used a resource group named TestResources .

Ważne

Usunięcie grupy zasobów jest nieodwracalne i grupa zasobów oraz wszystkie zawarte w niej zasoby zostaną trwale usunięte.Deleting a resource group is irreversible and that the resource group and all the resources in it are permanently deleted. Uważaj, aby nie usunąć przypadkowo niewłaściwych zasobów lub grupy zasobów.Make sure that you do not accidentally delete the wrong resource group or resources. Jeśli zasoby do hostowania tego przykładu zostały utworzone wewnątrz istniejącej grupy zasobów zawierającej zasoby, które chcesz zachować, możesz usunąć każdy zasób oddzielnie z odpowiadającego mu bloku.If you created the resources for hosting this sample inside an existing resource group, that contains resources you want to keep, you can delete each resource individually from their respective blades.

  1. Zaloguj się do witryny Azure Portal i kliknij pozycję Grupy zasobów .Sign in to the Azure portal and click Resource groups .

  2. Wpisz nazwę grupy zasobów w polu tekstowym Filtruj elementy... .Type the name of your resource group into the Filter items... textbox.

  3. Kliknij pozycję ... z prawej strony grupy zasobów i kliknij pozycję Usuń grupę zasobów .Click ... to the right of your resource group and click Delete resource group .

    Usuń

  4. Zobaczysz prośbę o potwierdzenie usunięcia grupy zasobów.You will be asked to confirm the deletion of the resource group. Wpisz nazwę grupy zasobów w celu potwierdzenia, a następnie kliknij pozycję Usuń .Type the name of your resource group to confirm, and click Delete .

    Po krótkim czasie grupa zasobów i wszystkie zawarte w niej zasoby zostaną usunięte.After a few moments, the resource group and all of its contained resources are deleted.

Następne krokiNext steps