微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何从 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()]);
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。