2012-11-05 9 views
5

Zazwyczaj robię:Korzystanie memcache.add() zamiast zestawu()

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

Jednak dzisiaj widziałem memcache.add(), który pojawia się, aby dodać element tylko wtedy, gdy nie istnieje. Czy to jest odpowiednik kodu, który mam powyżej? Czy mogę po prostu zamienić powyższy kod na memcache.add()?

także, co ważniejsze, używam AppStats i pod RPC połączeń Ślady, mogę sprawdzić, czy mój wniosek wzywa memcache.set() lub get() lub datastore.put() lub get(). Gdy używasz 2 linii kodu powyżej, nie widzę niczego dla memcache.set(), co jest oczekiwane. Jednak użycie tylko memcache.add() (bez sprawdzania, czy element już istnieje) zawsze wywołuje memcache.set(), mimo że memcache.add() zwrócił wartość false (co oznacza, że ​​nowy element nie został wstawiony). Dlaczego tak jest?

+0

Powinieneś rzucić okiem na [kod źródłowy] (http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/api/memcache/__init__.py#761) :) –

+0

@PaoloMoretti dzięki za link .. co dokładnie szukam .. – Snowman

+0

To pytanie (lub jedno podobne) zostało już zadane na stackoverflow przed, chciałbym skierować też - http: // stackoverflow. com/questions/2678339/memcached-który-jest-szybciej-robi-i-sprawdzenie-wynik-lub-robi-a-get - http://serverfault.com/questions/291681/add-vs- zestaw w memcached –

Odpowiedz

3

Twój aktualny kod ma warunek wyścigowy: pomiędzy sprawdzeniem obecności wartości w memcache i wstawieniem go, inny proces mógł wstawić wartość, którą teraz zastąpisz. Korzystanie z memcache.add nie cierpi z powodu tego wyścigu.

Nie jestem pewien, co masz na myśli przez swoje drugie pytanie; wywoływanie memcache.add powinno dawać tylko wywołanie add, nigdy ustawione połączenie. Czy możesz w tym przypadku wpisać kod, który właśnie używasz?

+1

Dla jasności, jeśli po prostu zmieniłeś 'set()' na 'add()' nadal istnieje możliwość kolizji klawiszy, to po prostu z 'add()' you ' dowiesz się o tym dzięki swojej wartości zwrotnej? –

Powiązane problemy