2017-02-20 43 views
0

我有系統發送併發得到查詢到couchbase。每當系統獲得密鑰時,它應該更新(延長)其生命週期。時間的長短並不是那麼重要,而是按天來衡量:主要想法是在一段時間內沒有人得到鑰匙(例如20天)後鑰匙應該被移除。更新密鑰在couchbase中的時間

我想應該使用touch操作,但是我應該使用lock鍵,這會讓事情變得更加困難?是否可以使用memcached包(它似乎沒有lock API,但也許gets應該這樣做)?

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? 

回答

1

我認爲你混合了兩個獨立的主題。

首先是touch操作,將新生命期作爲參數。這將分別爲數據對象設置新的生存時間。

鎖定操作與生存時間無關。當然,Couchbase uses optimistic locking(通過利用CAS值)來保證更新的一致性。這意味着數據對象不會被鎖定,因爲鎖定非常昂貴並且通常沒有用處(因爲在此期間沒有其他操作請求鎖定的對象),但是每次更新都會更改CAS值。不過,如果您事先知道數據對象會經常被訪問(這意味着會有很多併發更新),您可以決定使用悲觀鎖定(即鎖定操作)。但是,這種行爲與生活的時間無關(順便說一下,也有可能讓時間生活在鎖上)。

結論:您的touch命令可以工作。如果你不知道你真的需要它,不要使用悲觀鎖定。樂觀鎖定對於大多數情況是完美的(Couchbase選擇樂觀鎖定作爲默認行爲是有原因的!)

爲您的實現提供更好的解決方案:根據API,您還可以爲get操作提供ttl參數。像

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

這將修改你有對象的TTL和你將不再需要額外的touch命令!