如何在不等待的情况下在后台启动Redis连接

问题描述

我想将Redis连接作为后台任务启动,以便用户无需等待Redis连接建立。如果未设置Redis连接或Redis不可用,则应从源中获取数据,而不会影响用户

该应用程序是一个AWS Lambda Web API项目。我想避免单个请求中的连接延迟,但是我也不想通过在启动时等待连接来增加冷启动时间。

我正在使用StackExchange Redis客户端库。

为此,我想在后台任务中启动Redis连接。

解决方法

不需要额外的后台任务。 StackExchange.Redis库允许与ConnectionMultiplexer.ConnectAsync进行异步连接。所需要的是一种检查连接是否完整的方法,否则请使用其他来源。

一种方法是将数据访问包装在服务中,该服务在其构造函数中异步打开连接。它的方法可以检查连接是否打开,如果没有,则使用Redis或后备源(例如数据库)。

class MyFallbackService
{
    Task<ConnectionMultiplexer> _redisTask;

    public MyFallbackService(string redisConf,string conString)
    {
        _redisTask = ConnectionMultiplexer.ConnectAsync(redisConf);
        ...
    }

    public async Task<string> GetValue(string key)
    {
        if (_redisTask.IsCompleted)
        {
            var redis=_redisTask.Result;
            var db=redis.GetDatabase(...);
            var value= await db.StringGetAsync(key);
        }
        else
        {
            //Use the fallback source
        }
    }
}

可以在Startup.ConfigureServices中创建此服务并将其注册为Singleton实例。这样,连接过程将在启动时开始,但不会阻止启动过程:

services.AddSingleton(new MyFallbackService(...));