簡體   English   中英

如何在C#中鎖定服務堆棧Redis列表

[英]how to lock service stack redis list in c#

在c#中,使用服務棧redis,基於以下網址,

https://github.com/ServiceStack/ServiceStack.Redis/wiki/RedisLocks

要鎖定字符串條目,請使用以下方法。

RedisClient objRedisClient = new RedisClient... // redis working fine
objRedisClient.SetEntry("stringkey", "abcd");
using (objRedisClient.AcquireLock(strRedisKey))
{
  objRedisClient.SetEntry("stringkey", "efdh");
}

上面的SetEntry代碼可用於設置字符串值。 但是,當使用相同的代碼鎖定列表時,它將引發Redis Exception。

  using (objRedisClient.AcquireLock("listkey"))
  {
      objRedisClient.Lists["listkey"].Push("{}");
  }

Acquirelock方法可以正常工作,但使用using語句將新值推入列表內部會引發以下異常。

WRONGTYPE對持有錯誤類型值的鍵進行操作,sPort:50371,LastCommand:RPUSH 97:Q {}

它只是一個簡單的控制台應用程序。 如果沒有獲取鎖定方法,則值將成功添加到列表中。

如何在C#中鎖定Redis列表?

我認為您使用的是錯誤的,整個鎖部分是分布式鎖,並在后面使用SETNX命令(該算法也在命令頁中進行了說明)。 該命令僅適用於普通鍵,不適用於其他類型(列表,哈希等)。 該鎖用於不同進程之間的同步,因此除了普通密鑰外,沒有其他必要使用其他東西。

如果要確定,請打開redis-cli monitor並確切查看客戶端要發送給Redis的命令(應該是SETNX )。

鎖中的密鑰不是您要保護的數據結構的密鑰,而是用於標識鎖的任何常規STRING密鑰,例如,您可以使用以下密鑰名作為常規STRING密鑰的名稱空間:

using (objRedisClient.AcquireLock("listkey.lock"))
{
    objRedisClient.Lists["listkey"].Push("{}");
}

暫無
暫無

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

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