Aracılığıyla paylaş


Öğretici: Azure İşlevleri ve Redis için Azure Cache kullanarak arka planda yazma önbelleği oluşturma

Bu öğreticinin amacı, bir Redis için Azure Cache örneğini arka planda yazma önbelleği olarak kullanmaktır. Bu öğreticideki arka planda yazma deseni, önbellek tetikleyicisine yazma işleminin sql veritabanına (Azure SQL Veritabanı hizmetinin bir örneği) karşılık gelen yazmaları gösterir.

Bu işlevi uygulamak için Azure İşlevleri için Redis tetikleyicisini kullanırsınız. Bu senaryoda, envanter ve fiyatlandırma bilgilerini depolamak için Redis için Azure Cache kullanmayı ve bu bilgileri bir SQL veritabanında yedeklemeyi görürsünüz.

Önbelleğe yazılan her yeni öğe veya yeni fiyat, veritabanındaki bir SQL tablosuna yansıtılır.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Veritabanı, tetikleyici ve bağlantı dizesi yapılandırın.
  • Tetikleyicilerin çalıştığını doğrulayın.
  • Kodu bir işlev uygulamasına dağıtma.

Önkoşullar

  • Azure aboneliği. Azure aboneliğiniz yoksa ücretsiz hesap oluşturun.
  • Önceki öğreticinin tamamlanması olan Azure İşlevleri tetikleyicilerini Redis için Azure Cache kullanmaya başlayın ve bu kaynaklar sağlandı:
    • Redis için Azure Cache örneği
    • Azure İşlevleri örneği
    • Azure SQL'i kullanma hakkında çalışan bir bilgi
    • NuGet paketleri yüklü olarak ayarlanmış Visual Studio Code (VS Code) ortamı

Yeni sql veritabanı oluşturma ve yapılandırma

SQL veritabanı, bu örneğin yedekleme veritabanıdır. Azure portalı aracılığıyla veya tercih ettiğiniz otomasyon yöntemiyle bir SQL veritabanı oluşturabilirsiniz.

SQL veritabanı oluşturma hakkında daha fazla bilgi için bkz. Hızlı Başlangıç: Tek veritabanı oluşturma - Azure SQL Veritabanı.

Bu örnekte portal kullanılır:

  1. Veritabanını tutmak üzere yeni bir sunucu oluşturmak için bir veritabanı adı girin ve Yeni oluştur'u seçin.

    Azure SQL kaynağı oluşturma işleminin ekran görüntüsü.

  2. SQL kimlik doğrulamasını kullan'ı seçin ve bir yönetici oturum açma ve parola girin. Bu kimlik bilgilerini anımsayın veya not alın. Üretim ortamında bir sunucu dağıtırken bunun yerine Microsoft Entra kimlik doğrulamasını kullanın.

    Azure SQL kaynağının kimlik doğrulama bilgilerinin ekran görüntüsü.

  3. sekmesine gidin ve bağlantı yöntemi olarak Genel uç nokta'yı seçin. Görüntülenen her iki güvenlik duvarı kuralı için Evet'i seçin. Bu uç nokta, Azure işlev uygulamanızdan erişime izin verir.

    Azure SQL kaynağının ağ ayarının ekran görüntüsü.

  4. Doğrulama tamamlandıktan sonra Gözden Geçir + oluştur'u ve ardından Oluştur'u seçin. SQL veritabanı dağıtmaya başlar.

  5. Dağıtım tamamlandıktan sonra Azure portalında kaynağa gidin ve Sorgu düzenleyicisi sekmesini seçin. Yazacağınız verileri barındıran inventory adlı yeni bir tablo oluşturun. İki alanı olan yeni bir tablo oluşturmak için aşağıdaki SQL komutunu kullanın:

    • ItemName her öğenin adını listeler.
    • Price öğenin fiyatını depolar.
    CREATE TABLE inventory (
        ItemName varchar(255),
        Price decimal(18,2)
        );
    

    Azure SQL kaynağının Sorgu Düzenleyicisi tablo oluşturmayı gösteren ekran görüntüsü.

  6. Komutun çalışması tamamlandıktan sonra Tablolar klasörünü genişletin ve yeni tablonun oluşturulduğunu doğrulayın.

Redis tetikleyicisini yapılandırma

İlk olarak, önceki öğreticide kullandığınız AYNı VS Code projesinin bir kopyasını yapın. Önceki öğreticideki klasörü RedisWriteBehindTrigger gibi yeni bir adla kopyalayın ve VS Code'da açın.

İkinci olarak, RedisBindings.cs ve RedisTriggers.cs dosyalarını silin.

Bu örnekte, bildirimlerde keyevent tetikleme yapmak için pub/sub tetikleyicisini kullanırsınız. Örneğin hedefleri şunlardır:

  • Her SET olay gerçekleştiğinde tetikleme. SET Önbellek örneğine yeni anahtarlar yazıldığında veya anahtarın değeri değiştirildiğinde bir olay gerçekleşir.
  • Bir SET olay tetiklendikten sonra yeni anahtarın değerini bulmak için önbellek örneğine erişin.
  • Anahtarın SQL veritabanındaki envanter tablosunda zaten var olup olmadığını belirleyin.
    • Öyleyse, bu anahtarın değerini güncelleştirin.
    • Aksi takdirde, anahtarı ve değerini içeren yeni bir satır yazın.

Tetikleyiciyi yapılandırmak için:

  1. System.Data.SqlClient SQL veritabanıyla iletişimi etkinleştirmek için NuGet paketini içeri aktarın. VS Code terminaline gidin ve aşağıdaki komutu kullanın:

      dotnet add package System.Data.SqlClient
    
  2. RedisFunction.cs adlı yeni bir dosya oluşturun. RedisBindings.cs ve RedisTriggers.cs dosyalarını sildiğinizden emin olun.

  3. Mevcut kodu değiştirmek için aşağıdaki kodu kopyalayıp RedisFunction.cs yapıştırın:

using Microsoft.Extensions.Logging;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Redis;
using System.Data.SqlClient;

public class WriteBehindDemo
{
    private readonly ILogger<WriteBehindDemo> logger;

    public WriteBehindDemo(ILogger<WriteBehindDemo> logger)
    {
        this.logger = logger;
    }
    
    public string SQLAddress = System.Environment.GetEnvironmentVariable("SQLConnectionString");

    //This example uses the PubSub trigger to listen to key events on the 'set' operation. A Redis Input binding is used to get the value of the key being set.
    [Function("WriteBehind")]
    public void WriteBehind(
        [RedisPubSubTrigger(Common.connectionString, "__keyevent@0__:set")] Common.ChannelMessage channelMessage,
        [RedisInput(Common.connectionString, "GET {Message}")] string setValue)
    {
        var key = channelMessage.Message; //The name of the key that was set
        var value = 0.0;

        //Check if the value is a number. If not, log an error and return.
        if (double.TryParse(setValue, out double result))
        {
            value = result; //The value that was set. (i.e. the price.)
            logger.LogInformation($"Key '{channelMessage.Message}' was set to value '{value}'");
        }
        else
        {
            logger.LogInformation($"Invalid input for key '{key}'. A number is expected.");
            return;
        }        

        // Define the name of the table you created and the column names.
        String tableName = "dbo.inventory";
        String column1Value = "ItemName";
        String column2Value = "Price";        
        
        logger.LogInformation($" '{SQLAddress}'");
        using (SqlConnection connection = new SqlConnection(SQLAddress))
            {
                connection.Open();
                using (SqlCommand command = new SqlCommand())
                {
                    command.Connection = connection;

                    //Form the SQL query to update the database. In practice, you would want to use a parameterized query to prevent SQL injection attacks.
                    //An example query would be something like "UPDATE dbo.inventory SET Price = 1.75 WHERE ItemName = 'Apple'".
                    command.CommandText = "UPDATE " + tableName + " SET " + column2Value + " = " + value + " WHERE " + column1Value + " = '" + key + "'";
                    int rowsAffected = command.ExecuteNonQuery(); //The query execution returns the number of rows affected by the query. If the key doesn't exist, it will return 0.

                    if (rowsAffected == 0) //If key doesn't exist, add it to the database
                 {
                         //Form the SQL query to update the database. In practice, you would want to use a parameterized query to prevent SQL injection attacks.
                         //An example query would be something like "INSERT INTO dbo.inventory (ItemName, Price) VALUES ('Bread', '2.55')".
                        command.CommandText = "INSERT INTO " + tableName + " (" + column1Value + ", " + column2Value + ") VALUES ('" + key + "', '" + value + "')";
                        command.ExecuteNonQuery();

                        logger.LogInformation($"Item " + key + " has been added to the database with price " + value + "");
                    }

                    else {
                        logger.LogInformation($"Item " + key + " has been updated to price " + value + "");
                    }
                }
                connection.Close();
            }

            //Log the time that the function was executed.
            logger.LogInformation($"C# Redis trigger function executed at: {DateTime.Now}");
    }
}

Önemli

Bu örnek, öğretici için basitleştirilmiştir. Üretim kullanımı için, SQL ekleme saldırılarını önlemek için parametreli SQL sorguları kullanmanızı öneririz.

Bağlantı dizelerini yapılandırma

sql veritabanınızın bağlantı dizesi dahil etmek için local.settings.json dosyasını güncelleştirmeniz gerekir. bölümüne SQLConnectionStringbir girdi Values ekleyin. Dosyanızın bu örnek gibi görünmesi gerekir:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated",
    "redisConnectionString": "<redis-connection-string>",
    "SQLConnectionString": "<sql-connection-string>"
  }
}

Redis bağlantı dizesi bulmak için Redis için Azure Cache kaynağındaki kaynak menüsüne gidin. Dizeyi bulun, Kaynak menüsündeki Erişim Anahtarları alanındadır.

SQL veritabanı bağlantı dizesi bulmak için SQL veritabanı kaynağındaki kaynak menüsüne gidin. Ayarlar altında Bağlan ion dizeleri'ni ve ardından ADO.NET sekmesini seçin. Dize ADO.NET (SQL kimlik doğrulaması) alanındadır.

Parola otomatik olarak yapıştırılamadığı için SQL veritabanı bağlantı dizesi için parolayı el ile girmeniz gerekir.

Önemli

Bu örnek, öğretici için basitleştirilmiştir. Üretim kullanımı için, bağlantı dizesi bilgileri depolamak için Azure Key Vault kullanmanızı veya SQL kimlik doğrulaması için Azure EntraID kullanmanızı öneririz.

projesini derleme ve çalıştırma

  1. VS Code'da Çalıştır ve hata ayıkla sekmesine gidin ve projeyi çalıştırın.

  2. Azure portalında Redis için Azure Cache örneğine geri dönün ve Konsol düğmesini seçerek Redis konsoluna girin. Bazı SET komutları kullanmayı deneyin:

    • SET apple 5.25
    • SET bread 2.25
    • SET apple 4.50
  3. VS Code'a döndüğünüzde tetikleyiciler kaydediliyor. Tetikleyicilerin çalıştığını doğrulamak için:

    1. Azure portalında SQL veritabanına gidin.

    2. Kaynak menüsünde Sorgu düzenleyicisi'ni seçin.

    3. Yeni Sorgu için, envanter tablosundaki ilk 100 öğeyi görüntülemek için aşağıdaki SQL komutuyla bir sorgu oluşturun:

      SELECT TOP (100) * FROM [dbo].[inventory]
      

      Redis için Azure Cache örneğine yazılan öğelerin burada göründüğünü onaylayın.

    Bilgilerin önbellek örneğinden SQL'e kopyalandığını gösteren ekran görüntüsü.

Kodu işlev uygulamanıza dağıtma

Bu öğretici, önceki öğreticiye göre derlemektedir. Daha fazla bilgi için bkz . Azure işlevine kod dağıtma.

  1. VS Code'da Azure sekmesine gidin.

  2. Aboneliğinizi bulun ve genişletin. Ardından İşlev Uygulaması bölümünü bulun ve genişletin.

  3. İşlev uygulamanızı seçip basılı tutun (veya sağ tıklayın) ve ardından İşlev Uygulamasına Dağıt'ı seçin.

bağlantı dizesi bilgileri ekleme

Bu öğretici, önceki öğreticiye göre derlemektedir. hakkında redisConnectionStringdaha fazla bilgi için bkz. bağlantı dizesi bilgileri ekleme.

  1. Azure portalında işlev uygulamanıza gidin. Kaynak menüsünde Ortam değişkenleri'ni seçin.

  2. Uygulama Ayarlar bölmesinde SQL Bağlan ionString'i yeni bir alan olarak girin. Değer alanına bağlantı dizesi girin.

  3. Uygula’yı seçin.

  4. Genel Bakış dikey penceresine gidin ve uygulamayı yeni bağlantı dizesi bilgileriyle yeniden başlatmak için Yeniden Başlat'ı seçin.

Dağıtımı doğrulama

Dağıtım tamamlandıktan sonra Redis için Azure Cache örneğine dönün ve daha fazla değer yazmak için komutları kullanınSET. Bunların SQL veritabanınızda da göründüğünü onaylayın.

İşlev uygulamanızın düzgün çalıştığını onaylamak istiyorsanız portalda uygulamaya gidin ve kaynak menüsünden Günlük akışı'nı seçin. Tetikleyicilerin orada çalıştığını ve SQL veritabanınızda ilgili güncelleştirmelerin yapıldığını görmeniz gerekir.

SQL veritabanı tablosunu silmeden temizlemek isterseniz aşağıdaki SQL sorgusunu kullanabilirsiniz:

TRUNCATE TABLE [dbo].[inventory]

Kaynakları temizleme

Bu makalede oluşturduğunuz kaynakları kullanmaya devam etmek istiyorsanız kaynak grubunu koruyun.

Aksi takdirde, kaynaklarla işiniz bittiyse ücretlerden kaçınmak için oluşturduğunuz Azure kaynak grubunu silebilirsiniz.

Önemli

Silinen kaynak grupları geri alınamaz. Kaynak grubunu sildiğinizde, içindeki tüm kaynaklar kalıcı olarak silinir. Yanlış kaynak grubunu veya kaynakları yanlışlıkla silmediğinizden emin olun. Tutmak istediğiniz kaynakları içeren mevcut bir kaynak grubunun içinde kaynakları oluşturduysanız, kaynak grubunu silmek yerine her kaynağı tek tek silebilirsiniz.

Kaynak grubunu silmek için

  1. Azure portalında oturum açın ve Kaynak grupları’nı seçin.

  2. Silmek istediğiniz kaynak grubunu seçin.

    Çok sayıda kaynak grubu varsa Herhangi bir alan için filtre uygula... kutusunu kullanın, bu makale için oluşturduğunuz kaynak grubunuzun adını yazın. Sonuçlar listesinden kaynak grubunu seçin.

    Çalışma bölmesinde silinecek kaynak gruplarının listesini gösteren ekran görüntüsü.

  3. Kaynak grubunu sil'i seçin.

  4. Kaynak grubunun silinmesini onaylamanız istenir. Onaylamak için kaynak grubunuzun adını yazın ve ardından Sil’i seçin.

    Silme işlemini onaylamak için kaynak adını gerektiren formu gösteren ekran görüntüsü.

Birkaç dakika sonra kaynak grubu ve bu gruptaki kaynakların tümü silinir.

Özet

Bu öğretici ve Redis için Azure Cache Azure İşlevleri tetikleyicilerini kullanmaya başlama bölümünde azure işlev uygulamalarını tetikleme amacıyla Redis için Azure Cache nasıl kullanılacağı gösterilmektedir. Ayrıca Redis için Azure Cache Azure SQL Veritabanı ile arka planda yazma önbelleği olarak nasıl kullanılacağını da gösterir. Azure İşlevleri ile Redis için Azure Cache kullanmak, birçok tümleştirme ve performans sorununu çözebilen güçlü bir birleşimdir.