c# - 如何在 C# 中锁定服务堆栈 Redis 列表

标签 c# redis locking servicestack servicestack.redis

在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/

相关文章:

c# - 如何使用下拉列表动态排序列表框?

c# - 如何在 C# 中获取当前可执行文件的名称?

c# - 根据使用的构造函数有选择地公开方法?

c# - 防止两个线程进入具有相同值的代码块

html - 锁定文本框的宽度

c# - 从 iframe 关闭模式弹出窗口

redis - 如何知道 Redis 中的键是否过期?

linux-kernel - redis bgsave 失败,因为 fork 无法分配内存

python - 每个 Flask 请求都应该连接到 Redis 集群吗?

locking - DynamoDB 默认有锁定吗?