0Pricing
C# Academy · บทเรียน

การแคชออบเจ็กต์ที่ทำให้เป็นอนุกรม

จัดเก็บและเรียกคืนออบเจ็กต์ที่ซับซ้อน

การแคชออบเจ็กต์ที่ทำให้เป็นอนุกรม เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

การแคชมากกว่าสตริง

แอปจริงแคชอ็อบเจ็กต์ ไม่ได้แคชเพียงสตริงเท่านั้น เนื่องจาก IDistributedCache จัดเก็บข้อมูลเป็นไบต์ คุณจึงต้องซีเรียลไลซ์อ็อบเจ็กต์ให้อยู่ในรูปแบบไบต์หรือสตริง และดีซีเรียลไลซ์เมื่ออ่านข้อมูลกลับ โดยทั่วไปมักเลือกใช้ JSON

การซีเรียลไลซ์ด้วย System.Text.Json

ใช้ System.Text.Json เพื่อแปลงอ็อบเจ็กต์เป็นสตริง JSON แล้วจัดเก็บด้วย SetStringAsync

using System.Text.Json;

var product = new Product { Id = 1, Name = "Coffee", Price = 4.5m };
string json = JsonSerializer.Serialize(product);
await _cache.SetStringAsync("product:1", json);

การดีซีเรียลไลซ์เมื่ออ่าน

เมื่ออ่าน ให้ดึงสตริง JSON แล้วดีซีเรียลไลซ์กลับเป็นชนิดข้อมูลของคุณ โดยอย่าลืมจัดการค่า null เมื่อไม่พบข้อมูลในแคช

string json = await _cache.GetStringAsync("product:1");
if (json is null) return null;
Product product = JsonSerializer.Deserialize<Product>(json);

ตัวช่วยทั่วไปที่นำกลับมาใช้ใหม่ได้

ห่อหุ้มตรรกะการซีเรียลไลซ์และดีซีเรียลไลซ์ไว้ในเมธอดส่วนขยาย เพื่อให้ผู้เรียกสามารถแคชข้อมูลชนิดใดก็ได้อย่างเป็นระเบียบ

public static async Task SetAsync<T>(
    this IDistributedCache cache, string key, T value,
    DistributedCacheEntryOptions options)
{
    string json = JsonSerializer.Serialize(value);
    await cache.SetStringAsync(key, json, options);
}

ตัวช่วย Get ทั่วไป

ตัวอ่านที่ทำงานคู่กันจะดีซีเรียลไลซ์ข้อมูลกลับเป็น T และคืนค่า default เมื่อไม่พบข้อมูลในแคช

public static async Task<T> GetAsync<T>(
    this IDistributedCache cache, string key)
{
    string json = await cache.GetStringAsync(key);
    return json is null ? default : JsonSerializer.Deserialize<T>(json);
}

รูปแบบ GetOrCreate

รวมแคชแบบแยกส่วนเข้ากับการซีเรียลไลซ์ไว้ในตัวช่วยเดียว โดยคืนอ็อบเจ็กต์จากแคช หรือเรียกใช้ฟังก์ชันสร้าง แคชผลลัพธ์ของฟังก์ชันนั้น แล้วคืนค่า

public static async Task<T> GetOrCreateAsync<T>(
    this IDistributedCache cache, string key,
    Func<Task<T>> factory, DistributedCacheEntryOptions options)
{
    var existing = await cache.GetAsync<T>(key);
    if (existing is not null) return existing;
    var created = await factory();
    await cache.SetAsync(key, created, options);
    return created;
}

การใช้ GetOrCreate

จุดเรียกใช้จะเหลือเพียงบรรทัดเดียว โดยซ่อนกลไกการแคชทั้งหมดไว้ภายใน

var product = await _cache.GetOrCreateAsync(
    "product:1",
    () => _repository.LoadProductAsync(1),
    new DistributedCacheEntryOptions
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15)
    });

ตัวเลือกของตัวซีเรียลไลซ์

ใช้ JsonSerializerOptions อินสแตนซ์เดียวร่วมกัน เช่น camelCase และการละเว้นค่าที่ไม่มีข้อมูล เพื่อให้ข้อมูลที่จัดเก็บในแคชมีรูปแบบสอดคล้องกันและมีขนาดเล็ก และเพื่อหลีกเลี่ยงการจัดสรรตัวเลือกซ้ำ ๆ

private static readonly JsonSerializerOptions JsonOptions = new()
{
    PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    DefaultIgnoreCondition =
        System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull
};

การกำหนดรุ่นของโครงสร้างข้อมูลในแคช

หากโครงสร้างของชนิดข้อมูลที่แคชไว้เปลี่ยนแปลง JSON เก่าอาจดีซีเรียลไลซ์ไม่สำเร็จ ให้ใส่ส่วนหมายเลขรุ่นไว้ในคีย์ เช่น product:v2:1 เพื่อให้การนำรุ่นใหม่ขึ้นใช้งานข้ามรายการที่เข้ากันไม่ได้ไปโดยอัตโนมัติ

ทำให้ข้อมูลเพย์โหลดมีขนาดพอเหมาะ

แคชเฉพาะฟิลด์ที่ต้องใช้เท่านั้น เพย์โหลดที่มีขนาดเล็กลงหมายถึงการใช้เครือข่ายและหน่วยความจำใน Redis น้อยลง รวมทั้งซีเรียลไลซ์ได้เร็วขึ้นในการอ่านและเขียนทุกครั้ง

คำนึงถึงต้นทุนการซีเรียลไลซ์

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

ตรวจสอบอย่างรวดเร็ว

ทดสอบการแคชอ็อบเจ็กต์ที่ซีเรียลไลซ์แล้ว

สรุปทบทวน

หากต้องการแคชอ็อบเจ็กต์ ให้ซีเรียลไลซ์เมื่อเขียน ซึ่งโดยทั่วไปใช้ JSON ผ่าน System.Text.Json และดีซีเรียลไลซ์เมื่ออ่าน ส่วนเมธอดทั่วไป SetAsync<T>/GetAsync<T> และตัวช่วย GetOrCreateAsync จะซ่อนกลไกต่าง ๆ และใช้รูปแบบแคชแบบแยกส่วนได้อย่างเป็นระเบียบ ใช้ JsonSerializerOptions ร่วมกัน กำหนดรุ่นของคีย์แคชเมื่อโครงสร้างข้อมูลเปลี่ยนแปลง ทำให้เพย์โหลดมีขนาดพอเหมาะ และวัดต้นทุนการซีเรียลไลซ์ในเส้นทางการทำงานที่มีการใช้งานสูง

คำถามที่พบบ่อย

บทเรียน “การแคชออบเจ็กต์ที่ทำให้เป็นอนุกรม” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแคชออบเจ็กต์ที่ทำให้เป็นอนุกรม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแคชออบเจ็กต์ที่ทำให้เป็นอนุกรม”

จัดเก็บและเรียกคืนออบเจ็กต์ที่ซับซ้อน คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การแคชออบเจ็กต์ที่ทำให้เป็นอนุกรม” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ส่วน抽象ของ IDistributedCache
  2. การเชื่อมต่อ Redis
  3. รูปแบบการแคชและการหมดอายุ
  4. การแคชออบเจ็กต์ที่ทำให้เป็นอนุกรม
← กลับไปที่ C# Academy