2015-07-28 2 views
0

Недавно мы начали использовать couchbase. Мы используем java spring-data-couchbase с Джерси для доступа к couchbase. Получив доступ к низкоуровневому java-sdk-api, мы установили время истечения (TTL) в конкретный документ с помощью KEY (id). Он работает нормально. Код выглядит следующим образом.В Couchbase, истекший документ включен в список запросов с содержимым NULL

// define couchbaseTemplate for lower-level access to Java SDK 
@Autowired 
CouchbaseTemplate couchbaseTemplate; 


// setExpiry method update expiry given a doc ID 
@Override 
public void setExpiry(String key, int expN) throws RepositoryException { 
    couchbaseTemplate.getCouchbaseClient().touch(key, expN); 
} 

Проблема, с которой мы сталкиваемся, заключается в том, что когда мы пытаемся получить список документов с использованием запроса, список содержит истекшие документы. И когда мы пытаемся получить доступ к документам из списка, мы обнаружили, что оно равно null.

Но если мы выполним запрос через некоторое время, истекший документ больше не включается в список.

Пример: Когда ехрп = 10 секунд, и мы выполняем запрос около 10 секунд после установки TTL, просроченные документы включены Если мы не выполнить запрос около 20 секунд после установки TTL, просроченные документы больше не включены

в несвежих вариантов мы устанавливаем

Query.setStale(Stale.false) 

мы пытались манипулировать

Query.setIncludeDocs 

Но не л uck, любая помощь ....

ответ

1

Couchbase Server делает expiries лениво. Есть три способа элемент может быть окончен:

  1. Когда документ доступен (получить операции) значение истечения проверяется
  2. Когда истечение Пейджер работает
  3. Когда диск compaction process работает (только в Couchbase сервере 3 и далее)

В результате этого представления не будут обновляться до тех пор, пока не произойдет один из этих трех процессов.

Для этого варианта использования вы можете просто сделать запрос диапазона к представлению с использованием текущего времени, чтобы он возвращал только те документы, которые еще не истекли. Если предположить, что время одно и то же на кластере хорошо в качестве клиента и вида используемого это одно:

function (doc, meta) { 
    emit(meta.expiration, null); 
} 

meta.expiration это эпоха метки времени, так что следующий запрос может быть использован:

String currentEpoch = String.valueOf((System.currentTimeMillis()/1000)); 
bucket.query(ViewQuery.from("designdoc", "myview").startkey(currentEpoch)); 

Обратите внимание: это вернет все живые документы, у которых установлен срок годности.

Если вы хотите сделать что-то более интересное с форматов даты имеют вид на Дата и время отбора на полпути вниз в Просмотр и запрос примеров главы в Couchbase сервера manual.

0

Как Couchbase official documents сказал

Обнаружения истекших документов в наборах результатов: Если вы используете представления для индексации элементов из Couchbase сервера, элементы, которые еще не были удалены как часть срока процесса обслуживания пейджера будет быть частью набора результатов, возвращаемого запросом на представление. Чтобы исключить эти элементы из результирующего набора, вы должны использовать параметр query include_doc для значения true.

Для документов с истекшим сроком действия, если вы установили include_doc = true, Couchbase Server возвращает набор результатов, указывающий, что документ больше не существует. В частности, ключ, который уже истек, но еще не были удалены в процессе очистки появится в наборе результатов в виде строки, где «документ»: нулевой:

Таким образом, это как Couchbase работает с истекшим сроком документы.

Для вашего случая просто отфильтруйте элементы, где документ равен нулю, остальное будет вашим ожидаемым результатом.