couchbase 中密钥的更新时间
Updating time for key in couchbase
我的系统可以向 couchbase 发送并发 get 查询。每次系统获得 existing 密钥时,它应该更新(延长)其生命周期。时间长短不是那么重要,以天为单位:主要思想是在一段时间(例如 20 天)没有人获得密钥后应将其删除。
我猜想应该用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?
我认为您混淆了两个独立的主题。
首先是 touch
以新生命周期为参数的操作。这分别为数据对象设置了新的生存时间。
锁操作与生存时间无关。当然,Couchbase uses optimistic locking(利用CAS值)来保证更新的一致性。这意味着数据对象没有被锁定,因为锁定是昂贵的并且通常是无用的(因为在此期间没有其他操作请求锁定的对象)但是 CAS 值在每次更新时都会改变。然而,如果您事先知道数据对象将被频繁访问(这意味着会有很多并发更新),您可以决定使用悲观锁定(即锁定操作)。但是这种行为与生存时间完全无关(顺便说一句,也可以给锁生存时间)。
结论:您的 touch
命令会起作用。如果您不知道自己确实需要悲观锁定,请不要使用它。乐观锁定在大多数情况下都是完美的(Couchbase 选择乐观锁定作为默认行为是有原因的!)
更好的实施解决方案:根据 API,您也可以为 get 操作提供一个 ttl 参数。喜欢
get(key, ttl=60*60*24*20)
这将修改您获得的对象的 ttl,您将不需要额外的 touch
命令!
我的系统可以向 couchbase 发送并发 get 查询。每次系统获得 existing 密钥时,它应该更新(延长)其生命周期。时间长短不是那么重要,以天为单位:主要思想是在一段时间(例如 20 天)没有人获得密钥后应将其删除。
我猜想应该用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?
我认为您混淆了两个独立的主题。
首先是 touch
以新生命周期为参数的操作。这分别为数据对象设置了新的生存时间。
锁操作与生存时间无关。当然,Couchbase uses optimistic locking(利用CAS值)来保证更新的一致性。这意味着数据对象没有被锁定,因为锁定是昂贵的并且通常是无用的(因为在此期间没有其他操作请求锁定的对象)但是 CAS 值在每次更新时都会改变。然而,如果您事先知道数据对象将被频繁访问(这意味着会有很多并发更新),您可以决定使用悲观锁定(即锁定操作)。但是这种行为与生存时间完全无关(顺便说一句,也可以给锁生存时间)。
结论:您的 touch
命令会起作用。如果您不知道自己确实需要悲观锁定,请不要使用它。乐观锁定在大多数情况下都是完美的(Couchbase 选择乐观锁定作为默认行为是有原因的!)
更好的实施解决方案:根据 API,您也可以为 get 操作提供一个 ttl 参数。喜欢
get(key, ttl=60*60*24*20)
这将修改您获得的对象的 ttl,您将不需要额外的 touch
命令!