2010-02-11 14 views
1

J'ai besoin d'un verrouillage dans memcache. Puisque toutes les opérations sont atomiques, cela devrait être une tâche facile. Mon idée est d'utiliser un mécanisme de spin-lock de base. Donc, chaque objet qui a besoin d'être verrouillé dans memcache reçoit un objet lock, qui sera interrogé pour l'accès.(Google AppEngine) Memcache Lock Entry

// pseudo code 
// try to get a lock 
int lock; 
do 
{ 
    lock = Memcache.increment("lock", 1); 
} 
while(lock != 1) 

// ok we got the lock 
// do something here 

// and finally unlock 
Memcache.put("lock", 0); 

Comment une telle solution fonctionne-t-elle? Avez-vous une meilleure idée de comment verrouiller un objet memcache?

Meilleures salutations,

Friedrich Schick

+0

associés à cette question http://stackoverflow.com/questions/2556644/google-app-engine-atomic-section –

Répondre

4

Soyez prudent. Vous pourriez potentiellement brûler beaucoup de your quota dans cette boucle.

2

Le verrouillage est généralement une mauvaise idée - et dans votre exemple, se traduira par une boucle d'attente occupée qui consomme d'énormes quantités de quotas.

De quoi avez-vous besoin pour le verrouillage? Peut-être pouvons-nous suggérer une meilleure alternative.

1

Si vous avez vraiment besoin d'une boucle: ne pas d'attente active, mais inclure un retard, peut-être avec le dos-off exponentielle:

int delay = 100; 
do { 
    lock = Memcache.increment("lock", 1); 
    usleep(delay); 
    delay = min(delay * 2, 100000); 
} 
while (!lock); 
0

Toutes les opérations sur memcache sont atomiques, comme vous le dites. Pour faire écho aux réponses des autres, n'utilisez pas un verrou spin naïf sur le moteur de l'application. Vous utiliserez votre quota quotidien en 20 minutes environ. Maintenant, à votre solution:

J'ai fait quelque chose comme ça. J'ai créé une file d'attente de tâches avec une taille de compartiment de 1 et un taux d'exécution de 1/10s (une tâche par 10 secondes). J'ai utilisé cette file d'attente pour "tourner", sauf qu'elle a l'avantage de ne vérifier qu'une fois toutes les 10 secondes. Je ne suis pas sûr de ce que votre cas d'utilisation est, mais même l'exécution d'une tâche une fois par seconde est bien mieux que de simplement tourner dans une boucle. Vous implémentez donc une servlet de tâche qui vérifie l'état de ce verrou et, si elle est libre, fait ce que vous voulez qu'elle fasse.