python - 在 redis-py 中使用锁

标签 python django redis

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

r = redis.StrictRedis(host='localhost', port=6379)
data_dict = {'key': 'value'}
r.hmset('hash', data_dict)

然而,当试图使用锁来防止其他线程写入此代码时:

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)

throws:redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding a wrong kind of value

抛出:

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

最佳答案

有两个问题:

  1. 正如其他人所说,您需要为锁和哈希使用两个不同的 key 。
  2. 语法错误。

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

  1. 创建一个Lock 对象。
  2. 获取锁。
  3. 做关键的事情。
  4. 释放锁。

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

lock = r.lock('my_lock')
lock.acquire(blocking=True)
r.set('foo', 'bar')
lock.release()

使用上下文管理器,该代码被简化为:

with r.lock('my_lock'):
    r.set('foo', 'bar')

这里发生的事情如下:

  1. r.lock() 创建并返回一个 Lock 对象。
  2. Lock.__enter__() 被自动调用,后者又调用 Lock.acquire()
  3. 执行缩进代码。
  4. Lock.__exit__() 被自动调用,后者又调用 Lock.release()

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

关于python - 在 redis-py 中使用锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34171297/

相关文章:

Python 多线程 XMLRPC 服务器(?)

python - 如何使用 scrapy-redis 管道?

python - Python 2.7 中的断言对我不起作用示例 assertIn

Python 2.5 : ElementTree and UML in XML

django 模块来处理定期订阅?

python - 在 Django 管理中为每个模型添加自定义字段

redis - 写爬虫时如何保持访问过的url和维护作业队列

caching - 拆分 Redis RDB 文件

python - TypeError: errorbar() 得到关键字参数 'yerr' 的多个值

python - Djangocollectstatics仅收集管理静态文件