Tutorial: Criar uma classificação cache-aside no ASP.NETTutorial: Create a cache-aside leaderboard on ASP.NET

Neste tutorial, você atualizará o aplicativo Web ContosoTeamStats ASP.net, criado no guia de início rápido do ASP.net para o cache do Azure para Redis, para incluir um placar que usa o padrão de reserva de cache com o cache do Azure para 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. O aplicativo de exemplo exibe uma lista de estatísticas de equipe de um banco de dados e demonstra maneiras diferentes de usar o cache do Azure para Redis para armazenar e recuperar dados do cache para melhorar o desempenho.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. Quando você concluir o tutorial, terá um aplicativo Web em execução que lê e grava em um banco de dados, otimizado com o cache do Azure para Redis e hospedado no 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.

Neste tutorial, ficará a saber como:In this tutorial, you learn how to:

  • Melhore a taxa de transferência de dados e reduza a carga do banco de dados, armazenando e recuperando o cache do Azure para Redis.Improve data throughput and reduce database load by storing and retrieving data using Azure Cache for Redis.
  • Utilizar um conjunto ordenado de Redis para obter as cinco melhores equipas.Use a Redis sorted set to retrieve the top five teams.
  • Aprovisionar os recursos do Azure para a aplicação com um modelo do Resource Manager.Provision the Azure resources for the application using a Resource Manager template.
  • Publicar a aplicação no Azure com o Visual Studio.Publish the application to Azure using Visual Studio.

Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.If you don't have an Azure subscription, create a free account before you begin.

Pré-requisitosPrerequisites

Para concluir este tutorial, deve ter os seguintes pré-requisitos:To complete this tutorial, you must have the following prerequisites:

Adicione uma classificação ao projetoAdd a leaderboard to the project

Nesta secção do tutorial, vai configurar o projeto ContosoTeamStats com uma classificação que comunica as estatísticas das vitorias, derrotas e empates de uma lista de equipas fictícias.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.

Adicionar o Entity Framework ao projetoAdd the Entity Framework to the project

  1. No Visual Studio, abra a solução ContosoTeamStats que você criou no guia de início rápido do ASP.net para o cache do Azure para Redis.In Visual Studio, open the ContosoTeamStats Solution that you created in the ASP.NET quickstart for Azure Cache for Redis.

  2. Clique em Ferramentas > Gestor de Pacotes NuGet >Consola do Gestor de Pacotes.Click Tools > NuGet Package Manager > Package Manager Console.

  3. Emita o comando seguinte na janela da Consola do Gestor de Pacotes para instalar o EntityFramework:Run the following command from the Package Manager Console window to install EntityFramework:

    Install-Package EntityFramework
    

Para mais informações sobre este pacote, consulte a página NuGet EntityFramework.For more information about this package, see the EntityFramework NuGet page.

Adicionar o Modelo de equipaAdd the Team model

  1. Clique com o botão direito do rato em Modelos no Explorador de Soluções e escolha Adicionar, Classe.Right-click Models in Solution Explorer, and choose Add, Class.

  2. Introduza Team para o nome de classe e clique em Adicionar.Enter Team for the class name and click Add.

    Adicionar a classe de modelo

  3. Substitua as instruções using na parte superior do ficheiro Team.cs pelas seguintes instruções 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. Substitua a definição da classe Team pelo seguinte fragmento de código que contém uma definição da classe Team atualizada, bem como outras classes do programa auxiliar do 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. Neste tutorial, está a utilizar a primeira abordagem de código com o Entity Framework.This tutorial is using the code first approach with Entity Framework. Esta abordagem permite ao Entity Framework criar a base de dados a partir do código.This approach allows Entity Framework to create the database from your code. Para obter mais informações sobre a abordagem Code First para o Entity Framework utilizado neste tutorial, veja Code first to a new database (Code First para criar uma nova base de dados).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. No Explorador de Soluções, faça duplo clique em Web.config para abri-lo.In Solution Explorer, double-click Web.config to open it.

    Web.config

  6. Adicione a seguinte secção connectionStrings dentro da secção configuration.Add the following connectionStrings section inside the configuration section. O nome da cadeia de ligação tem de corresponder ao nome da classe de contexto da base de dados do Entity Framework, que é TeamContext.The name of the connection string must match the name of the Entity Framework database context class, which is TeamContext.

    Essa cadeia de conexão pressupõe que você atendeu aos pré-requisitos e instalou o SQL Server Express LocalDB, que faz parte da carga de trabalho de desenvolvimento de desktop .net instalada com o 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>
    

    O exemplo seguinte mostra a nova secção connectionStrings depois de configSections dentro da secção 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>
        ...
    

Adicionar o TeamsController e as vistasAdd the TeamsController and views

  1. No Visual Studio, crie o projeto.In Visual Studio, build the project.

  2. No Explorador de Soluções, clique com o botão direito do rato na pasta Controladores e escolha Adicionar, Controlador.In Solution Explorer, right-click the Controllers folder and choose Add, Controller.

  3. Escolha Controlador MVC 5 com vistas através do Entity Framework e clique em Adicionar.Choose MVC 5 Controller with views, using Entity Framework, and click Add. Se for apresentado um erro depois de clicar em Adicionar, confirme que criou primeiro o projeto.If you get an error after clicking Add, ensure that you have built the project first.

    Adicionar a classe de controlador

  4. Selecione Team (ContosoTeamStats.Models) na lista pendente Classe de modelo.Select Team (ContosoTeamStats.Models) from the Model class drop-down list. Selecione TeamContext (ContosoTeamStats.Models) na lista pendente Classe de contexto de dados.Select TeamContext (ContosoTeamStats.Models) from the Data context class drop-down list. Introduza TeamsController na caixa de texto Nome do controlador (se não for automaticamente povoado).Type TeamsController in the Controller name textbox (if it is not automatically populated). Clique em Adicionar para criar a classe de controlador e adicionar vistas predefinidas.Click Add to create the controller class and add the default views.

    Configurar o controlador

  5. No Explorador de Soluções, expanda Global.asax e faça duplo clique em Global.asax.cs para abri-lo.In Solution Explorer, expand Global.asax and double-click Global.asax.cs to open it.

    Global.asax.cs

  6. Adicione as duas instruções using seguintes na parte superior do ficheiro, sob as outras declarações 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. Adicione a seguinte linha de código no final do método Application_Start:Add the following line of code at the end of the Application_Start method:

    Database.SetInitializer<TeamContext>(new TeamInitializer());
    
  8. No Explorador de Soluções, expanda App_Start e faça duplo clique em RouteConfig.cs.In Solution Explorer, expand App_Start and double-click RouteConfig.cs.

    RouteConfig.cs

  9. No método RegisterRoutes, substitua controller = "Home" na rota Default por controller = "Teams", conforme mostrado no seguinte exemplo: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 }
    );
    

Configurar a vista do EsquemaConfigure the Layout view

  1. No Explorador de Soluções, expanda a pasta Vistas, em seguida, a pasta Partilhado e faça duplo clique em _Layout.cshtml.In Solution Explorer, expand the Views folder and then the Shared folder, and double-click _Layout.cshtml.

    _Layout.cshtml

  2. Altere o conteúdo do elemento title e substitua My ASP.NET Application por Contoso Team Stats, conforme mostrado no exemplo seguinte: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. Na seção body, adicione a seguinte nova instrução Html.ActionLink para Estatísticas da equipe contoso logo abaixo do link para o cache do Azure para teste Redis.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" })`
    

    Alterações do código

  4. Prima Ctrl+F5 para criar e executar a aplicação.Press Ctrl+F5 to build and run the application. Esta versão da aplicação lê os resultados diretamente na base de dados.This version of the application reads the results directly from the database. Tenha em atenção que as ações Criar Nova, Editar, Detalhes e Eliminar foram automaticamente adicionadas à aplicação pela estrutura do Controlador 5 MVC com vistas através do 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. Na próxima seção do tutorial, você adicionará o cache do Azure para Redis para otimizar o acesso a dados e fornecer recursos adicionais para o aplicativo.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.

    Aplicação de arranque

Configurar o aplicativo para o cache do Azure para RedisConfigure the app for Azure Cache for Redis

Nesta seção do tutorial, você configura o aplicativo de exemplo para armazenar e recuperar estatísticas da equipe da Contoso de um cache do Azure para a instância Redis usando o cliente de cache 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.

Adicionar uma ligação de cache ao Controlador de EquipasAdd a cache connection to the Teams Controller

Já instalou o pacote da biblioteca de cliente StackExchange.Redis no início rápido.You already installed the StackExchange.Redis client library package in the quickstart. Também já configurou a definição da aplicação CacheConnection para ser utilizada localmente e com o Serviço de Aplicações publicado.You also have already configured the CacheConnection app setting to be used locally, and with the published App Service. Utilize esta mesma biblioteca de cliente e as informações de CacheConnection no TeamsController.Use this same client library and CacheConnection information in the TeamsController.

  1. No Explorador de Soluções, expanda a pasta Controladores e faça duplo clique em TeamsController.cs para abri-la.In Solution Explorer, expand the Controllers folder and double-click TeamsController.cs to open it.

    Controlador de equipas

  2. Adicione as duas instruções using seguintes ao TeamsController.cs:Add the following two using statements to TeamsController.cs:

    using System.Configuration;
    using StackExchange.Redis;
    
  3. Adicione as duas propriedades seguintes à classe 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;
        }
    }
    

Atualizar o TeamsController para ler a partir da cache ou da base de dadosUpdate the TeamsController to read from the cache or the database

Neste exemplo, as estatísticas da equipa podem ser obtidas a partir da base de dados ou da cache.In this sample, team statistics can be retrieved from the database or from the cache. As estatísticas da equipa são armazenadas na cache como uma List<Team> serializada e também como um conjunto ordenado que utiliza tipos de dados de Redis.Team statistics are stored in the cache as a serialized List<Team>, and also as a sorted set using Redis data types. Ao obter itens de um conjunto ordenado, poderá obter alguns, todos ou consultar determinados itens.When retrieving items from a sorted set, you can retrieve some, all, or query for certain items. Neste exemplo, vai consultar o conjunto ordenado para obter as cinco melhores equipas classificadas por número de vitórias.In this sample, you'll query the sorted set for the top 5 teams ranked by number of wins.

Não é necessário armazenar as estatísticas de equipe em vários formatos no cache para usar o cache do Azure para Redis.It is not required to store the team statistics in multiple formats in the cache in order to use Azure Cache for Redis. Este tutorial utiliza vários formatos para demonstrar as diferentes formas e os diferentes tipos de dados que pode utilizar para colocar dados em cache.This tutorial uses multiple formats to demonstrate some of the different ways and different data types you can use to cache data.

  1. Adicione as seguintes instruções using na parte superior do ficheiro TeamsController.cs, juntamente com as outras instruções 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. Substitua a atual implementação de método public ActionResult Index() pela seguinte implementação: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. Adicione os três métodos seguintes à classe TeamsController para implementar os tipos de ação playGames, clearCache e rebuildDB a partir da instrução switch adicionada ao fragmento de código anterior.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.

    O método PlayGames atualiza as estatísticas da equipa simulando uma época de jogos, guarda os resultados na base de dados e limpa os dados agora desatualizados da cache.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();
    }
    

    O método RebuildDB reinicializa a base de dados com o conjunto de equipas predefinido, gera as estatísticas e limpa os dados agora desatualizados da cache.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();
    }
    

    O método ClearCachedTeams remove quaisquer estatísticas de equipa em cache da cache.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. Adicione os quatro métodos seguintes à classe TeamsController para implementar as várias formas de obter as estatísticas da equipa a partir da cache e da base de dados.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. Cada um destes métodos devolve uma List<Team>, que é depois apresentada pela vista.Each of these methods returns a List<Team>, which is then displayed by the view.

    O método GetFromDB lê as estatísticas da equipa a partir da base de dados.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>();
    }
    

    O método GetFromList lê as estatísticas da equipa a partir da cache, como uma List<Team> serializada.The GetFromList method reads the team statistics from cache as a serialized List<Team>. Se as estatísticas não estiverem presentes na cache, ocorrerá uma falha de acerto na cache.If the statistics are not present in the cache, a cache miss occurs. Se existir uma falha de acerto na cache, as estatísticas da equipa serão lidas a partir da base de dados e, em seguida, armazenadas para o próximo pedido.For a cache miss, the team statistics are read from the database and then stored in the cache for the next request. Neste exemplo, a serialização JSON.NET é utilizada para serializar os objetos .NET de/para a cache.In this sample, JSON.NET serialization is used to serialize the .NET objects to and from the cache. Para obter mais informações, consulte como trabalhar com objetos .net no cache do Azure para 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;
    }
    

    O método GetFromSortedSet lê as estatísticas da equipa a partir de um conjunto ordenado em cache.The GetFromSortedSet method reads the team statistics from a cached sorted set. Se existir uma falha de acerto na cache, as estatísticas da equipa são lidos a partir da base de dados e armazenadas na cache como um conjunto ordenado.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;
    }
    

    O método GetFromSortedSetTop5 lê as cinco melhores equipas a partir do conjunto ordenado em cache.The GetFromSortedSetTop5 method reads the top five teams from the cached sorted set. Começa por verificar se a chave teamsSortedSet existe na cache.It starts by checking the cache for the existence of the teamsSortedSet key. Se esta chave não estiver presente, o método GetFromSortedSet é chamado para ler as estatísticas da equipa e para armazená-las na cache.If this key is not present, the GetFromSortedSet method is called to read the team statistics and store them in the cache. Em seguida, o conjunto ordenado em cache é consultado relativamente às cinco melhores equipas que são devolvidas.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;
    }
    

Atualizar os métodos Criar, Editar e Eliminar para trabalhar com a cacheUpdate the Create, Edit, and Delete methods to work with the cache

O código da estrtura gerado como parte deste exemplo inclui métodos para adicionar, editar e eliminar equipas.The scaffolding code that was generated as part of this sample includes methods to add, edit, and delete teams. Sempre que uma equipa é adicionada, editada ou removida, os dados na cache ficam desatualizados.Anytime a team is added, edited, or removed, the data in the cache becomes outdated. Nesta secção, vai modificar estes três métodos para limpar as equipas em cache para que a cache seja atualizada.In this section, you'll modify these three methods to clear the cached teams so that the cache will be refreshed.

  1. Navegue para o método Create(Team team), na classe TeamsController.Browse to the Create(Team team) method in the TeamsController class. Adicione uma chamada ao método ClearCachedTeams, conforme mostrado no seguinte exemplo: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. Navegue para o método Edit(Team team), na classe TeamsController.Browse to the Edit(Team team) method in the TeamsController class. Adicione uma chamada ao método ClearCachedTeams, conforme mostrado no seguinte exemplo: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. Navegue para o método DeleteConfirmed(int id), na classe TeamsController.Browse to the DeleteConfirmed(int id) method in the TeamsController class. Adicione uma chamada ao método ClearCachedTeams, conforme mostrado no seguinte exemplo: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");
    }
    

Adicionar métodos de colocação em cache para a vista Índice de EquipasAdd caching methods to the Teams Index view

  1. No Explorador de Soluções, expanda a pasta Vistas, em seguida, a pasta Equipas e faça duplo clique em Index.cshtml.In Solution Explorer, expand the Views folder, then the Teams folder, and double-click Index.cshtml.

    Index.cshtml

  2. Perto da parte superior do ficheiro, procure o seguinte elemento de parágrafo:Near the top of the file, look for the following paragraph element:

    Tabela de ações

    Esta ligação cria uma nova equipa.This link creates a new team. Substitua o elemento de parágrafo pela seguinte tabela.Replace the paragraph element with the following table. Esta tabela tem ligações de ação para criar uma nova equipa, reproduzir uma nova época de jogos, limpar a cache, obter as equipas a partir da cache em vários formatos, obter as equipas a partir da base de dados e reconstruir a base de dados com novos dados de exemplo.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. Desloque-se para o fim do ficheiro Index.cshtml e adicione o seguinte elemento tr, de forma a ser a última linha na última tabela do ficheiro: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>
    

    Esta linha apresenta o valor de ViewBag.Msg, que contém um relatório de estado sobre a operação atual.This row displays the value of ViewBag.Msg which contains a status report about the current operation. O ViewBag.Msg é definido quando clicar em qualquer uma das ligações de ação do passo anterior.The ViewBag.Msg is set when you click any of the action links from the previous step.

    Mensagem de estado

  4. Prima F6 para criar o projeto.Press F6 to build the project.

Executar a aplicação localmenteRun the app locally

Execute a aplicação localmente no computador para verificar a funcionalidade que foi adicionada para suportar as equipas.Run the application locally on your machine to verify the functionality that has been added to support the teams.

Neste teste, tanto a aplicação como a base de dados estão a ser executadas localmente.In this test, the application and database, are both running locally. No entanto, o cache do Azure para Redis é hospedado remotamente no Azure.However, the Azure Cache for Redis is hosted remotely in Azure. Por conseguinte, a cache pode provavelmente apresentar um desempenho ligeiramente inferior da base de dados.Therefore, the cache will likely under-perform the database slightly. Para obter o melhor desempenho, o aplicativo cliente e o cache do Azure para a instância Redis devem estar no mesmo local.For best performance, the client application and Azure Cache for Redis instance should be in the same location. Na secção seguinte, vai implementar todos os recursos no Azure para ver o desempenho melhorado resultante da utilização de uma cache.In the next section, you will deploy all resources to Azure to see the improved performance from using a cache.

Para executar a aplicação localmente:To run the app locally:

  1. Prima Ctrl+F5 para executar a aplicação.Press Ctrl+F5 to run the application.

    Aplicação em execução localmente

  2. Teste cada um dos novos métodos adicionados à vista.Test each of the new methods that were added to the view. Uma vez que a cache nestes testes é remota, a base de dados deve superar ligeiramente o desempenho da cache.Since the cache is remote in these tests, the database should slightly outperform the cache.

Publicar e executar no AzurePublish and run in Azure

Aprovisionar uma base de dados SQL Azure para a aplicaçãoProvision a SQL Azure database for the app

Nesta secção, vai aprovisionar uma nova base de dados SQL Azure para a aplicação utilizar enquanto estiver alojada no Azure.In this section, you will provision a new SQL Azure database for the app to use while hosted in Azure.

  1. No portal do Azure, clique em Criar um recursono canto superior esquerdo do portal do Azure.In the Azure portal, Click Create a resource in the upper left-hand corner of the Azure portal.

  2. Na página Novo, clique em Bases de dados > base de dados SQL.On the New page, click Databases > SQL Database.

  3. Utilize as seguintes definições para a nova Base de Dados SQL:Use the following settings for the new SQL Database:

    DefiniçãoSetting       Valor sugeridoSuggested value DescriçãoDescription
    Nome da base de dadosDatabase name ContosoTeamsDatabaseContosoTeamsDatabase Para nomes de bases de dados válidos, veja Database Identifiers (Identificadores de Bases de Dados).For valid database names, see Database Identifiers.
    SubscriçãoSubscription A sua subscriçãoYour subscription Selecione a mesma subscrição que utilizou para criar a cache e alojar o Serviço de Aplicações.Select the same subscription you used to create the cache and host the App Service.
    Grupo de recursosResource group TestResourceGroupTestResourceGroup Clique em Utilizar existente e utilize o mesmo grupo de recursos onde colocou a cache e o Serviço de Aplicações.Click Use existing and use the same resource group where you placed your cache and App Service.
    Selecionar origemSelect source Base de dados vaziaBlank database Começar com uma base de dados vazia.Start with a blank database.
  4. Em Servidor, clique em Configurar definições necessárias > Criar um novo servidor, forneça as seguintes informações e clique no botão Selecionar:Under Server, click Configure required settings > Create a new server and provide the following information and then click the Select button:

    DefiniçãoSetting       Valor sugeridoSuggested value DescriçãoDescription
    Nome do servidorServer name Qualquer nome globalmente exclusivoAny globally unique name Para nomes de servidores válidos, veja Naming rules and restrictions (Atribuição de nomes de regras e restrições).For valid server names, see Naming rules and restrictions.
    Início de sessão de administrador do servidorServer admin login Qualquer nome válidoAny valid name Para nomes de início de sessão válidos, veja Database Identifiers (Identificadores de Bases de Dados).For valid login names, see Database Identifiers.
    Palavra-passePassword Qualquer palavra-passe válidaAny valid password A sua palavra-passe deve ter, pelo menos, oito carateres e deve conter carateres de três das seguintes categorias: carateres maiúsculos, carateres minúsculos, números e carateres não alfanuméricos.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.
    LocalizaçãoLocation EUA LesteEast US Selecione a mesma região onde criou a cache e o Serviço de Aplicações.Select the same region where you created the cache and App Service.
  5. Clique em Afixar ao dashboard e em Criar para criar a nova base de dados e o servidor.Click Pin to dashboard and then Create to create the new database and server.

  6. Uma vez criada a nova base de dados, clique em Mostrar cadeias de ligação da base de dados e copie a cadeia de ligação ADO.NET.Once the new database is created, click Show database connection strings and copy the ADO.NET connection string.

    Mostrar cadeias de ligação

  7. No portal do Azure, navegue até ao Serviço de Aplicações, clique em Definições da Aplicação e, em seguida, clique em Adicionar nova cadeia de ligação na secção Cadeia de ligação.In the Azure portal, navigate to your App Service and click Application Settings, then Add new connection string under the Connection strings section.

  8. Adicione uma nova cadeia de ligação com o nome TeamContext para corresponder à classe de contexto da base de dados do Entity Framework.Add a new connection string named TeamContext to match the Entity Framework database context class. Cole a cadeia de ligação para a nova base de dados como o valor.Paste the connection string for your new database as the value. Confirme que substitui os seguintes marcadores na cadeia de ligação e clique em Guardar:Be sure to replace the following placeholders in the connection string and click Save:

    Marcador de posiçãoPlaceholder Valor sugeridoSuggested value
    {o_seu_nome_de_utilizador}{your_username} Utilize o início de sessão de administrador do servidor do servidor da base de dados que acabou de criar.Use the server admin login for the database server you just created.
    {a_sua_palavra-passe}{your_password} Utilize a palavra-passe do servidor da base de dados que acabou de criar.Use the password for the database server you just created.

    Ao adicionar o nome de utilizador e a palavra-passe como uma Definição da Aplicação, o nome de utilizador e a palavra-passe não são incluídos no código.By adding the username and password as an Application Setting, your username and password are not included in your code. Esta abordagem ajuda a proteger essas credenciais.This approach helps protect those credentials.

Publicar as atualizações da aplicação no AzurePublish the application updates to Azure

Neste passo do tutorial, vai publicar as atualizações da aplicação no Azure e executá-las na cloud.In this step of the tutorial, you'll publish the application updates to Azure to run it in the cloud.

  1. Clique com o botão direito do rato no projeto ContosoTeamStats do Visual Studio e escolha Publicar.Right-click the ContosoTeamStats project in Visual Studio and choose Publish.

    Publicar

  2. Clique em Publicar para utilizar o mesmo perfil de publicação que criou no início rápido.Click Publish to use the same publishing profile you created in the quickstart.

  3. Após a conclusão da publicação, o Visual Studio inicia a aplicação no browser predefinido.Once publishing is complete, Visual Studio launches the app in your default web browser.

    Cache adicionada

    A tabela seguinte descreve cada ligação de ação da aplicação de exemplo:The following table describes each action link from the sample application:

    AçãoAction DescriçãoDescription
    Criar NovoCreate New Crie uma nova Equipa.Create a new Team.
    Reproduzir ÉpocaPlay Season Reproduza uma época de jogos, atualize as estatísticas da equipa e limpe quaisquer dados da equipa desatualizados da cache.Play a season of games, update the team stats, and clear any outdated team data from the cache.
    Limpar CacheClear Cache Limpe as estatísticas da equipa na cache.Clear the team stats from the cache.
    Lista na CacheList from Cache Obtenha as estatísticas da equipa a partir da cache.Retrieve the team stats from the cache. Se existir uma falha de acerto na cache, carregue as estatísticas da base de dados e guarde-as na cache para a próxima utilização.If there is a cache miss, load the stats from the database and save to the cache for next time.
    Conjunto Ordenado na CacheSorted Set from Cache Obtenha as estatísticas da equipa a partir da cache com um conjunto ordenado.Retrieve the team stats from the cache using a sorted set. Se existir uma falha de acerto na cache, carregue as estatísticas da base de dados e guarde-as na cache utilizando um conjunto ordenado.If there is a cache miss, load the stats from the database and save to the cache using a sorted set.
    Cinco Melhores Equipas na CacheTop 5 Teams from Cache Obtenha as cinco melhores equipas a partir da cache com um conjunto ordenado.Retrieve the top 5 teams from the cache using a sorted set. Se existir uma falha de acerto na cache, carregue as estatísticas da base de dados e guarde-as na cache utilizando um conjunto ordenado.If there is a cache miss, load the stats from the database and save to the cache using a sorted set.
    Carregar da Base de DadosLoad from DB Obtenha as estatísticas da equipa a partir da base de dados.Retrieve the team stats from the database.
    Recriar Base de DadosRebuild DB Recrie a base de dados e volte a carregá-la com os dados da equipa de exemplo.Rebuild the database and reload it with sample team data.
    Editar/Detalhes/EliminarEdit / Details / Delete Edite uma equipa, veja os detalhes de uma equipa, elimine uma equipa.Edit a team, view details for a team, delete a team.

Clique em algumas das ações e experimente obter os dados a partir de diferentes fontes.Click some of the actions and experiment with retrieving the data from the different sources. Repare nas diferenças existentes no tempo de obtenção dos dados a partir da base de dados e da cache.Note the differences in the time it takes to complete the various ways of retrieving the data from the database and the cache.

Limpar recursosClean up resources

Quando tiver terminado o tutorial da aplicação de exemplo, poderá eliminar os recursos do Azure utilizados para conservar os custos e os recursos.When you are finished with the sample tutorial application, you can delete the Azure resources used in order to conserve cost and resources. Todos os recursos devem estar presentes no mesmo grupo de recursos para poder eliminá-los numa única operação ao eliminar o grupo de recursos.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. As instruções neste tópico utilizaram um grupo de recursos denominado TestResources.The instructions for this topic used a resource group named TestResources.

Importante

A eliminação de um grupo de recursos é irreversível e o grupo de recursos e todos os recursos contidos no mesmo serão permanentemente eliminados.Deleting a resource group is irreversible and that the resource group and all the resources in it are permanently deleted. Confirme que não elimina acidentalmente o grupo de recursos ou recursos errados.Make sure that you do not accidentally delete the wrong resource group or resources. Se tiver criado os recursos para alojar este exemplo num grupo de recursos existente que contém os recursos que pretende manter, poderá eliminar cada recurso individualmente nos respetivos painéis.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. Inicie sessão no Portal do Azure e clique em Grupos de recursos.Sign in to the Azure portal and click Resource groups.

  2. Escreva o nome do seu grupo de recursos na caixa de texto Filtrar itens…Type the name of your resource group into the Filter items... textbox.

  3. Clique em ... , à direita do grupo de recursos, e em Eliminar grupo de recursos.Click ... to the right of your resource group and click Delete resource group.

    Eliminar

  4. É-lhe pedido que confirme a eliminação do grupo de recursos.You will be asked to confirm the deletion of the resource group. Escreva o nome do grupo de recursos para confirmar e clique em Eliminar.Type the name of your resource group to confirm, and click Delete.

    Após alguns instantes, o grupo de recursos e todos os recursos contidos no mesmo são eliminados.After a few moments, the resource group and all of its contained resources are deleted.

Passos seguintesNext steps