【问题标题】:how to lock access to django redis cache如何锁定对django redis缓存的访问
【发布时间】:2018-12-30 12:55:05
【问题描述】:

多个 gunicorn 客户端可以同时访问 django-redis-cache 中的一个密钥。如何锁定对密钥的访问,以便每次只有一个客户端可以访问key

【问题讨论】:

  • 简单的方法是为pop密钥发布你的解决方案,并在处理后将它放回redis,或者添加标志。
  • 两个客户端不能同时弹出密钥吗?并且都得到相同的值?
  • 有人会是第一个,并且在第二个 pop 之后密钥将不存在。
  • @BearBrown 谢谢。它奏效了。

标签: django python-3.x caching redis


【解决方案1】:

Django redis 提供了一个locking mechanism,您可以使用它而不会遇到竞争条件。我的 settings.py 文件使用与上面链接的文档中指定的相同的 CACHES 设置。

以下代码显示了控制台中的锁:

import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'filestorage.settings')
from django.core.cache import caches
caches['default']
<django_redis.cache.RedisCache object at 0x7fbc817e03c8>
caches['default'].lock('la')
<redis.lock.LuaLock object at 0x7fbc80e772e8>

锁的使用方式类似于Python's threading.Lock:

l = caches['default'].lock('la')
l
<redis.lock.LuaLock object at 0x7fbc80e77320>
l.acquire()
True
l.release()

【讨论】:

    【解决方案2】:

    正如 cmets 中提到的,简单的方法是在 redis 缓存中定义一个 key,并在访问所需的 key 之前尝试删除缓存。

    while cache.delete('tmp_key') == 0:
        continue
    # do something with your desired key
    cache.set('tmp_key', 'unlocked', timeout=None)
    

    【讨论】:

    • 这不是线程安全锁
    猜你喜欢
    • 2017-06-08
    • 1970-01-01
    • 2017-01-24
    • 2014-08-05
    • 2016-03-29
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多