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

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ư PINGvà 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!

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *