Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Xây dựng bộ nhớ đệm kết hợp trong .NET 9 bằng cách sử dụng Redis cho bộ nhớ đệm hợp nhất và bộ nhớ đệm phân tán

Bộ đệm kết hợp

Bộ nhớ đệm kết hợp là một thư viện hợp nhất để lưu vào bộ nhớ đệm dữ liệu trong bộ nhớ và các nguồn bên ngoài, cũng có thể được gọi là bộ nhớ đệm nhiều tầng. Nói cách khác, bộ nhớ đệm nhiều tầng này là sự thay thế cho IDistributedCache và IMemoryCache. Nó cũng nhằm mục đích đơn giản hóa việc sử dụng bộ nhớ đệm trong .NET. Cách tiếp cận cũ hơn cho Bộ nhớ đệm phân tán yêu cầu viết mã bổ sung để đảm bảo mọi thứ được lưu trữ và truy xuất đúng cách. Gói này là một bổ sung tuyệt vời để đơn giản hóa bộ nhớ đệm trong .NET nhằm tạo ra giải pháp bộ nhớ đệm mạnh mẽ. Chúng tôi sử dụng Microsoft để triển khai gói nuget cache.Extensions.Caching.Hybrid lai. Trong bài viết này, chúng tôi sẽ đề cập đến tất cả các tính năng của gói Hybrid cache.

Tính năng gói

  • Mã mở rộng: Mã được viết cho bộ nhớ đệm trong bộ nhớ có thể được sử dụng nguyên trạng mà không cần sửa đổi để tích hợp với các máy chủ bộ nhớ đệm bên ngoài như Redis, SQL Server, v.v.
  • Quản lý đồng thời: Để sử dụng bộ đệm lai, chúng ta phải sử dụng lớp bộ đệm kết hợp làm dịch vụ phụ thuộc. Lớp này đảm bảo rằng chỉ có phiên bản được sử dụng để lấy dữ liệu cho bất kỳ khóa nào và không có yêu cầu đồng thời nào được thực hiện cho cùng một mục nhập. Tất cả các yêu cầu đồng thời đều chờ yêu cầu này hoàn thành.
  • Bộ nhớ đệm đa nguồn/Bộ nhớ đệm nguồn chính-thứ cấp: Nếu ứng dụng đã định cấu hình nhiều nguồn dữ liệu để lưu vào bộ nhớ đệm thì dữ liệu sẽ được lưu trữ ở tất cả các vị trí.

Để lấy dữ liệu, trước tiên nó phải được kiểm tra trong nguồn chính. Nếu không có dữ liệu đó, yêu cầu sẽ được chuyển tiếp đến nguồn thứ cấp, như minh họa trong sơ đồ bên dưới, kịch bản 1 màu xanh lam và kịch bản 2 màu đỏ.

Thiết lập mã

Để bắt đầu, trước tiên chúng ta sẽ cài đặt gói Microsoft.Extensions.Caching.Hybrid.

Trong Program.cs, chúng tôi sẽ viết mã bên dưới để thêm bộ đệm Kết hợp.

builder.Services.AddHybridCache();

Để định cấu hình bộ đệm kết hợp, chúng tôi viết mã bên dưới bên trong AddHybridCache làm hành động thiết lập. Dưới đây là một ví dụ.

 builder.Services.AddHybridCache(options =>
 {
 options.ReportTagMetrics = true;
 options.DefaultEntryOptions = new Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryOptions
 {
 Expiration = TimeSpan.FromSeconds(30),
 LocalCacheExpiration = TimeSpan.FromSeconds(30),
 
 };
 });

Triển khai bộ đệm trong bộ nhớ

Cấu hình dịch vụ phụ thuộc ở trên là đủ để chúng tôi thực hiện bộ nhớ đệm trong bộ nhớ. Dưới đây là mã mẫu trong bộ điều khiển API để đặt và lấy khóa cũng như giá trị trong bộ nhớ ứng dụng.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;
namespace HybridCacheDemoApplication.Controllers
{
 [ApiController]
 [Route("[controller]")]
 public class CacheController : ControllerBase
 {
 private readonly HybridCache _cache;
 const string cacheKey = "ping";
 public CacheController(HybridCache cache)
 {
 _cache = cache;
 }
 [HttpGet(Name = "GetPingKey")]
 public async Task<IActionResult> Get()
 {
 var keydata = await _cache.GetOrCreateAsync<string>(
 cacheKey, // Unique key to the cache entry
 async cancel => await Task.FromResult("pong from get")
 );
 return Ok(new {message = $"{cacheKey} data: {keydata}"});
 }
 [HttpGet("set",Name = "SetPingKey")]
 public async Task<IActionResult> Set()
 {
 await _cache.SetAsync<string>(cacheKey, "ping");
 return Ok(new { message = $"{cacheKey} is set" });
 }
 }
}

Để hiểu cách hoạt động của mã này, hãy xem tuần tự bảng bên dưới.

Bảng demo thực thi bộ đệm
 

Giải thích đầu ra điểm cuối trình tự 1 http://localhost:5154/cache/
{
 "message": "ping data: pong from get"
}
Điểm cuối này đặt giá trị bộ đệm là "pong from get" khi giá trị không được đặt; do đó, nó sẽ in "pong from get" 2 http://localhost:5154/cache/set
{
 "message": "ping is set"
}
Điểm cuối này sẽ đặt giá trị trong bộ đệm. 3 http://localhost:5154/cache/
{
 "message": "ping data: ping"
}
Đây chính là điểm cuối mà chúng tôi đã gọi trong 1 bước, nhưng lần này, giá trị đã tồn tại trong bộ đệm.

Xóa khóa bộ đệm:Để xóa khóa bộ đệm, chúng tôi sử dụng cách triển khai bên dưới,

[HttpGet("del",Name="DeletePingKey")]
public async Task<IActionResult> RemoveKey()
{
 await _cache.RemoveAsync(cacheKey); //Removes data
 return Ok(new {message=$"{cacheKey} removed"});
}

Bộ nhớ đệm được phân phối bằng máy chủ Redis

Để triển khai bộ đệm ẩn phân tán, chúng tôi cần thực hiện các cấu hình dịch vụ phụ thuộc bổ sung. Trong ví dụ này, chúng tôi sẽ sử dụng bộ nhớ đệm Redis làm nguồn bộ nhớ đệm bên ngoài.

Bây giờ, chúng ta sẽ định cấu hình gói Redis bằng Microsoft.Extensions.Caching.StackExchangeRedis

Sau khi cài đặt, chúng ta cần thêm đoạn mã dưới đây để thêm Redis. Chuỗi kết nối của chúng tôi sẽ có định dạng {HOST_NAME}:{PORT_NUMBER},password={PASSWORD

 builder.Services.AddStackExchangeRedisCache(options =>
 {
 options.Configuration =
 builder.Configuration.GetConnectionString("RedisConnectionString");
 });

Bây giờ, chúng ta sẽ gọi http://localhost:5154/cache/set và dữ liệu sẽ được đặt liền mạch trong bộ đệm Redis. Dưới đây là giao diện của nó trong Redis

Xây dựng bộ nhớ đệm kết hợp trong .NET 9 bằng cách sử dụng Redis cho bộ nhớ đệm hợp nhất và bộ nhớ đệm phân tán

Hãy chú ý xem mã của chúng tôi hoạt động liền mạch như thế nào chỉ bằng cách thêm phần phụ thuộc cho máy chủ bộ nhớ đệm phân tán, tức là Redis, trong kịch bản của chúng tôi.

Tuần tự hóa

Để gửi dữ liệu đến máy chủ bộ nhớ đệm bên ngoài, gói này sử dụng byte[], chuỗi và System.Text.Json. Điều này có thể tùy chỉnh thêm bằng cách sử dụng các phương thức .AddSerializer() hoặc AddSerializerFactory() cùng với dịch vụ phụ thuộc AddHybridCache. Khi chúng tôi sử dụng trình tuần tự hóa được tối ưu hóa hơn, chúng sẽ cải thiện hiệu suất của ứng dụng.

Thêm tùy chỉnh khác

Chúng tôi có thể tùy chỉnh thêm hoạt động của dịch vụ bộ nhớ đệm bằng cách đặt cờ khi định cấu hình các phần phụ thuộc. Dưới đây là một lá cờ mẫu để tắt tính năng nén cho bộ nhớ đệm.

Lưu ý.  Đây không phải là phương pháp hay nhất nhưng có thể thay đổi tùy theo trường hợp khi không cần hoặc không sử dụng tính năng nén.

 builder.Services.AddHybridCache(options =>
 {
 options.ReportTagMetrics = true;
 options.DefaultEntryOptions = new Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryOptions
 {
 Flags = Microsoft.Extensions.Caching.Hybrid.HybridCacheEntryFlags.DisableCompression
 };
 });

Tính năng thử nghiệm:Thẻ - Làm việc với các khóa liên quan với nhau

Đôi khi, chúng ta có thể xử lý nhiều khóa có liên quan với nhau. Ví dụ: Trong một ứng dụng thương mại điện tử, chúng tôi đã lưu trữ rất nhiều trường tương ứng với một mặt hàng trong giỏ hàng cho người dùng. Để làm được điều này, chúng ta có thể tạo thẻ.

Dưới đây là mã, để làm việc với các khóa liên quan đến nhau, chúng tôi đã tạo thẻ có tên "testdata", chúng tôi có thể thêm nhiều thẻ tùy thuộc vào loại nhóm áp dụng cho các trường hợp khác nhau. Mã này có thể tự giải thích nhưng trong trường hợp có bất kỳ sự nhầm lẫn nào, hãy đề cập đến nó trong phần nhận xét.

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;
namespace HybridCacheDemoApplication.Controllers
{
 [ApiController]
 [Route("[controller]")]
 public class CacheController : ControllerBase
 {
 private readonly HybridCache _cache;
 const string cacheKey = "ping";
 public CacheController(HybridCache cache)
 {
 _cache = cache;
 }
 [HttpGet(Name = "GetPingKey")]
 public async Task<IActionResult> Get()
 {
 var keydata = await _cache.GetOrCreateAsync<string>(
 cacheKey, // Unique key to the cache entry
 async cancel => await Task.FromResult("pong from get"), 
 tags: ["testdata"]
 );
 return Ok(new {message = $"{cacheKey} data: {keydata}"});
 }
 [HttpGet("set",Name = "SetPingKey")]
 public async Task<IActionResult> Set()
 {
 await _cache.SetAsync<string>(cacheKey, 
 "ping", 
 tags: ["testdata"]
 );
 return Ok(new { message = $"{cacheKey} is set" });
 }
 [HttpGet("del",Name="DeletePingKey")]
 public async Task<IActionResult> RemoveKey()
 {
 await _cache.RemoveAsync(cacheKey);
 return Ok(new {message=$"{cacheKey} removed"});
 }
 [HttpGet("delbytag", Name = "DeleteByTestTags")]
 public async Task<IActionResult> RemoveKeyByTags()
 {
 await _cache.RemoveByTagAsync(["testdata"]);
 return Ok(new { message = $"{cacheKey} removed" });
 }
 }
}

Cảm ơn đã đọc đến cuối. Bộ nhớ đệm kết hợp này mang lại những lợi ích đáng kinh ngạc và tôi hy vọng bạn cũng sẽ thấy điều này hữu ích.