2017-02-20 2 views
0

Ich habe das System, das gleichzeitige sendet Anfragen an couchbase. Jedes Mal, wenn das System den Schlüssel erhält, sollte es seine Lebensdauer aktualisieren (verlängern). Die Menge an Zeit ist nicht so wichtig und misst nach Tagen: Die Hauptidee ist, dass der Schlüssel entfernt werden sollte, nachdem niemand ihn für einige Zeit bekommen hat (zum Beispiel 20 Tage).Aktualisierungszeit für Schlüssel in couchbase

Ich denke, dass touch Betrieb sollte verwendet werden, aber sollte ich lock Schlüssel, die die Dinge schwieriger machen würde? Ist es in Ordnung, memcached-Paket zu verwenden (es scheint nicht lock API zu haben, aber vielleicht gets sollte den Trick tun)?

import pylibmc 


class Cache(Singleton): 

    def init(self): 
     self.mc = pylibmc.Client(
      # connection settings here 
     ) 

    def get(self, key): 
     """get key without locking it and update lifetime""" 
     result = self.mc.get(key) 
     if result: 
      # prolongate key for another 20 days 
      self.mc.touch(key, 60*60*24*20) 

     return result 

    def get_and_lock(self, key): 
     """lock the key while getting it and update lifetime""" 
     # should use couchbase package as memcached does not have lock API 
     # or use 'gets' instead? 

Antwort

1

Ich denke, dass Sie zwei unabhängige Themen durcheinander gebracht haben.

Zuerst ist der touch Betrieb mit der neuen Lebensdauer als ein param. Dadurch wird die neue Lebensdauer für das Datenobjekt festgelegt.

Die Sperroperation hat nichts mit der Lebensdauer zu tun. Natürlich, Couchbase uses optimistic locking (unter Verwendung eines CAS-Wertes), um die Konsistenz von Updates zu gewährleisten. Dies bedeutet, dass das Datenobjekt nicht gesperrt ist, da das Sperren teuer ist und sehr oft nutzlos ist (weil in der Zwischenzeit keine andere Operation das gesperrte Objekt anfordert), aber es gibt einen CAS-Wert, der bei jeder Aktualisierung geändert wird. Wenn Sie jedoch vorher wissen, dass auf das Datenobjekt sehr oft zugegriffen wird (was bedeutet, dass es viele übereinstimmende Aktualisierungen geben wird), können Sie sich für ein pessimistisches Sperren (d. H. Die Sperroperation) entscheiden. Aber dieses Verhalten hängt nicht mit der Zeit zusammen, um überhaupt zu leben (übrigens ist es möglich, eine Zeit zu geben, um Schlösser auch zu leben).

Fazit: Ihr touch Befehl würde funktionieren. Verwenden Sie niemals pessimistisches Sperren, wenn Sie nicht wissen, dass Sie es wirklich brauchen. Optimistisches Sperren ist für die meisten Fälle perfekt (es gibt einen Grund, warum Couchbase das optimistische Sperren als Standardverhalten gewählt hat!)

Bessere Lösung für Ihre Implementierung: Laut der API können Sie die get-Operation auch einen TTL-Parameter geben. Wie

get(key, ttl=60*60*24*20) 

Dies wird die ttl des Objekts ändern Sie bekam und Sie erhalten die zusätzlichen touch Befehl nicht brauchen!

Verwandte Themen