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

问题描述

尝试编写一个函数,该函数采用 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;
            }
        }`

解决方法

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

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