2012-11-05 23 views
5

Thường thì tôi làm:Sử dụng memcache.add() thay vì set()

if not memcache.get('mykey'): 
    memcache.set('mykey', item) 

Tuy nhiên, hôm nay tôi thấy memcache.add(), sẽ xuất hiện thêm một mục duy nhất nếu nó không tồn tại. Vì vậy, điều này tương đương với mã tôi có ở trên? Tôi có thể thay thế mã ở trên bằng memcache.add() không?

Ngoài ra, và quan trọng hơn, tôi đang sử dụng AppStats, và dưới RPC Dấu vết cuộc gọi, tôi có thể nhìn thấy nếu yêu cầu tôi gọi memcache.set() hoặc get() hoặc datastore.put() hoặc get(). Khi sử dụng 2 dòng mã ở trên, tôi không thấy bất kỳ điều gì cho memcache.set(), được mong đợi. Tuy nhiên, chỉ sử dụng memcache.add() (mà không kiểm tra xem mục đó đã tồn tại hay chưa) luôn gọi memcache.set(), mặc dù memcache.add() trả về false (nghĩa là một mục mới chưa được chèn). Tại sao điều này là trường hợp?

+0

Bạn nên xem [mã nguồn] (http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/memcache/__init__.py#761) :) –

+0

@PaoloMoretti cảm ơn vì liên kết .. chính xác thì tôi đang tìm kiếm gì .. – Snowman

+0

Câu hỏi này (hoặc một câu hỏi tương tự) đã được yêu cầu trên stackoverflow trước đây, tôi cũng muốn hướng dẫn bạn - http: // stackoverflow. com/questions/2678339/memcached-đó-là-nhanh-làm-một-thêm-và-kiểm tra-kết quả-hoặc-làm-a-get - http://serverfault.com/questions/291681/add-vs- thiết lập trong memcached –

Trả lời

3

Mã hiện tại của bạn có điều kiện chủng tộc: giữa việc kiểm tra sự hiện diện của giá trị trong memcache và chèn nó, một quá trình khác có thể đã chèn giá trị mà bạn sẽ ghi đè. Sử dụng memcache.add không bị điều kiện chủng tộc này.

Tôi không chắc chắn ý của bạn là gì đối với câu hỏi thứ hai của bạn; gọi số memcache.add sẽ chỉ kết quả trong cuộc gọi thêm, không bao giờ gọi được thực hiện. Bạn có thể bao gồm mã bạn đang chạy trong trường hợp đó không?

+1

Để rõ ràng, nếu bạn vừa thay đổi 'set()' thành 'add()' thì vẫn có khả năng xảy ra xung đột chính, chỉ với 'add()' you ' sẽ biết về nó thông qua giá trị trả về của nó? –

Các vấn đề liên quan