Bagikan melalui


Tutorial: Membuat cache write-behind dengan menggunakan Azure Functions dan Azure Cache for Redis

Tujuan dari tutorial ini adalah untuk menggunakan instans Azure Cache for Redis sebagai cache tulis di belakang. Pola write-behind dalam tutorial ini menunjukkan cara menulis ke pemicu cache yang sesuai menulis ke database SQL (instans layanan Azure SQL Database).

Anda menggunakan pemicu Redis untuk Azure Functions untuk menerapkan fungsionalitas ini. Dalam skenario ini, Anda akan melihat cara menggunakan Azure Cache for Redis untuk menyimpan informasi inventaris dan harga, sambil mencadangkan informasi tersebut dalam database SQL.

Setiap item baru atau harga baru yang ditulis ke cache kemudian tercermin dalam tabel SQL dalam database.

Dalam tutorial ini, Anda akan mempelajari cara:

  • Mengonfigurasi database, pemicu, dan string koneksi.
  • Validasi bahwa pemicu berfungsi.
  • Menyebarkan kode ke aplikasi fungsi.

Prasyarat

  • Langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis.
  • Penyelesaian tutorial sebelumnya, Mulai menggunakan pemicu Azure Functions di Azure Cache for Redis, dengan sumber daya ini disediakan:
    • Instans Azure Cache for Redis
    • Instans Azure Functions
    • Pengetahuan kerja tentang menggunakan Azure SQL
    • Lingkungan Visual Studio Code (VS Code) disiapkan dengan paket NuGet terinstal

Membuat dan mengonfigurasi database SQL baru

Database SQL adalah database cadangan untuk contoh ini. Anda dapat membuat database SQL melalui portal Azure atau melalui metode otomatisasi pilihan Anda.

Untuk informasi selengkapnya tentang membuat database SQL, lihat Mulai Cepat: Membuat database tunggal - Azure SQL Database.

Contoh ini menggunakan portal:

  1. Masukkan nama database dan pilih Buat baru untuk membuat server baru untuk menyimpan database.

    Cuplikan layar pembuatan sumber daya Azure SQL.

  2. Pilih Gunakan autentikasi SQL dan masukkan masuk dan kata sandi admin. Pastikan untuk mengingat kredensial ini atau menuliskannya. Saat Anda menyebarkan server dalam produksi, gunakan autentikasi Microsoft Entra sebagai gantinya.

    Cuplikan layar informasi autentikasi untuk sumber daya Azure SQL.

  3. Buka tab Jaringan dan pilih Titik akhir publik sebagai metode koneksi. Pilih Ya untuk kedua aturan firewall yang muncul. Titik akhir ini memungkinkan akses dari aplikasi fungsi Azure Anda.

    Cuplikan layar pengaturan jaringan untuk sumber daya Azure SQL.

  4. Setelah validasi selesai, pilih Tinjau + buat lalu Buat. Database SQL mulai disebarkan.

  5. Setelah penyebaran selesai, buka sumber daya di portal Azure dan pilih tab Editor kueri. Buat tabel baru yang disebut inventarisasi yang menyimpan data yang akan Anda tulis. Gunakan perintah SQL berikut untuk membuat tabel baru dengan dua bidang:

    • ItemName mencantumkan nama setiap item.
    • Price menyimpan harga item.
    CREATE TABLE inventory (
        ItemName varchar(255),
        Price decimal(18,2)
        );
    

    Cuplikan layar memperlihatkan pembuatan tabel di Editor Kueri sumber daya Azure SQL.

  6. Setelah perintah selesai berjalan, perluas folder Tabel dan verifikasi bahwa tabel baru dibuat.

Mengonfigurasi pemicu Redis

Pertama, buat salinan proyek Visual Studio Code yang sama dengan yang Anda gunakan di tutorial sebelumnya. Salin folder dari tutorial sebelumnya dengan nama baru, seperti RedisWriteBehindTrigger, dan buka di VISUAL Code.

Kedua, hapus file RedisBindings.cs dan RedisTriggers.cs .

Dalam contoh ini, Anda menggunakan pemicu pub/sub untuk memicu keyevent pemberitahuan. Tujuan contohnya adalah:

  • Pemicu setiap kali SET peristiwa terjadi. Peristiwa SET terjadi ketika kunci baru ditulis ke instans cache atau nilai kunci diubah.
  • SET Setelah peristiwa dipicu, akses instans cache untuk menemukan nilai kunci baru.
  • Tentukan apakah kunci sudah ada dalam tabel inventori di database SQL.
    • Jika demikian, perbarui nilai kunci tersebut.
    • Jika tidak, tulis baris baru dengan kunci dan nilainya.

Untuk mengonfigurasi pemicu:

  1. System.Data.SqlClient Impor paket NuGet untuk mengaktifkan komunikasi dengan database SQL. Buka terminal Visual Studio Code dan gunakan perintah berikut:

      dotnet add package System.Data.SqlClient
    
  2. Buat file baru yang disebut RedisFunction.cs. Pastikan Anda telah menghapus file RedisBindings.cs dan RedisTriggers.cs .

  3. Salin dan tempel kode berikut di RedisFunction.cs untuk mengganti kode yang ada:

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}");
    }
}

Penting

Contoh ini disederhanakan untuk tutorial. Untuk penggunaan produksi, kami sarankan Anda menggunakan kueri SQL parameter untuk mencegah serangan injeksi SQL.

Konfigurasi string koneksi

Anda perlu memperbarui file local.settings.json untuk menyertakan string koneksi untuk database SQL Anda. Tambahkan entri di bagian Values untuk SQLConnectionString. Sekarang, file akan terlihat seperti contoh ini:

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

Untuk menemukan string koneksi Redis, buka menu sumber daya di sumber daya Azure Cache for Redis. Temukan string berada di area Kunci Akses pada menu Sumber Daya.

Untuk menemukan database SQL string koneksi, buka menu sumber daya di sumber daya database SQL. Di bawah Pengaturan, pilih String koneksi, lalu pilih tab ADO.NET. String berada di area ADO.NET (autentikasi SQL).

Anda perlu memasukkan kata sandi secara manual untuk database SQL Anda string koneksi, karena kata sandi tidak ditempelkan secara otomatis.

Penting

Contoh ini disederhanakan untuk tutorial. Untuk penggunaan produksi, kami sarankan Anda menggunakan Azure Key Vault untuk menyimpan informasi string koneksi atau menggunakan Azure EntraID untuk autentikasi SQL.

Membangun dan menjalankan proyek

  1. Di Visual Studio Code, buka tab Jalankan dan debug dan jalankan proyek.

  2. Kembali ke instans Azure Cache for Redis Anda di portal Azure, dan pilih tombol Konsol untuk memasukkan konsol Redis. Coba gunakan beberapa SET perintah:

    • SET apple 5.25
    • SET bread 2.25
    • SET apple 4.50
  3. Kembali ke Visual Studio Code, pemicu sedang didaftarkan. Untuk memvalidasi bahwa pemicu berfungsi:

    1. Buka database SQL di portal Azure.

    2. Pada menu sumber daya, pilih Editor kueri.

    3. Untuk Kueri Baru, buat kueri dengan perintah SQL berikut ini untuk menampilkan 100 item teratas dalam tabel inventori:

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

      Konfirmasikan bahwa item yang ditulis ke instans Azure Cache for Redis Anda muncul di sini.

    Cuplikan layar memperlihatkan informasi telah disalin ke SQL dari instans cache.

Menyebarkan kode ke aplikasi fungsi Anda

Tutorial ini dibangun pada tutorial sebelumnya. Untuk informasi selengkapnya, lihat Menyebarkan kode ke fungsi Azure.

  1. Di Visual Studio Code, buka tab Azure .

  2. Temukan langganan Anda dan perluas. Kemudian, temukan bagian Aplikasi Fungsi dan perluas.

  3. Pilih dan tahan (atau klik kanan) aplikasi fungsi Anda, lalu pilih Sebarkan ke Aplikasi Fungsi.

Menambahkan informasi string koneksi

Tutorial ini dibangun pada tutorial sebelumnya. Untuk informasi selengkapnya tentang redisConnectionString, lihat Menambahkan informasi string koneksi.

  1. Buka aplikasi fungsi Anda di portal Azure. Pada menu sumber daya, pilih Variabel lingkungan.

  2. Di panel Pengaturan Aplikasi, masukkan SQLConnectionString sebagai bidang baru. Untuk Nilai, masukkan string koneksi Anda.

  3. Pilih Terapkan.

  4. Buka bilah Gambaran Umum dan pilih Mulai ulang untuk memulai ulang aplikasi dengan informasi string koneksi baru.

Verifikasi penyebaran

Setelah penyebaran selesai, kembali ke instans Azure Cache for Redis Anda dan gunakan SET perintah untuk menulis lebih banyak nilai. Konfirmasikan bahwa mereka juga muncul di database SQL Anda.

Jika Anda ingin mengonfirmasi bahwa aplikasi fungsi Anda berfungsi dengan baik, buka aplikasi di portal dan pilih Aliran log dari menu sumber daya. Anda akan melihat pemicu yang berjalan di sana, dan pembaruan terkait yang dibuat ke database SQL Anda.

Jika Anda ingin menghapus tabel database SQL tanpa menghapusnya, Anda bisa menggunakan kueri SQL berikut:

TRUNCATE TABLE [dbo].[inventory]

Membersihkan sumber daya

Jika Anda ingin terus menggunakan sumber daya yang Anda buat di artikel ini, simpan grup sumber daya.

Jika tidak, untuk menghindari biaya yang terkait dengan sumber daya, jika Anda selesai menggunakan sumber daya, Anda dapat menghapus grup sumber daya Azure yang Anda buat.

Peringatan

Penghapusan grup sumber daya tidak bisa dipulihkan. Saat Anda menghapus grup sumber daya, semua sumber daya dalam grup sumber daya akan dihapus secara permanen. Pastikan Anda tidak salah menghapus grup sumber daya atau sumber daya secara tidak sengaja. Jika Anda membuat sumber daya di dalam grup sumber daya yang sudah ada yang memiliki sumber daya yang ingin Anda simpan, Anda dapat menghapus setiap sumber daya satu per satu alih-alih menghapus grup sumber daya.

Menghapus grup sumber daya

  1. Masuk ke portal Azure, lalu pilih Grup sumber daya.

  2. Pilih grup sumber daya yang akan dihapus.

    Jika ada banyak grup sumber daya, di Filter untuk bidang apa pun, masukkan nama grup sumber daya yang Anda buat untuk menyelesaikan artikel ini. Dalam daftar hasil pencarian, pilih grup sumber daya.

    Cuplikan layar yang memperlihatkan daftar grup sumber daya untuk dipilih untuk dihapus.

  3. Pilih Hapus grup sumber daya.

  4. Di panel Hapus grup sumber daya, masukkan nama grup sumber daya Anda untuk mengonfirmasi, lalu pilih Hapus.

    Cuplikan layar yang memperlihatkan kotak yang mengharuskan memasukkan nama sumber daya untuk mengonfirmasi penghapusan.

Dalam beberapa saat, grup sumber daya dan semua sumber dayanya dihapus.

Ringkasan

Tutorial ini dan Mulai menggunakan pemicu Azure Functions di Azure Cache for Redis menunjukkan cara menggunakan Azure Cache for Redis untuk memicu aplikasi fungsi Azure. Mereka juga menunjukkan cara menggunakan Azure Cache for Redis sebagai cache tulis di belakang dengan Azure SQL Database. Menggunakan Azure Cache for Redis dengan Azure Functions adalah kombinasi canggih yang dapat menyelesaikan banyak masalah integrasi dan performa.