StackExchange.Redis pipelining on for-loop?



前言

我有一个简单的接口,该接口假定密钥之间的依赖关系。它的两个方法是:

  1. Remove(string key)-从缓存中删除一个键。
  2. RemoveDependentsOf(string baseKey)-删除baseKeybaseKey的所有依赖。

    1. baseKey的依赖者在Redis set中指定。

    2. 因此,为了删除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)

注意,这将导致从呼叫而不是实际结果返回默认结果。鉴于您无论如何您都在忽略这些结果,您应该可以!

最新更新