如何从 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的主要内容,如果未能解决你的问题,请参考以下文章