[英]StackExchange.Redis pipelining on for-loop?
我有一個簡單的界面,假設鍵之間存在依賴關系。 它的兩種方法是:
Remove(string key)
-從緩存中刪除單個鍵。 RemoveDependentsOf(string baseKey)
-刪除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
操作的結果,但KeyDelete
不知道您沒有使用該結果。 因此,您沒有從庫中獲得任何流水線好處。
該文檔明確指出了使用流水線支持的兩種方法。 如果您想知道何時完成,請使用Async方法並執行Task.WhenAll
,或使用Fire和Forget 。 您可以通過將CommandFlags.FireAndForget
傳遞給您的命令來明確告知庫您要執行此操作,例如
_redis.KeyDelete(key, CommandFlags.FireAndForget)
請注意,這將導致從調用返回默認結果,而不是實際結果。 鑒於您仍然無視這些結果,因此您應該沒問題!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.