Я пытаюсь использовать redis для блокировки некоторых крупных транзакций Postgresql управления, которые у меня есть в моем проекте. Я пока не добился успеха в своей среде разработки.Django, используйте redis-py для блокировки в представлении django
Простой вариант кода будет выглядеть так:
def test_view(request):
connec = redis.Redis(unix_socket_path='/tmp/vgbet_redis.sock')
if not connec.setnx('test', ''):
print 'Locked'
else:
time.sleep(5) #Slow transaction
connec.delete('test')
print 'Unlocked'
return render_to_response("test.html")
Если открыть две вкладки этой точки зрения, первая печать разблокирована после 5 секунд, а затем второй печатает разблокирована после 10 секунд. Похоже, они синхронны, что не имеет для меня никакого смысла.
Редактировать: Я попытался установить apache и gevent, и я получил точные результаты.
Так что я думаю, что с django + redis я действительно не понимаю, и мой код действительно неправильный.
Любая помощь будет отличной.
Редактировать2: Я просто попытался использовать django-redis, используя redis в качестве кеша.
CACHES = {
'default': {
'BACKEND': 'redis_cache.RedisCache',
'LOCATION': '/tmp/vgbet_redis.sock',
'OPTIONS': {
'DB': 1,
'PASSWORD': None,
'PARSER_CLASS': 'redis.connection.HiredisParser'
},
},
}
И все же у меня есть тот же результат, если я открою две вкладки в своем браузере. Второй вид заблокирован на 5 секунд, как будто все синхронно.
from django.core.cache import cache
def test_view(request):
if cache.get('test') != None:
print 'Locked'
else:
cache.set('test', '', 60)
time.sleep(5) #Slow transaction
cache.delete('test')
return render_to_response("test.html")
Если я открываю два терминала, у меня нет проблем с чтением и письмом в redis. Поэтому я действительно не понимаю, почему я не могу использовать кеш в представлениях.
Следует отметить: замки, которые у вас там, не будут атомарными. Было бы лучше использовать [setnx] (http://redis.io/commands/setnx), что помешало бы условиям гонки. –
Я обновил свой код, спасибо. – Ashe