[英]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.