Öğretici: ASP.NET üzerinde edilgen önbellekli puan tablosu oluşturmaTutorial: Create a cache-aside leaderboard on ASP.NET

Bu öğreticide, redde için Azure önbelleği için ASP.net hızlıbaşlangıcı ' nda oluşturulan contosoteamstats ASP.NET Web uygulamasını, redsıs için Azure Cache ile birlikte önbellek modelini kullanan bir puan tablosu içerecek şekilde güncelleştecaksınız.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. Örnek uygulama bir veritabanındaki ekip istatistiklerinin listesini görüntüler ve performansı artırmak için önbellekten veri depolamak ve almak için Azure önbelleği 'ni kullanmak için farklı yollar gösterir.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. Öğreticiyi tamamladığınızda, bir veritabanını okuyan ve yazan, Redsıs için Azure önbelleğiyle en iyi duruma getirilmiş ve Azure 'da barındırılan, çalışan bir Web uygulamasına sahip olursunuz.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.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:In this tutorial, you learn how to:

  • Redsıs için Azure önbelleği 'ni kullanarak verileri depolayarak ve alarak veri üretimini geliştirme ve veritabanı yükünü azaltma.Improve data throughput and reduce database load by storing and retrieving data using Azure Cache for Redis.
  • En iyi beş takımı almak için bir Redis sıralanmış kümesi kullanma.Use a Redis sorted set to retrieve the top five teams.
  • Resource Manager şablonunu kullanarak uygulama için Azure kaynakları sağlama.Provision the Azure resources for the application using a Resource Manager template.
  • Visual Studio kullanarak uygulamayı yayımlama.Publish the application to Azure using Visual Studio.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.If you don't have an Azure subscription, create a free account before you begin.

ÖnkoşullarPrerequisites

Bu öğreticiyi tamamlamak için aşağıdaki ön koşullara sahip olmanız gerekir:To complete this tutorial, you must have the following prerequisites:

Projeye puan tablosu eklemeAdd a leaderboard to the project

Öğreticinin bu bölümünde, kurgusal takımlar listesi için galibiyet, mağlubiyet ve berabere kalma istatistiklerini bildiren bir puan tablosu ile ContosoTeamStats projesini yapılandırırsınız.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.

Projeye Entity Framework eklemeAdd the Entity Framework to the project

  1. Visual Studio 'da redsıs Için Azure önbelleği için ASP.net hızlı başlangıçbölümünde oluşturduğunuz contosoteamstats çözümünü açın.In Visual Studio, open the ContosoTeamStats Solution that you created in the ASP.NET quickstart for Azure Cache for Redis.

  2. Araçlar > NuGet Paket Yöneticisi > Paket Yöneticisi Konsolu ’na tıklayın.Click Tools > NuGet Package Manager > Package Manager Console .

  3. EntityFramework’ü yüklemek için Paket Yöneticisi Konsolu penceresinden aşağıdaki komutu çalıştırın:Run the following command from the Package Manager Console window to install EntityFramework:

    Install-Package EntityFramework
    

Bu paket hakkında daha fazla bilgi için EntityFramework NuGet sayfasına bakın.For more information about this package, see the EntityFramework NuGet page.

Takım modeli eklemeAdd the Team model

  1. Çözüm Gezgini ’nde Modeller ’e sağ tıklayın ve Ekle , Sınıf ’ı seçin.Right-click Models in Solution Explorer , and choose Add , Class .

  2. Sınıf adı için Team girin ve Ekle ’ye tıklayın.Enter Team for the class name and click Add .

    Model sınıfı ekleme

  3. Team.cs dosyasının üst kısmındaki using deyimlerini aşağıdaki using deyimleriyle değiştirin: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. Team sınıfının tanımını, bazı diğer Entity Framework yardımcı sınıflarının yanı sıra güncelleştirilmiş Team sınıf tanımını içeren aşağıdaki kod parçacığı ile değiştirin.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. Bu öğreticide, Entity Framework ile code first yaklaşımı kullanılmaktadır.This tutorial is using the code first approach with Entity Framework. Bu yaklaşım, Entity Framework’ün kodunuzdan veritabanını oluşturmasını sağlar.This approach allows Entity Framework to create the database from your code. Bu öğreticide kullanılan Entity Framework için ilk kod yaklaşımı hakkında daha fazla bilgi için, bkz. Yeni bir veritabanına ilk kod.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. Çözüm Gezgini , açmak için Web.config çift tıklayın.In Solution Explorer , double-click Web.config to open it.

    Web.config

  6. Aşağıdaki connectionStrings bölümünü configuration bölümüne ekleyin.Add the following connectionStrings section inside the configuration section. Bağlantı dizesinin adı, Entity Framework veritabanı bağlamı sınıfının adı olan TeamContext ile eşleşmelidir.The name of the connection string must match the name of the Entity Framework database context class, which is TeamContext.

    Bu bağlantı dizesi önkoşulları karşıladığınızı ve Visual Studio 2019 ile yüklenen .net masaüstü geliştirme iş yükünün bir parçası olan LocalDB SQL Server Express yüklediğinizi varsayar.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>
    

    Aşağıdaki örnek, configuration bölümündeki configSections bölümünü izleyen yeni connectionStrings bölümünü gösterir: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>
        ...
    

TeamsController ve görünümleri eklemeAdd the TeamsController and views

  1. Visual Studio’da projeyi derleyin.In Visual Studio, build the project.

  2. Çözüm Gezgini 'nde Denetleyiciler klasörüne sağ tıklayın ve Ekle , Denetleyici 'yi seçin.In Solution Explorer , right-click the Controllers folder and choose Add , Controller .

  3. Görünümlere sahip MVC 5 Denetleyici, Entity Framework kullanarak öğesini seçin ve Ekle ’ye tıklayın.Choose MVC 5 Controller with views, using Entity Framework , and click Add . Ekle ’ye tıkladıktan sonra herhangi bir hata alırsanız, önce projeyi oluşturduğunuzdan emin olun.If you get an error after clicking Add , ensure that you have built the project first.

    Denetleyici sınıfı ekleme

  4. Model sınıfı açılır listesinden Ekip (ContosoTeamStats.Models) öğesini seçin.Select Team (ContosoTeamStats.Models) from the Model class drop-down list. Veri bağlamı açılır listesinden TeamContext (ContosoTeamStats.Models) öğesini seçin.Select TeamContext (ContosoTeamStats.Models) from the Data context class drop-down list. Denetleyici adı metin kutusuna TeamsController yazın (otomatik olarak doldurulmamışsa).Type TeamsController in the Controller name textbox (if it is not automatically populated). Denetleyici sınıfını oluşturmak ve varsayılan görünümleri eklemek için Ekle ’ye tıklayın.Click Add to create the controller class and add the default views.

    Denetleyici yapılandırma

  5. Çözüm Gezgini ’nde, Global.asax öğesini genişletin ve Global.asax.cs ’yi açmak için çift tıklayın.In Solution Explorer , expand Global.asax and double-click Global.asax.cs to open it.

    Global.asax.cs

  6. Aşağıdaki iki using deyimini dosyanın üst tarafındaki diğer using deyimlerinin altına ekleyin: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. Application_Start yönteminin sonuna aşağıdaki kod satırını ekleyin:Add the following line of code at the end of the Application_Start method:

    Database.SetInitializer<TeamContext>(new TeamInitializer());
    
  8. Çözüm Gezgini ’nde, App_Start öğesini genişletin ve RouteConfig.cs öğesine çift tıklayın.In Solution Explorer , expand App_Start and double-click RouteConfig.cs.

    RouteConfig.cs

  9. RegisterRoutes yönteminde, Default rotasındaki controller = "Home" öğesini, aşağıdaki örnekte gösterildiği gibi controller = "Teams" ile değiştirin: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 }
    );
    

Düzen görünümünü yapılandırmaConfigure the Layout view

  1. Çözüm Gezgini ’nde, Görünümler klasörünü ve ardından Paylaşılan klasörünü genişletin ve _Layout.cshtml öğesine çift tıklayın.In Solution Explorer , expand the Views folder and then the Shared folder, and double-click _Layout.cshtml .

    _Layout.cshtml

  2. title öğesinin içeriğini değiştirin ve aşağıdaki örnekte gösterildiği gibi My ASP.NET Application öğesini Contoso Team Stats ile değiştirin: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. bodyBölümünde, Html.ActionLink Redsıs testi için Azure Cache bağlantısının hemen altındaki contoso Team stats için aşağıdaki yeni ifadeyi ekleyin.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" })`
    

    Kod değişiklikleri

  4. Uygulamayı derleyip çalıştırmak için Ctrl+F5 'e basın.Press Ctrl+F5 to build and run the application. Uygulamasının bu sürümü, sonuçları doğrudan veritabanından okur.This version of the application reads the results directly from the database. Yeni Oluştur , Düzenle , Ayrıntılar ve Sil eylemlerinin Görünümlere sahip MVC 5 Denetleyici, Entity Framework kullanarak iskelesi tarafından otomatik olarak uygulamaya eklendiğini unutmayın.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. Öğreticinin sonraki bölümünde, veri erişimini iyileştirmek ve uygulamaya ek özellikler sağlamak için Redsıs için Azure önbelleği ekleyeceksiniz.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.

    Başlangıç uygulaması

Redsıs için uygulamayı Azure önbelleği için yapılandırmaConfigure the app for Azure Cache for Redis

Öğreticinin bu bölümünde, StackExchange. redsıs Önbellek istemcisini kullanarak bir redin örneği Için Azure önbelleğinden contoso ekip istatistiklerini depolamak ve almak üzere örnek uygulamayı yapılandırırsınız.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.

Teams Controller’a önbellek bağlantısı eklemeAdd a cache connection to the Teams Controller

Hızlı başlangıçta StackExchange.Redis istemci kitaplığı paketini zaten yüklediniz.You already installed the StackExchange.Redis client library package in the quickstart. Ayrıca yayımlanan App Service ile ve yerel olarak kullanılmak üzere CacheConnection uygulama ayarını da yapılandırdınız.You also have already configured the CacheConnection app setting to be used locally, and with the published App Service. TeamsController ’da bu aynı istemci kitaplığını ve CacheConnection bilgilerini kullanın.Use this same client library and CacheConnection information in the TeamsController .

  1. Çözüm Gezgini ’nde, Denetleyiciler klasörünü genişletin ve TeamsController.cs öğesini açmak için çift tıklayın.In Solution Explorer , expand the Controllers folder and double-click TeamsController.cs to open it.

    Ekip denetleyicisi

  2. Aşağıdaki iki using deyimi TeamsController.cs öğesine ekleyin:Add the following two using statements to TeamsController.cs :

    using System.Configuration;
    using StackExchange.Redis;
    
  3. Aşağıdaki iki özelliği TeamsController sınıfına ekleyin: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;
        }
    }
    

Önbellekten veya veritabanından okumak için TeamsController’ı güncelleştirmeUpdate the TeamsController to read from the cache or the database

Bu örnekte, ekip istatistikleri veritabanı veya önbellekten alınabilir.In this sample, team statistics can be retrieved from the database or from the cache. Ekip istatistikleri seri hale getirilmiş bir List<Team> ve ayrıca, Redis veri türleri kullanılarak sıralanmış bir küme olarak veritabanında depolanır.Team statistics are stored in the cache as a serialized List<Team>, and also as a sorted set using Redis data types. Bir sıralanmış kümeden öğeleri alırken, belirli öğeler için bazı, tümü veya sorgu alabilirsiniz.When retrieving items from a sorted set, you can retrieve some, all, or query for certain items. Bu örnekte, galibiyet sayısına göre sıralanan en iyi 5 takım için sıralanmış kümeyi sorgulayacaksınız.In this sample, you'll query the sorted set for the top 5 teams ranked by number of wins.

Redsıs için Azure önbelleğini kullanmak amacıyla, takım istatistiklerini önbellekte birden çok biçimde depolamak gerekli değildir.It is not required to store the team statistics in multiple formats in the cache in order to use Azure Cache for Redis. Bu öğretici, verileri önbelleğe almak için kullanabileceğiniz farklı yol ve farklı veri türlerinin bazılarını göstermek için birden çok biçim kullanır.This tutorial uses multiple formats to demonstrate some of the different ways and different data types you can use to cache data.

  1. Aşağıdaki using deyimlerini TeamsController.cs dosyasının üst tarafındaki diğer using deyimleri ile değiştirin: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. Geçerli public ActionResult Index() yöntemi uygulamasını aşağıdaki uygulama ile değiştirin: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. Önceki kod parçacığında eklenen switch deyiminden playGames, clearCache ve rebuildDB eylem türlerini uygulamak için aşağıdaki üç yöntemi TeamsController sınıfına ekleyin.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.

    PlayGames yöntemi, oyun sezonunu taklit ederek ekip istatistiklerini güncelleştirir, sonuçları veritabanına kaydeder ve artık güncel olmayan verileri veritabanından temizler.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();
    }
    

    RebuildDB yöntemi, varsayılan ekip kümesine sahip veritabanını yeniden başlatır, bunlar için istatistikler oluşturur ve artık güncel olmayan verileri veritabanından temizler.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();
    }
    

    ClearCachedTeams yöntemi önbelleğe alınan tüm ekip istatistiklerini önbellekten kaldırır.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. Önbellek ve veritabanından ekip istatistiklerini almanın çeşitli yollarını uygulamak için aşağıdaki dört yöntemi TeamsController sınıfına ekleyin.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. Bu yöntemlerin her biri, daha sonra görünüm tarafından görüntülenen bir List<Team> döndürür.Each of these methods returns a List<Team>, which is then displayed by the view.

    GetFromDB yöntemi veritabanından ekip istatistiklerini okur.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>();
    }
    

    GetFromList yöntemi önbellekteki ekip istatistiklerini seri hale getirilmiş bir List<Team> olarak okur.The GetFromList method reads the team statistics from cache as a serialized List<Team>. Önbellekte istatistikler mevcut değilse, bir önbellek isabetsizliği oluşur.If the statistics are not present in the cache, a cache miss occurs. Önbellek isabetsizliği için, veritabanından takım istatistikleri okunur ve sonraki istek için önbellekte depolanır.For a cache miss, the team statistics are read from the database and then stored in the cache for the next request. Bu örnekte, önbelleğe veya önbellekten .NET nesnelerini seri hale getirmek için JSON.NET seri hale getirme kullanılmaktadır.In this sample, JSON.NET serialization is used to serialize the .NET objects to and from the cache. Daha fazla bilgi için bkz. redsıs Için Azure önbelleğinde .NET nesneleriyle çalışma.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;
    }
    

    GetFromSortedSet yöntemi önbelleğe alınan bir sıralanmış kümeden ekip istatistiklerini okur.The GetFromSortedSet method reads the team statistics from a cached sorted set. Önbellek isabetsizliği varsa, ekip istatistikleri veritabanından okunur ve ardından bir sıralanmış küme olarak önbellekte depolanır.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;
    }
    

    GetFromSortedSetTop5 yöntemi, önbelleğe alınan sıralanmış kümeden en iyi 5 takımı okur.The GetFromSortedSetTop5 method reads the top five teams from the cached sorted set. Bu, teamsSortedSet anahtarının varlığı için önbelleği denetleyerek başlar.It starts by checking the cache for the existence of the teamsSortedSet key. Bu anahtar yoksa, ekip istatistikleri okumak ve bunları önbellekte depolamak için GetFromSortedSet yöntemi çağrılır.If this key is not present, the GetFromSortedSet method is called to read the team statistics and store them in the cache. Daha sonra önbelleğe alınan sıralanmış küme, döndürülen en iyi beş takım için sorgulanır.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;
    }
    

Önbellek ile çalışacak şekilde Oluştur, Düzenle ve Sil yöntemlerini güncelleştirmeUpdate the Create, Edit, and Delete methods to work with the cache

Bu örneğin bir parçası olarak oluşturulan iskele kurma kodu ekip ekleme, düzenleme ve silme yöntemlerini içerir.The scaffolding code that was generated as part of this sample includes methods to add, edit, and delete teams. Bir ekip her eklendiğinde, düzenlendiğinde veya kaldırıldığında önbellekteki veriler güncel olmayan hale gelir.Anytime a team is added, edited, or removed, the data in the cache becomes outdated. Bu bölümde, önbelleğin yenilenmesi için önbelleğe alınan takımları temizlemek üzere bu üç yöntemi değiştireceksiniz.In this section, you'll modify these three methods to clear the cached teams so that the cache will be refreshed.

  1. TeamsController sınıfındaki Create(Team team) yöntemine göz atın.Browse to the Create(Team team) method in the TeamsController class. Aşağıdaki örnekte gösterildiği gibi ClearCachedTeams yöntemine bir çağrı ekleyin: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. TeamsController sınıfındaki Edit(Team team) yöntemine göz atın.Browse to the Edit(Team team) method in the TeamsController class. Aşağıdaki örnekte gösterildiği gibi ClearCachedTeams yöntemine bir çağrı ekleyin: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. TeamsController sınıfındaki DeleteConfirmed(int id) yöntemine göz atın.Browse to the DeleteConfirmed(int id) method in the TeamsController class. Aşağıdaki örnekte gösterildiği gibi ClearCachedTeams yöntemine bir çağrı ekleyin: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");
    }
    

Takımlar Dizini görünümüne önbelleğe alma yöntemleri eklemeAdd caching methods to the Teams Index view

  1. Çözüm Gezgini ’nde, Görünümler klasörünü ve ardından Ekipler klasörünü genişletin ve Index.cshtml öğesine çift tıklayın.In Solution Explorer , expand the Views folder, then the Teams folder, and double-click Index.cshtml .

    Index.cshtml

  2. Dosyanın en üstüne yakın bir yerde, aşağıdaki paragraf öğesini arayın:Near the top of the file, look for the following paragraph element:

    Eylem tablosu

    Bu bağlantı yeni bir takım oluşturur.This link creates a new team. Paragraf öğesini aşağıdaki tablo ile değiştirin.Replace the paragraph element with the following table. Bu tabloda yeni bir ekip oluşturmak, yeni bir oyun sezonu oynama, önbelleği temizleme, önbellekten ekipleri çeşitli biçimlerde alma, veritabanından ekipleri alma ve yeni örnek veriler ile veritabanını yeniden oluşturma eylemlerinin bağlantılarını içermektedir.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. Index.cshtml dosyasının aşağısına kaydırın ve dosyada bulunan son tablodaki son satır olması için aşağıdaki tr öğesini ekleyin: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>
    

    Bu satırda, geçerli işlem hakkında durum raporu içeren ViewBag.Msg değerini gösterir.This row displays the value of ViewBag.Msg which contains a status report about the current operation. Önceki adımdan herhangi bir eylem bağlantısına tıkladığınızda ViewBag.Msg değeri ayarlanır.The ViewBag.Msg is set when you click any of the action links from the previous step.

    Durum iletisi

  4. Projeyi derlemek için F6 ’ya basın.Press F6 to build the project.

Uygulamayı yerel olarak çalıştırmaRun the app locally

Takımları desteklemek için eklenmiş olan işlevselliği doğrulamak üzere makinenizde yerel olarak uygulamayı çalıştırın.Run the application locally on your machine to verify the functionality that has been added to support the teams.

Bu testte uygulama ve veritabanının her ikisi de yerel olarak çalışmaktadır.In this test, the application and database, are both running locally. Ancak, redde Azure önbelleği Azure 'da uzaktan barındırılır.However, the Azure Cache for Redis is hosted remotely in Azure. Bu nedenle önbellek büyük olasılıkla veritabanı performansının biraz gerisinde kalır.Therefore, the cache will likely under-perform the database slightly. En iyi performansı elde etmek için, istemci uygulaması ve Redsıs örneği için Azure önbelleği aynı konumda olmalıdır.For best performance, the client application and Azure Cache for Redis instance should be in the same location. Sonraki bölümde, önbellek kullanımından elde edilen yüksek performansı görmek için tüm kaynakları Azure’a dağıtacaksınız.In the next section, you will deploy all resources to Azure to see the improved performance from using a cache.

Uygulamayı yerel olarak çalıştırmak için:To run the app locally:

  1. Uygulamayı çalıştırmak için CTRL + F5 tuşlarına basın.Press Ctrl+F5 to run the application.

    Yerel olarak çalıştırılan uygulama

  2. Görünüme eklenen yeni yöntemlerin her birini test edin.Test each of the new methods that were added to the view. Bu testlerde önbellek uzak olduğundan veritabanı, önbellek performansının üzerine çıkmalıdır.Since the cache is remote in these tests, the database should slightly outperform the cache.

Azure’da yayımlama ve çalıştırmaPublish and run in Azure

Uygulama için bir veritabanı sağlamaProvision a database for the app

Bu bölümde, Azure 'da barındırılırken uygulamanın kullanması için SQL veritabanı 'nda yeni bir veritabanı sağlayacaksınız.In this section, you will provision a new database in SQL Database for the app to use while hosted in Azure.

  1. Azure portalında, Azure portalının sol üst köşesindeki Kaynak oluştur ’a tıklayın.In the Azure portal, Click Create a resource in the upper left-hand corner of the Azure portal.

  2. Yeni sayfasında Veritabanları > SQL Veritabanı seçeneklerine tıklayın.On the New page, click Databases > SQL Database .

  3. Yeni SQL Veritabanı için aşağıdaki ayarları kullanın:Use the following settings for the new SQL Database:

    AyarSetting       Önerilen değerSuggested value AçıklamaDescription
    Veritabanı adıDatabase name ContosoTeamsDatabaseContosoTeamsDatabase Geçerli veritabanı adları için bkz. Veritabanı Tanımlayıcıları.For valid database names, see Database Identifiers.
    AbonelikSubscription AboneliğinizYour subscription Önbelleği oluşturmak ve App Service’i barındırmak için kullandığınız aynı aboneliği seçin.Select the same subscription you used to create the cache and host the App Service.
    Kaynak grubuResource group TestResourceGroupTestResourceGroup Var olanı kullan ’a tıklayın ve önbelleğinizi ve App Service’i yerleştirdiğiniz aynı kaynak grubunu kullanın.Click Use existing and use the same resource group where you placed your cache and App Service.
    Kaynak seçmeSelect source Boş veritabanıBlank database Boş bir veritabanıyla başlayın.Start with a blank database.
  4. Sunucu bölümünde, Gerekli ayarları yapılandır > Yeni sunucu oluştur seçeneklerine tıklayın ve aşağıdaki bilgileri girip Seç düğmesine tıklayın:Under Server , click Configure required settings > Create a new server and provide the following information and then click the Select button:

    AyarSetting       Önerilen değerSuggested value AçıklamaDescription
    Sunucu adıServer name Genel olarak benzersiz bir adAny globally unique name Geçerli sunucu adları için bkz. Adlandırma kuralları ve kısıtlamalar.For valid server names, see Naming rules and restrictions.
    Sunucu yöneticisi oturum açma bilgileriServer admin login Geçerli bir adAny valid name Geçerli oturum açma adları için bkz. Veritabanı Tanımlayıcıları.For valid login names, see Database Identifiers.
    ParolaPassword Geçerli bir parolaAny valid password Parolanızda en az 8 karakter bulunmalı ve parolanız şu üç kategoriden karakterler içermelidir: büyük harf karakterler, küçük harf karakterler, sayılar ve alfasayısal olmayan karakterler.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.
    KonumLocation Doğu ABDEast US Önbelleği ve App Service’i oluşturduğunuz aynı bölgeyi seçin.Select the same region where you created the cache and App Service.
  5. Panoya sabitle ’ye tıklayın ve sonra Oluştur ’a tıklayarak yeni veritabanını ve sunucuyu oluşturun.Click Pin to dashboard and then Create to create the new database and server.

  6. Yeni veritabanı oluşturulduktan sonra Veritabanı bağlantı dizelerini göster ’e tıklayın ve ADO.NET bağlantı dizesini kopyalayın.Once the new database is created, click Show database connection strings and copy the ADO.NET connection string.

    Bağlantı dizelerini göster

  7. Azure portalında App Service’inize gidip Uygulama Ayarları ’na tıklayın ve sonra Bağlantı dizeleri bölümünden Yeni bağlantı dizesi ekle ’ye tıklayın.In the Azure portal, navigate to your App Service and click Application Settings , then Add new connection string under the Connection strings section.

  8. Entity Framework veritabanı bağlam sınıfıyla eşleşecek şekilde TeamContext adlı yeni bir bağlantı dizesi ekleyin.Add a new connection string named TeamContext to match the Entity Framework database context class. Yeni veritabanınız için bağlantı dizesini değer olarak yapıştırın.Paste the connection string for your new database as the value. Bağlantı dizesinde aşağıdaki yer tutucuları değiştirdiğinizden emin olup Kaydet ’e tıklayın:Be sure to replace the following placeholders in the connection string and click Save :

    Yer tutucuPlaceholder Önerilen değerSuggested value
    {your_username}{your_username} Yeni oluşturduğunuz sunucu için Sunucu Yöneticisi oturum açma bilgilerini kullanın.Use the server admin login for the server you just created.
    {your_password}{your_password} Az önce oluşturduğunuz sunucu için parolayı kullanın.Use the password for the server you just created.

    Uygulama Ayarı olarak kullanıcı adını ve parolayı eklediğinizde kullanıcı adınız ve parolanız kodunuza dahil edilmez.By adding the username and password as an Application Setting, your username and password are not included in your code. Bu yaklaşım, bu kimlik bilgilerinin korunmasına yardımcı olur.This approach helps protect those credentials.

Uygulama güncelleştirmelerini Azure’da yayımlamaPublish the application updates to Azure

Öğreticinin bu adımında, uygulamayı bulutta çalıştırmak üzere uygulama güncelleştirmelerini Azure’da yayımlayacaksınız.In this step of the tutorial, you'll publish the application updates to Azure to run it in the cloud.

  1. Visual Studio’da ContosoTeamStats öğesine sağ tıklayın ve Yayımla ’yı seçin.Right-click the ContosoTeamStats project in Visual Studio and choose Publish .

    Yayımlama

  2. Yayımla ’ya tıklayarak, hızlı başlangıçta oluşturduğunuz aynı yayımlama profilini kullanın.Click Publish to use the same publishing profile you created in the quickstart.

  3. Yayımlama tamamlandıktan sonra Visual Studio, uygulamayı varsayılan web tarayıcınızda başlatır.Once publishing is complete, Visual Studio launches the app in your default web browser.

    Önbellek eklendi

    Aşağıdaki tablo örnek uygulamadaki her eylem bağlantısını açıklar:The following table describes each action link from the sample application:

    EylemAction AçıklamaDescription
    Yeni OluşturCreate New Yeni bir Ekip oluşturun.Create a new Team.
    Sezonu OynatPlay Season Oyun sezonunu oynatın, ekip istatistiklerini güncelleştirin ve veritabanından tüm güncel olmayan ekip verilerini temizleyin.Play a season of games, update the team stats, and clear any outdated team data from the cache.
    Önbelleği TemizleClear Cache Önbellekten ekip istatistiklerini temizleyin.Clear the team stats from the cache.
    Önbellekten ListeList from Cache Önbellekten ekip istatistiklerini alın.Retrieve the team stats from the cache. Önbellek isabetsizliği varsa, veritabanından istatistikleri yükleyin ve bir sonraki seferde önbelleğe kaydedin.If there is a cache miss, load the stats from the database and save to the cache for next time.
    Önbellekten Sıralanmış KümeSorted Set from Cache Bir sıralanmış küme kullanarak önbellekten en iyi istatistiklerini alın.Retrieve the team stats from the cache using a sorted set. Önbellek isabetsizliği varsa, veritabanından istatistikleri yükleyin ve bir sıralanmış küme kullanarak önbelleğe kaydedin.If there is a cache miss, load the stats from the database and save to the cache using a sorted set.
    Önbellekteki En İyi 5 EkipTop 5 Teams from Cache Bir sıralanmış küme kullanarak önbellekten en iyi 5 ekibi alın.Retrieve the top 5 teams from the cache using a sorted set. Önbellek isabetsizliği varsa, veritabanından istatistikleri yükleyin ve bir sıralanmış küme kullanarak önbelleğe kaydedin.If there is a cache miss, load the stats from the database and save to the cache using a sorted set.
    DB’den yüklemeLoad from DB Veritabanından ekip istatistiklerini alın.Retrieve the team stats from the database.
    DB Yeniden OluşturmaRebuild DB Veritabanını yeniden oluşturun ve örnek ekip verileri ile yeniden yükleyin.Rebuild the database and reload it with sample team data.
    Düzenle / Ayrıntılar / SilEdit / Details / Delete Bir ekibi düzenleyin, ekibin ayrıntılarını görüntüleyin, ekibi silin.Edit a team, view details for a team, delete a team.

Eylemlerden bazılarına tıklayın ve farklı kaynaklardan veri alma denemeleri yapın.Click some of the actions and experiment with retrieving the data from the different sources. Veritabanı ve önbellekten veri almanın çeşitli yollarını tamamlamak için gereken süre arasındaki farklılıklara dikkat edin.Note the differences in the time it takes to complete the various ways of retrieving the data from the database and the cache.

Kaynakları temizlemeClean up resources

Örnek öğretici uygulamasıyla işiniz bittiğinde, maliyet ve kaynakları korumak için kullanılan Azure kaynaklarını silebilirsiniz.When you are finished with the sample tutorial application, you can delete the Azure resources used in order to conserve cost and resources. Tüm kaynaklarınız, aynı kaynak grubunda bulunmalıdır; kaynak grubunu silerek bunları birlikte tek bir işlemde silebilirsiniz.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. Bu konudaki yönergelerde TestResources adlı bir kaynak grubu kullanılmıştır.The instructions for this topic used a resource group named TestResources .

Önemli

Bir kaynak grubunu silme işlemi geri alınamaz ve kaynak grubunun ve içindeki tüm kaynaklar kalıcı olarak silinir.Deleting a resource group is irreversible and that the resource group and all the resources in it are permanently deleted. Yanlış kaynak grubunu veya kaynakları yanlışlıkla silmediğinizden emin olun.Make sure that you do not accidentally delete the wrong resource group or resources. Bu örneği, tutmak istediğiniz kaynakları içeren mevcut bir kaynak grubunda barındırmak için kaynaklar oluşturduysanız, her kaynağı kendi ilgili dikey penceresinden tek tek silebilirsiniz.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. Azure portalında oturum açın ve Kaynak grupları ’na tıklayın.Sign in to the Azure portal and click Resource groups .

  2. Öğeleri filtrele... metin kutusuna kaynak grubunuzun adını yazın.Type the name of your resource group into the Filter items... textbox.

  3. Kaynak grubunuzun sağındaki ... öğesine tıklayın ve Kaynak grubunu sil seçeneğine tıklayın.Click ... to the right of your resource group and click Delete resource group .

    Sil

  4. Kaynak grubunun silinmesini onaylamanız istenir.You will be asked to confirm the deletion of the resource group. Onaylamak için kaynak grubunuzun adını yazın ve Sil ’e tıklayın.Type the name of your resource group to confirm, and click Delete .

    Birkaç dakika sonra kaynak grubu ve içerdiği kaynakların tümü silinir.After a few moments, the resource group and all of its contained resources are deleted.

Sonraki adımlarNext steps