在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 异常。
using (objRedisClient.AcquireLock("listkey"))
{
objRedisClient.Lists["listkey"].Push("{}");
}
Acquirelock 方法工作正常,但在 using 语句中将新值推送到列表会引发以下异常。
WRONGTYPE Operation against a key holding the wrong kind of value, sPort: 50371, LastCommand: RPUSH 97:Q {}
它只是一个简单的控制台应用程序。 没有acquire lock方法,value被成功添加到列表中。
如何在 C# 中锁定 Redis 列表?
最佳答案
我认为你用错了,整个锁部分用于分布式锁并使用 SETNX命令背后(算法也在命令页面上解释)。此命令仅适用于普通键,不适用于其他类型(列表、哈希等)。锁用于不同进程之间的同步,因此使用普通 key 以外的东西没有意义。
如果您想确定,请打开一个 redis-cli 监视器
,看看您的客户端发送给 Redis 的命令到底是什么(它应该是一个 SETNX
)。
关于c# - 如何在 C# 中锁定服务堆栈 Redis 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762979/