2011-11-01 27 views
7

Related to this question.Django Memcache Mã xét: So sánh và thiết

Tôi cố gắng để thực hiện một increment truy cập trong memcached sử dụng Memcache’s compare and set.

Ai đó có thể xem xét mã này cho sơ hở tiềm năng?

def increment(id): 
    client = get_cache('memcache') 
    i = 0 
    items = 0 
    while i <= 3: 
     counter = client._cache.gets(id) 
     if counter is not None: 
      items = client._cache.cas(id, counter+1) 
      if items: 
       break 
     else: 
      items = client._cache.add(id, 0) 
      if items: 
       break 
     i+= 1 
    return items 

Ngoài ra kể từ khi tôi đang sử dụng một API memcached nội bộ không có sẵn thông qua Django, không này nối tiền tố then chốt tôi đặt qua trong cài đặt. Nếu không làm thế nào tôi có thể nối thêm khóa cho cuộc gọi API nội bộ này?

'memcache': { 
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 
    'LOCATION': '127.0.0.1:11211', 
    'KEY_PREFIX': 'store_', 
} 

Trả lời

4

Tôi không thực sự trả lời câu hỏi của bạn trực tiếp, nhưng tôi không thể giúp đỡ hỏi tại sao bạn không chỉ sử dụng phương pháp incr() cho atomically incrementing một giá trị - đó là những gì nó cho. Có lẽ bạn vừa đăng một ví dụ, nhưng nếu có, thì đó là một câu hỏi gây hiểu lầm.

+0

Guido trả lời câu hỏi này: http://neopythonic.blogspot.com/2011/08/compare-and-set-in-memcache.html. incr không tăng khi không có giá trị nào được đặt. Bây giờ khi bạn cố gắng thiết lập một giá trị có một điều kiện chủng tộc. CAS cố gắng để giải quyết tình trạng cuộc đua đó. –

+0

giao thức nhị phân 'incr' cho phép bạn chỉ định giá trị bắt đầu. Trước đó, bạn chỉ cần làm thêm sau đó incr. – Dustin

+0

@Dustin Incr không thực hiện điều đó trong triển khai memcache python phương thức 'incr (self, key, delta = 1) của memcache.Client instance Gửi lệnh đến máy chủ để tăng giá trị nguyên tắc cho C {key} bởi C {delta} hoặc 1 nếu C {delta} không xác định. Trả về Không nếu C {key} không tồn tại trên máy chủ, nếu không thì sẽ trả về giá trị mới sau khi gia tăng. Lưu ý rằng giá trị cho C {key} phải tồn tại trong memcache, và nó phải là chuỗi đại diện của một số nguyên.' –

2

Ngoài một số nhận xét khác ở trên, tôi nhận thấy rằng theo mặc định, hỗ trợ cas bị tắt trong ứng dụng khách python-memcached. Kể từ Django không hỗ trợ một cách để thêm các thuộc tính để các nhà xây dựng, tôi đã có thêm:

client._cache.cache_cas = True

để có được cas() để thực sự sử dụng lệnh cas. Ngoài ra, vui lòng đọc về reset_cas trong nguồn: http://bazaar.launchpad.net/~python-memcached-team/python-memcached/trunk/view/head:/memcache.py