2011-11-18 19 views
5

Tôi đang cố gắng có hoạt động tăng hoặc tạo nguyên tử trong bộ đệm Django. Tôi đang sử dụng memcache như backend. Chức năng incr_async() của khách hàng Memcache mất tham số initial_value. Ý nghĩa là:Tăng nguyên tử Django với giá trị ban đầu

Nếu khóa chưa tồn tại trong bộ nhớ cache và bạn chỉ định một initial_value , giá trị của chính sẽ được thiết lập để giá trị ban đầu này và sau đó tăng lên.

Tuy nhiên, tôi không thấy làm thế nào tôi có thể làm điều này trong Django, như cache.incr() tài liệu nói:

Một ValueError sẽ được nâng lên nếu bạn cố gắng để tăng hoặc giảm một chìa khóa bộ nhớ cache không tồn tại .

Dĩ nhiên tôi có thể làm:

cache.add(key,initial_value) 
cache.incr(key) 

Nhưng đó không phải là nguyên tử và có thể dẫn đến điều kiện chủng tộc.

Có cách nào để giữ nguyên nguyên tử của hoạt động không?

+1

Xem câu hỏi này rất giống nhau: http://stackoverflow.com/questions/7967477/django-memcache-code-review-compare-and -bộ. Một câu trả lời cho thấy rằng việc thực thi python của memcache không thực sự hỗ trợ 'incr' với dự phòng bẩm sinh. Bạn phải 'thêm' và sau đó' incr' trong hai hoạt động riêng biệt theo người dùng đó. Bạn có thể muốn kiểm tra tính hợp lệ của điều đó. –

Trả lời

2

Theo như tôi biết, bộ nhớ cache của Django không hỗ trợ điều này. Bạn sẽ phải thả xuống API memcache và làm điều này trực tiếp:

from django.core.cache import cache 

client = cache._client # <--direct reference to memcached.Client object 
+0

có cách nào dễ dàng để lấy memcache từ cá thể 'cache' của Django không? – vartec

+0

Tôi khá chắc chắn. Tôi sẽ kiểm tra làm thế nào một khi tôi nhận được để làm việc trong một giờ hoặc lâu hơn –

+0

Tôi nghĩ rằng nó chỉ là 'memcache = get_cache ('memcache')' và sau đó 'memcache._cache.whatever()' ('từ django.core.cache import get_cache') –