问题描述
尝试编写一个函数,该函数采用 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()]);
}