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:
Masukkan nama database dan pilih Buat baru untuk membuat server baru untuk menyimpan database.
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.
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.
Setelah validasi selesai, pilih Tinjau + buat lalu Buat. Database SQL mulai disebarkan.
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) );
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. PeristiwaSET
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:
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
Buat file baru yang disebut RedisFunction.cs. Pastikan Anda telah menghapus file RedisBindings.cs dan RedisTriggers.cs .
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
Di Visual Studio Code, buka tab Jalankan dan debug dan jalankan proyek.
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
Kembali ke Visual Studio Code, pemicu sedang didaftarkan. Untuk memvalidasi bahwa pemicu berfungsi:
Buka database SQL di portal Azure.
Pada menu sumber daya, pilih Editor kueri.
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.
Menyebarkan kode ke aplikasi fungsi Anda
Tutorial ini dibangun pada tutorial sebelumnya. Untuk informasi selengkapnya, lihat Menyebarkan kode ke fungsi Azure.
Di Visual Studio Code, buka tab Azure .
Temukan langganan Anda dan perluas. Kemudian, temukan bagian Aplikasi Fungsi dan perluas.
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.
Buka aplikasi fungsi Anda di portal Azure. Pada menu sumber daya, pilih Variabel lingkungan.
Di panel Pengaturan Aplikasi, masukkan SQLConnectionString sebagai bidang baru. Untuk Nilai, masukkan string koneksi Anda.
Pilih Terapkan.
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
Masuk ke portal Azure, lalu pilih Grup sumber daya.
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.
Pilih Hapus grup sumber daya.
Di panel Hapus grup sumber daya, masukkan nama grup sumber daya Anda untuk mengonfirmasi, lalu pilih Hapus.
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.