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

Posted

技术标签:

【中文标题】如何从 C# StackExchange.Redis 获取多个 Redis 键的 TTL【英文标题】:How to get the TTL of multiple Redis keys from C# StackExchange.Redis 【发布时间】:2021-07-04 21:17:21 【问题描述】:

尝试编写一个函数,该函数采用 redis 键列表,并输出键的生存时间 (TTL) 的时间跨度列表。不过,我不熟悉 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 ...[array of timespans];
            
            catch (Exception e)
            
                WriteLogException(e);
                return null;
            
        `

【问题讨论】:

【参考方案1】:

这是我制定的一个粗略的解决方案。

    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()]);
    

【讨论】:

以上是关于如何从 C# StackExchange.Redis 获取多个 Redis 键的 TTL的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C# 调用组装过程并返回结果?

如何从c#发送邮件

如何从 C# 代码调用 Google 地理编码服务

如何从 C# 数组中删除重复项?

如何从一个 c# 项目与另一个 c# 项目进行通信

如何从 C# 发送 FireBase 自定义推送通知?