我试图在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)抛出:redis.exceptions.ResponseError: WRONGTYPE Operation against a key holding the wrong kind of value
如果这是一个非常愚蠢的问题,我很抱歉,但我不明白我是如何得到这个错误的,设置的数据实际上是相同的
发布于 2019-02-21 02:50:44
有两个问题:
为了详细说明第二点,以下是使用锁所涉及的步骤:
Create a critical stuff.
Lock .Lock.Lock.Lock.Lock.Lock.Lock.Lock.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')这里发生的事情如下所示:
自动调用object.
Lock.__enter__()时,r.lock()会创建并返回一个Lock,而Lock.acquire()又会被调用。自动调用缩进代码executes.Lock.__exit__(),而后者又调用Lock.release().
您可以在redis-py源代码中看到这一点。
发布于 2017-08-17 00:04:04
您正在尝试将字典设置为与锁相同的密钥。您希望有一把钥匙用于锁,另一把钥匙用于字典。
https://stackoverflow.com/questions/34171297
复制相似问题