前言
我有一个简单的接口,该接口假定密钥之间的依赖关系。它的两个方法是:
-
Remove(string key)
-从缓存中删除一个键。 -
RemoveDependentsOf(string baseKey)
-删除baseKey
和baseKey
的所有依赖。-
baseKey
的依赖者在Redis set
中指定。 -
因此,为了删除
baseKey
的所有因素,我必须读取baseKey
的集合,然后循环它们以删除它们。
-
问题
我阅读 stackexchange.redis 文档,所以我知道他们的传奇管道供应支持,根据他们的文档,以下代码应非常有效。
但是,我似乎无法理解库管线如何 KeyDelete
命令当方法返回布尔值是否被删除,无论是否删除键。
因此,在执行第二个KeyDelete
命令之前,应该发送并收到其响应(这不是有效的)。
- 我在这里缺少什么?
- 我应该如何编写以下代码?
public void Remove(string key)
{
_redis.KeyDelete(key);
}
public void RemoveDependentsOf(string key)
{
Remove(key);
var setKey = GetDependencySetKey(key);
RedisValue[] dependents = _redis.SetMembers(setKey);
foreach (var dependentKey in dependents)
{
RemoveDependentsOf(dependentKey);
}
// This is the way to remove the whole set
_redis.KeyExpire(setKey, TimeSpan.Zero);
}
您正在使用同步方法,尽管您不明确地取决于KeyDelete
操作的结果,但是STACKEXCHANGE.REDIS不知道您不使用结果。因此,您没有获得图书馆提供的任何管道福利。
文档明确调用了您可以使用管道支持的两种方式;使用异步方法并执行Task.WhenAll
,如果您想知道何时完成或使用火和忘记。您可以通过将CommandFlags.FireAndForget
传递给您的命令,例如
_redis.KeyDelete(key, CommandFlags.FireAndForget)
注意,这将导致从呼叫而不是实际结果返回默认结果。鉴于您无论如何您都在忽略这些结果,您应该可以!