簡體   English   中英

StackExchange.Redis在for循環中進行管道傳遞?

[英]StackExchange.Redis pipelining on for-loop?

前言

我有一個簡單的界面,假設鍵之間存在依賴關系。 它的兩種方法是:

  1. Remove(string key) -從緩存中刪除單個鍵。
  2. RemoveDependentsOf(string baseKey) -刪除baseKeybaseKey所有依賴baseKey

    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操作的結果,但KeyDelete不知道您沒有使用該結果。 因此,您沒有從庫中獲得任何流水線好處。

該文檔明確指出了使用流水線支持的兩種方法。 如果您想知道何時完成,請使用Async方法並執行Task.WhenAll ,或使用Fire和Forget 您可以通過將CommandFlags.FireAndForget傳遞給您的命令來明確告知庫您要執行此操作,例如

_redis.KeyDelete(key, CommandFlags.FireAndForget)

請注意,這將導致從調用返回默認結果,而不是實際結果。 鑒於您仍然無視這些結果,因此您應該沒問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM