2017-02-20 37 views
0

У меня есть система, которая отправляет одновременно get запросов к couchbase. Каждый раз, когда система получает существующий ключ, он должен обновлять (продлевать) срок его службы. Количество времени не так важно и измеряется по дням: основная идея заключается в том, что ключ должен быть удален после того, как никто не получит его в течение некоторого времени (например, 20 дней).Время обновления ключа в couchbase

Я полагаю, что необходимо использовать операцию touch, но должны ли я использовать клавиши lock, что затруднит работу? Можно ли использовать memcached-пакет (кажется, нет API lock, но, возможно, 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 param. Как

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

Это изменит Время_жизнь объекта вы получили, и вы не будете нуждаться в дополнительной touch команды!