Sử dụng chuỗi kết nối Redis-CLI trong StackExchange.Redis

Redis đã và đang dần khẳng định mình là một lựa chọn tuyệt vời về cơ sở hạ tầng trong các giải pháp hiện đại. Redis là một máy chủ cấu trúc dữ liệu, cung cấp các lệnh được sử dụng để tương tác với dữ liệu có thể thay đổi.

Các nhà phát triển sử dụng Redis như một kho lưu trữ khóa/giá trị (key/value) để tra cứu nhanh các khóa đã biết, thường là trong bộ nhớ đệm. Một nhà phát triển .NET rất có thể sẽ sử dụng gói Nuget StackExchange.Redis để truy cập phiên bản Redis trên máy chủ của họ.

Mặc dù các chuỗi kết nối cho Redis có thể khác nhau, nhưng nhiều nền tảng lưu trữ trực tuyến cung cấp chuỗi kết nối redis-cli.

Bài viết này sẽ trình bày làm thế nào chúng ta có thể viết một phương thức mở rộng để phân tích một chuỗi kết nối redis-cli có thể sử dụng với  thư viện StackExchange.Redis.

Redis-CLI là gì?

redis-cli là một chương trình giao diện dòng lệnh (CLI) cho phép chúng ta gửi lệnh đến một phiên bản Redis. Chương trình có thể hoạt động ở hai chế độ: Read Eval Print Loop (REPL) và single-command.

Chế độ REPL giả định một nhà phát triển đang tích cực nhập lệnh, đọc phản hồi và lặp lại nếu cần. Các nhà phát triển có thể sử dụng phương thức single-command để đưa ra các lệnh một lần và chương trình sẽ in kết quả ra đầu ra tiêu chuẩn.

Chúng ta có thể sử dụng đối số -u khi gọi redis-cli để kết nối với máy chủ từ xa.

redis-cli -u redis://username:password@host:port

Từ CLI, chúng ta có thể đưa ra các lệnh như PING và nhận phản hồi.

redis-cli -u redis://username:password@host:port ping
PONG

Vì vậy, làm thế nào để chúng ta lấy được thông tin chuỗi kết nối của redis:// và sử dụng URI đó trong các ứng dụng .NET 5+ của chúng ta?

Phân tích cú pháp chuỗi kết nối Redis-CLI

Trước khi tiếp tục, bài viết này giả định rằng bạn đang sử dụng gói NuGet StackExchange.Redis. Để cài đặt thành phần phụ thuộc, hãy sử dụng lệnh sau trên dự án .NET của bạn.

dotnet add package StackExchange.Redis

Như chúng ta đã thấy trong phần trước, chuỗi kết nối URI của redis-cli có chung một mẫu cụ thể như sau.

redis://username:password@host:port

Hãy chuyển nó thành một mẫu Regex. Chúng ta cũng sẽ sử dụng các nhóm được đặt tên để lấy các giá trị cần thiết sau này trong bài viết.

^redis://(?<username>.+):(?<password>.+)@(?<host>.+):(?<port>\d+)$

Bây giờ, hãy xem cách chúng ta có thể cấu hình cơ sở hạ tầng Redis của mình trong ứng dụng ASP.NET Core.

Lưu ý, tôi đã cấu hình các phụ thuộc Redis trong Program.cs, nhưng mã sẽ giống hệt nhau nếu được đặt vào Startup.cs.
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using StackExchange.Redis;

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices(collection =>
            {
                collection.AddSingleton(services =>
                {
                    var config = services.GetRequiredService<IConfiguration>();
                    var connectionString = config["Redis"];
                    return ConnectionMultiplexer.Connect(
                        new ConfigurationOptions()
			    // our extension method
                            .FromCli(connectionString));
                });

                collection.AddScoped(services =>
                {
                    var connection = 
                        services.GetRequiredService<ConnectionMultiplexer>();
                    return connection.GetDatabase();
                });
            })
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Ở ví dụ trên, chúng ta có một phương thức mở rộng FromCli, dùng để phân tích cú pháp chuỗi kết nối theo định dạng được mô tả ở trên. Làm thế nào để chúng ta thực hiện cách tiếp cận này? Tất nhiên là chúng ta sẽ sử dụng biểu thức chính quy (Regular Expression - Regex)!

using System;
using System.Text.RegularExpressions;
using StackExchange.Redis;

public static class Redis
{
    private static readonly Regex CliPattern =
        new("^redis://(?<username>.+):(?<password>.+)@(?<host>.+):(?<port>\\d+)$");

    public static ConfigurationOptions FromCli(string connectionString)
    {
        var options = new ConfigurationOptions();
        FromCli(options, connectionString);
        return options;
    }

    public static ConfigurationOptions FromCli(
        this ConfigurationOptions options, 
        string connectionString
    )
    {
        var match = CliPattern.Match(connectionString);
        if (!match.Success)
        {
            throw new ArgumentException(
                "Cli connection string was not correct. " +
                $"Be sure it follows {CliPattern} pattern.",
                nameof(connectionString));
        }

        var values = match.Groups;
        options.EndPoints.Add($"{values["host"].Value}:{values["port"].Value}");
        options.Password = values["password"].Value;
        options.User = values["username"].Value;

        return options;
    }
}

Vậy là bạn đã có nó! Bây giờ bạn có thể sử dụng chuỗi kết nối URI redis-cli của mình với StackExchange.Redis. Hy vọng rằng bạn thấy phương thức mở rộng này hữu ích khi chuyển đổi giữa hai cách khác nhau để truy cập Redis.

Cảm ơn bạn đã dành thời gian đọc bài viết này!

Nếu Comdy hữu ích và giúp bạn tiết kiệm thời gian làm việc

Bạn có thể vui lòng đưa Comdy vào whitelist của trình chặn quảng cáo ❤️ để hỗ trợ chúng tôi trong việc trả tiền cho dịch vụ lưu trữ web để duy trì hoạt động của trang web.

Lập Trình C#Redis
Bài Viết Liên Quan:
Tạo tập tin Zip với .NET 5
Trung Nguyen 11/11/2021
Tạo tập tin Zip với .NET 5

Trong bài viết này, chúng ta sẽ tìm hiểu lớp tiện ích ZipFile trong C#, cách nén tập tin và thư mục, cùng với giải nén tập tin zip.

Đọc và ghi file Excel trong C#
Trung Nguyen 29/10/2021
Đọc và ghi file Excel trong C#

Bài viết này sẽ giới thiệu cách đơn giản nhất mà tôi đã tìm thấy để đọc và ghi file Excel bằng C# sử dụng ExcelMapper.

Làm việc với PriorityQueue của .NET 6
Trung Nguyen 25/10/2021
Làm việc với PriorityQueue của .NET 6

Bài viết này sẽ giúp bạn tìm hiểu PriorityQueue của .NET 6 là gì, cách chúng ta thêm các phần tử và cách chúng ta có thể xếp hàng lại cho các phần tử.

Hướng dẫn nhanh và ví dụ về pattern matching trong C#
Trung Nguyen 23/10/2021
Hướng dẫn nhanh và ví dụ về pattern matching trong C#

Bài viết này sẽ trình bày một số ví dụ về pattern matching hữu ích và bạn có thể xem xét sử dụng trong các dự án hiện tại hoặc tương lai của bạn.