Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

เชี่ยวชาญ Azure Redis Cache ด้วย C#: คู่มือปฏิบัติจริง

บทนำ

Azure Redis Cache สร้างบน Redis Cache แบบโอเพนซอร์ส in-memory ที่ช่วยให้เว็บแอปนำข้อมูลจากแหล่งข้อมูลแบ็กเอนด์มาเก็บในแคช และบริการเว็บเพจจากแคชเพื่อปรับปรุงประสิทธิภาพแอป ในบทช่วยสอนทีละขั้นตอนนี้ เราจะเรียนรู้วิธีใช้ Azure Redis Cache ในเว็บแอปของเรา

Azure Redis Cache คืออะไร?

แอปพลิเคชันสมัยใหม่ส่วนใหญ่ทำงานกับปริมาณข้อมูลมาก ในสถานการณ์นี้ เมื่อคุณดึงข้อมูลจากฐานข้อมูล มันมักจะค้นหาตารางและได้ผลลัพธ์ที่ส่งกลับไปยังผู้ใช้ ประสิทธิภาพในกรณีนี้จะลดลงเนื่องจากคำขอมากมาย ดังนั้น เพื่อลดจำนวนคำขอบางส่วน คุณสามารถใช้ข้อมูลแคชที่ไม่เปลี่ยนแปลงบ่อย

Redis Cache เป็นฐานข้อมูล in-memory แบบโอเพนซอร์ส ที่ใช้เพื่อปรับปรุงประสิทธิภาพของแอปพลิเคชันโดยการดึงและเก็บข้อมูลในหน่วยความจำแคชโดยใช้รูปแบบ Key-value Azure Redis Cache เป็นฟังก์ชันที่หลากหลายที่ให้คุณเข้าถึงแคชที่ปลอดภัย ความหน่วงต่ำ (low-latency) และ throughput สูง

มาเริ่มการนำ Redis Cache ไปใช้กับ C# กัน

ขั้นตอนที่ 1. ล็อกอินพอร์ทัล Azure ไปที่ Databases >> Redis Cache

ขั้นตอนที่ 2. สร้าง Redis Cache ใหม่

ขั้นตอนที่ 3. รับ Access Keys เพื่อเชื่อมต่อกับ Redis Cache ที่สร้างใหม่

เชี่ยวชาญ Azure Redis Cache ด้วย C#: คู่มือปฏิบัติจริง

ติดตั้ง StackExchange.Redis

ขั้นตอนที่ 4. ติดตั้งแพ็กเกจ NuGet StackExchange.Redis โดยใช้คำสั่งต่อไปนี้:

Install-Package StackExchange.Redis

มาเริ่มเขียนโค้ดเพื่อเก็บข้อมูลลง Redis Cache และดึงข้อมูลจาก Redis Cache เราได้เห็นโค้ด Azure Document DB CRUD operations ไปเมื่อเร็วๆ นี้ หากคุณยังไม่ได้อ่าน คลิกที่ Azure Document DB CRUD Operation และอ่าน เรามีโค้ด CRUD operations ใน Document DB ตอนนี้ เราจะนำ Redis Cache มาใช้งานที่นี่

ขั้นตอนที่ 5. คล้ายกับบทความก่อนหน้า เราต้องเพิ่ม Redis Cache connection string ลงในไฟล์ appsettings.dev.json

เชี่ยวชาญ Azure Redis Cache ด้วย C#: คู่มือปฏิบัติจริง

ขั้นตอนที่ 6. ตอนนี้ เพิ่ม property RedisCache อีกหนึ่งอันใน Config.cs ที่จะรับค่า Redis Cache connection string จาก appsettings.dev.json

public class Config {
    public DocDbConnectionString docDb { get; set; }
    public string RedisCache { get; set; }
}

public class DocDbConnectionString {
    public string EndPoint { get; set; }
    public string AuthKey { get; set; }
    public string Database { get; set; }
    public string Collection { get; set; }
}

ขั้นตอนที่ 7. มาที่ไฟล์ program.cs และเพิ่ม ConnectionMultiplexer สำหรับ Redis Cache

IDatabase cache = lazyConnection.Value.GetDatabase();
private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => {
    string cacheConnection = configs.RedisCache;
    return ConnectionMultiplexer.Connect(cacheConnection);
});

public static ConnectionMultiplexer Connection {
    get { return lazyConnection.Value; }
}

ตอนนี้ เราจะเก็บเอกสารลง Redis Cache โดยอิงจาก Key ขณะสร้างเอกสารใน Document DB และขณะอ่านเอกสารนี้ เราจะใช้ Key เพื่อตรวจสอบว่าเอกสารอยู่ใน Redis Cache หรือไม่ เราจะข้ามการอ่านเอกสารจาก Document DB ด้วยวิธีนี้ เราสามารถเพิ่มประสิทธิภาพของแอปพลิเคชันได้

var collection = UriFactory.CreateDocumentCollectionUri(configs.docDb.Database, configs.docDb.Collection);
try {
    // สร้าง JObject ที่มีรายละเอียดพนักงาน
    Console.WriteLine("\nCreating document");
    JObject emp = new JObject();
    emp.Add("id", "V003");
    emp.Add("name", "virendra");
    emp.Add("address", "Indore");
    emp.Add("Country", "India");
    
    // สร้างเอกสารใน DocumentDB
    var createResponse = await Client.CreateDocumentAsync(collection, emp);
    var createdDocument = createResponse.Resource;
    Console.WriteLine("Document with id {0} created", createdDocument.Id);
    
    // Set JObject ลง redis cache ด้วย key "redisEmp3"
    var entryInRedis = await cache.StringSetAsync("redisEmp3", emp.ToString());
    Console.WriteLine("Document with key redisEmp3 stored into redis cache");
} catch (Exception ex) {
    throw ex;
}

ขั้นตอนที่ 8. แทนที่จะอ่านจาก Document DB มาอ่านเอกสารจาก Redis Cache

// อ่านเอกสารจาก Redis Cache
var empInRedis = await cache.StringGetAsync("redisEmp3");
if (!empInRedis.IsNullOrEmpty) {
    Console.WriteLine("Read Document from RedisCache {0} : ", empInRedis);
}

// ถ้า Redis Cache ไม่มีเอกสาร ให้อ่านจาก Document DB
if (empInRedis.IsNullOrEmpty) {
    var readResponse = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(configs.docDb.Database, configs.docDb.Collection, "V001"));
    var readDocument = readResponse.Resource;
    Console.WriteLine("Read Document {0}: ", readResponse.Resource.ToString());
}

ภาพด้านล่างแสดงวิธีการอ่านเอกสารจาก Redis Cache

เชี่ยวชาญ Azure Redis Cache ด้วย C#: คู่มือปฏิบัติจริง

ขั้นตอนที่ 9. โค้ดทั้งหมดของคลาส Program.cs

using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json.Linq;
using StackExchange.Redis;
using Microsoft.Azure.Documents.Client;

public class Program {
    private static IConfiguration Configuration { get; set; }
    private static Config configs;
    private DocumentClient client;
    private IDatabase cache = lazyConnection.Value.GetDatabase();
    
    static void Main(string[] args) {
        // ตั้งค่า Configuration
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: false, reloadOnChange: true);
        Configuration = builder.Build();
        configs = new Config();
        Configuration.Bind(configs);
        Program obj = new Program();
        obj.CRUDOperation().Wait();
    }
    
    // CRUD Operation
    private async Task CRUDOperation() {
        var collection = UriFactory.CreateDocumentCollectionUri(configs.docDb.Database, configs.docDb.Collection);
        try {
            // สร้าง JObject ที่มีรายละเอียดพนักงาน
            Console.WriteLine("\nCreating document");
            JObject emp = new JObject();
            emp.Add("id", "V003");
            emp.Add("name", "virendra");
            emp.Add("address", "Indore");
            emp.Add("Country", "India");
            
            // สร้างเอกสาร
            var createResponse = await Client.CreateDocumentAsync(collection, emp);
            var createdDocument = createResponse.Resource;
            Console.WriteLine("Document with id {0} created", createdDocument.Id);
            
            // Set JObject ลง redis cache ด้วย key "redisEmp3"
            var entryInRedis = await cache.StringSetAsync("redisEmp3", emp.ToString());
            Console.WriteLine("Document with key redisEmp3 stored into redis cache");
        } catch (Exception ex) {
            throw ex;
        }
        
        // อ่านเอกสารจาก redis cache
        var empInRedis = await cache.StringGetAsync("redisEmp3");
        if (!empInRedis.IsNullOrEmpty) {
            Console.WriteLine("Read Document from RedisCache {0} : ", empInRedis);
        }
        
        if (empInRedis.IsNullOrEmpty) {
            // อ่านเอกสารจาก Document DB
            var readResponse = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(configs.docDb.Database, configs.docDb.Collection, "V001"));
            var readDocument = readResponse.Resource;
            Console.WriteLine("Read Document {0}: ", readResponse.Resource.ToString());
        }
    }
    
    // รับ instance เดียวของ Document client และนำกลับมาใช้ซ้ำ
    public DocumentClient Client {
        get {
            if (client == null) {
                Uri endpointUri = new Uri(configs.docDb.EndPoint);
                client = new DocumentClient(endpointUri, configs.docDb.AuthKey, null, ConsistencyLevel.Session);
                client.OpenAsync();
            }
            return client;
        }
    }
    
    // สร้างการเชื่อมต่อ Redis Cache
    private static Lazy<ConnectionMultiplexer> lazyConnection = new Lazy<ConnectionMultiplexer>(() => {
        string cacheConnection = configs.RedisCache;
        return ConnectionMultiplexer.Connect(cacheConnection);
    });
    
    public static ConnectionMultiplexer Connection {
        get { return lazyConnection.Value; }
    }
}

หวังว่าบทความนี้จะช่วยคุณได้ครับ