【问题标题】:how to lock service stack redis list in c#如何在c#中锁定服务堆栈redis列表
【发布时间】:2015-12-22 03:40:01
【问题描述】:

在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 对持有错误值的键进行操作, 运动:50371,最后命令:RPUSH 97:Q {}

这只是一个简单的控制台应用程序。 如果没有获取锁方法,值会成功添加到列表中。

如何在c#中锁定一个redis列表?

【问题讨论】:

    标签: c# redis locking servicestack servicestack.redis


    【解决方案1】:

    我认为你用错了,整个锁部分是分布式锁,后面使用SETNX命令(算法也在命令页面上解释)。此命令仅适用于普通键,不适用于其他类型(列表、哈希等)。锁用于不同进程之间的同步,因此使用普通密钥之外的其他东西没有意义。

    如果您想确定,请打开 redis-cli monitor 并查看您的客户端发送给 Redis 的确切命令是什么(应该是 SETNX)。

    【讨论】:

      【解决方案2】:

      锁中的密钥不是您要保护的数据结构的密钥,而是任何用于识别锁的普通STRING 密钥,例如您可以使用键名作为普通 STRING 键的命名空间:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-13
        • 1970-01-01
        • 1970-01-01
        • 2021-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多