2013-08-24 1 views
0

У меня есть семья Колонна в Кассандре, в котором я буду хранить что-то вроде this-Как получить данные из Кассандры каждые 15 минут, но вернуть мне только информацию, которая была изменена?

BundleName |  Version 
---------------------------- 
FrameworkBundle 1.0.0 
BundleA   1.0.0 
BundleB   1.0.0 
BundleC   1.0.0 
BundleD   1.0.0 

Я использую Astyanax клиент для извлечения данных из базы данных Cassandra. Я собираюсь иметь некоторый метод, который будет извлекать данные из Cassandra-

public Map<String, String> getFromDatabase() { 

    // 1) For the first time, return me everything in the map 
    // 2) Second time, it should return me only the the change if there is any bundle version change 

} 

Теперь этот метод должен вернуть мне все, как карту, что-то вроде this-

Key as FrameworkBundle and Value as 1.0.0 
Key as BundleA and Value as 1.0.0 
Key as BundleB and Value as 1.0.0 
.... 
And for other Bundles like above 

Теперь то, что мне нужно IS-

  1. В первый раз, когда я запускаю свое приложение, он должен вернуть мне все на карте, как указано выше.
  2. И у меня есть фоновый поток, который проверяет базу данных Cassandra каждые 15 минут, чтобы узнать, есть ли новые версии пакетов или нет. И если есть какая-либо новая версия любого пакета, просто верните мне это имя Bundle и его новую версию, и если никаких изменений в какой-либо из версий нет, то не возвращайте меня ни разу во второй раз. И этот же процесс будет происходить каждые 15 минут.

Значение только в первый раз, я хочу вернуть все в противном случае, я не хочу ничего возвращать, если в версии пакета нет изменений.

Я не уверен, может ли Cassandra напрямую предоставить информацию об этом без написания какой-либо логики для получения необходимой мне информации.

Каков наилучший и эффективный способ сделать это в Кассандре? Я не хочу извлекать все данные из базы данных Cassandra каждые 15 минут, а затем делать какую-то логику, чтобы узнать, какая версия пакета была изменена.

ответ

1

Ну, cassandra - это что-то вроде хранилища ключей/значений, поэтому в порядке Чтобы это произошло, вам нужен разумный ключ строки. Вам всегда нужен ключ строки, когда вы отправляете запрос (диапазон столбцов). Ни имя пакета, ни версия не являются очень хорошим ключом строки, поскольку вам нужно знать их заранее. У вас есть какая-то классификация приложений или другая функция, которую вы можете использовать для разделения?

Например, если вы использовали идентификатор типа приложения (коммерческий, с открытым исходным кодом, частный ...) в качестве другого поля, вы можете легко создать таблицу, в которой ваш ключ кластеризации/столбца является меткой времени. Ваш ключ строки может быть вашим идентификатором типа приложения. Всякий раз, когда есть новая версия, вставьте номер версии в приложение/timestamp. Затем выполните запрос диапазона, используя метку времени.

CREATE TABLE Bundles (
    bundle varchar, 
    type varchar, 
    ts timeuuid, 
    version varchar, 
    PRIMARY KEY (type, ts) 
    ); 

При запуске в первый раз, и вы хотите знать все новые релизы, вы бежите:

cqlsh:test> SELECT * FROM Bundles WHERE 
    ...  type = 'OSS' and 
    ...  ts < maxTimeuuid('2013-08-27 09:00:00'); 

(empty resultset) 

Поскольку не было никаких вставок до сих пор.

Затем вы (или какой-либо другой процесс) вставляете новый выпуск. Предположим, у вас есть несколько программных категорий, названный «тип» и тип «рамочные» или «Open Source» или что-то подходит для вашего варианта использования, вы можете вставить данные, как это:

cqlsh:test> INSERT INTO Bundles (bundle, type, ts, version) 
VALUES ('SomeFramwork', 'OSS', now(), '0.1.0a'); 

Это запоминает новый столбец (под значком столбца now()) в разделе 1 (для типа, наш ключ сложения).

Пятнадцать минутой зарядкой позже, если вы хотите знать все новые релизы в течение последних 15 минут, вы бежите:

cqlsh:test> SELECT type, dateOf(ts), bundle, version FROM Bundles WHERE 
    type = 'OSS' and 
    ts > minTimeuuid('2013-08-27 09:00:00') 
    and ts < maxTimeuuid('2013-08-27 09:15:00'); 

    type | dateOf(ts)    | bundle  | version 
    ------+--------------------------+--------------+--------- 
     OSS | 2013-08-27 09:14:27+0200 | SomeFramwork | 0.1.0a 

Вам потребуется запрос для каждого типа. Тип TimeUU гарантирует, что вставки остаются без конфликтов.

Если вы беспокоитесь о том, что строки слишком длинны (> 2 миллиарда), вы можете использовать ведра для ограничения длины строки.

Для вставки в Astyanax с помощью cql3 запросов, вы можете использовать

keyspace.prepareQuery(CF_BUNDLES).withCql(cql).execute(); 

где CQL Ваш запрос CQL и CF_BUNDLES является экземпляром ColumnFamily.

Для получения данных с помощью запроса CQL определено выше в Astyanax вы можете использовать

CqlResult<String, String> result = keyspace 
    .prepareQuery(CF_BUNDLES).withCql(cql).execute() 
    .getResult(); 

, который позволяет перебирать результаты.

+0

Спасибо за предложение. Мне это мало смысла. Но здесь я не могу понять, где я буду хранить версию в вышеупомянутом семействе столбцов? А что здесь типа? Можете ли вы представить простой пример вставки и один простой пример использования, чтобы иметь для меня больше смысла? – ferhan

+0

Я обновил свой ответ. Надеюсь, это поможет. – omnibear

+0

@omnibear: У меня также есть аналогичный пост [здесь] (http://stackoverflow.com/questions/19602979/how-to-retrieve-only-the-information-that-got-changed-from-cassandra). Если возможно, не могли бы вы мне помочь? У меня пока нет ни одного ответа ... Любая помощь будет оценена по этому поводу. Спасибо за помощь ... – AKIWEB

Смежные вопросы