我試圖使用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: 我剛剛通過使用redis作爲緩存與django-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),它可以防止競爭條件。 – 2012-02-05 07:58:21
我更新了我的代碼,謝謝。 – Ashe 2012-02-05 09:54:17