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 命令!