如何从C# StackExchange.Redis获得多个Redis键的TTL

尝试制作一个函数,该函数接受Redis键列表,并输出键的生存时间(TTL)的TimeSpan列表。我不熟悉Lua脚本。我尝试按照其他在线指南进行操作,但无法使其在这种情况下正常工作。任何见解都将非常有用且可重复使用。

        public async Task<TimeSpan?[]> GetTTLManyAsync(string[] keySet)
        {
            try
            {
                var db = await this.GetDatabaseAsync();
                string script = @"...";
...
                var keysCasted = keySet.Select(k => new RedisKey(k)).ToArray();
                var result = await db.ScriptEvaluateAsync(script, keysCasted);
...
                return ...[一系列TimeSpan];
            }
            catch (Exception e)
            {
                WriteLogException(e);
                return null;
            }
        }`
点赞
用户1582837
用户1582837

以下是我设计的大概解决方案。

public async Task<List<TimeSpan?>> GetTTLManyAsync(IEnumerable<string> keys)
{
    List<string> returnList = new List<string>();

    try
    {
        var db = await this.GetDatabaseAsync();
        string script = @"local result = {}
        for i,key in ipairs(KEYS) do
            local ttl = tonumber(redis.call('ttl', key))
                result[i] = ttl
        end
        return result";

        var result = await db.ScriptEvaluateAsync(script, keys.Select(k => new RedisKey(k)).ToArray());
        var arrResult = ((double[])result).Select(ttl =>
        {
            if (ttl == -2) return default(TimeSpan?); // Key does not exist
            else if (ttl == -1) return default(TimeSpan?); // No expiration set.
            else return TimeSpan.FromSeconds(ttl);
        }).ToList();

        return arrResult;
    }
    catch (Exception e)
    {
        WriteLogException(e);
    }

    // Fill w/ empty values
    return new List<TimeSpan?>(new TimeSpan?[keys.Count()]);
}
2021-04-09 22:08:13