我试图在 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
如果这是一个非常愚蠢的问题,我深表歉意,但我不明白我是如何得到这个错误的,所设置的数据实际上是相同的
最佳答案
有两个问题:
- 正如其他人所说,您需要为锁和哈希使用两个不同的 key 。
- 语法错误。
为了详细说明第 2 点,以下是使用锁所涉及的步骤:
- 创建一个
Lock
对象。 - 获取锁。
- 做关键的事情。
- 释放锁。
如果不使用上下文管理器(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')
这里发生的事情如下:
r.lock()
创建并返回一个Lock
对象。Lock.__enter__()
被自动调用,后者又调用Lock.acquire()
。- 执行缩进代码。
Lock.__exit__()
被自动调用,后者又调用Lock.release()
。
您可以在 redis-py 源代码中看到这一点。
关于python - 在 redis-py 中使用锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34171297/