首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有redis-py的锁

使用带有redis-py的锁
EN

Stack Overflow用户
提问于 2015-12-09 13:21:33
回答 2查看 9.6K关注 0票数 10

我试图在django项目中的redis值上创建一个锁,但遇到了麻烦。非阻塞代码工作得很好,例如:

代码语言:javascript
复制
r = redis.StrictRedis(host='localhost', port=6379)
data_dict = {'key': 'value'}
r.hmset('hash', data_dict)

但是,当尝试使用锁来防止其他线程写入此锁时,请使用代码:

代码语言:javascript
复制
r = redis.StrictRedis(host='localhost', port=6379)
data_dict = {'key': 'value'}
lock = r.lock('hash')
with lock.acquire() as l:
    r.hmset('hash', data_dict)

抛出:redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value

如果这是一个非常愚蠢的问题,我很抱歉,但我不明白我是如何得到这个错误的,设置的数据实际上是相同的

EN

回答 2

Stack Overflow用户

发布于 2019-02-21 02:50:44

有两个问题:

  1. 正如其他人所说,您需要使用两个不同的密钥来设置锁和散列。
  2. 语法错误。

为了详细说明第二点,以下是使用锁所涉及的步骤:

Create a critical stuff.

  • Release
  1. Lock .
  2. Do critical stuff.
  3. Release
    1. Lock.
    2. Do critical stuff.
    3. Release
      1. Lock.
      2. Do critical stuff.
      3. Release
        1. Lock.
        2. Do critical stuff.
        3. Release
          1. Lock.
          2. Do critical stuff.
          3. Release
          4. Lock.
          5. Do critical stuff.
          6. Release
          7. Lock.
          8. Do critical stuff.
          9. Release
          10. Lock.
          11. Do critical stuff.
          12. Release
          13. Lock

如果不使用上下文管理器( with ...语句),代码可能如下所示:

代码语言:javascript
复制
lock = r.lock('my_lock')
lock.acquire(blocking=True)
r.set('foo', 'bar')
lock.release()

使用上下文管理器,可以将代码简化为:

代码语言:javascript
复制
with r.lock('my_lock'):
    r.set('foo', 'bar')

这里发生的事情如下所示:

自动调用object.

  • Lock.__enter__()时,
  1. r.lock()会创建并返回一个Lock,而Lock.acquire()又会被调用。自动调用缩进代码executes.
  2. Lock.__exit__(),而后者又调用Lock.release().

您可以在redis-py源代码中看到这一点。

票数 8
EN

Stack Overflow用户

发布于 2017-08-17 00:04:04

您正在尝试将字典设置为与锁相同的密钥。您希望有一把钥匙用于锁,另一把钥匙用于字典。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34171297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档