Как дать ttl в Cassandra при вставке данных в пакетах? - PullRequest
0 голосов
/ 15 мая 2019

Здравствуйте. Я использую Cassandra для сохранения пользовательских данных. Я хочу хранить данные пользователя только в течение 24 часов, поэтому я даю TTL в течение 24 часов. Для каждого пользователя есть несколько записей. Поэтому я хочу пакетную вставку данных для каждого пользователя вместо нескольких обращений к базе данных. Я использую операции Кассандры, чтобы дать TTL. Я могу дать TTL для одиночной записи. Как предоставить ttl при вставке данных в пакетах

public class CustomizedUserFeedRepositoryImpl<T> implements CustomizedUserFeedRepository<T> {


private CassandraOperations cassandraOperations;

@Autowired
CustomizedUserFeedRepositoryImpl(CassandraOperations cassandraOperations){
    this.cassandraOperations = cassandraOperations;

}

@Override
public <S extends T> S save(S entity, int ttl){
    InsertOptions insertOptions;
    if(ttl == 0) {
        insertOptions =  InsertOptions.builder().ttl(Duration.ofHours(24)).build();
    } else {
        insertOptions = InsertOptions.builder().ttl(ttl).build();
    }
    cassandraOperations.insert(entity,insertOptions);
    return entity;
}

@Override
public void saveAllWithTtl(java.lang.Iterable<T> entities, int ttl){
    entities.forEach(entity->{
        save(entity,ttl);
    });
}

}

Как вы видите, мне приходится перебирать список make и делать вызовы базы данных для каждой записи. Пакетная операция cassandraOperations.batchOps (). Insert () принимает только список объектов. Как установить ttl для каждой записи при использовании функции batchops ()?

1 Ответ

0 голосов
/ 17 мая 2019
   /**
     * Add a collection of inserts with given {@link WriteOptions} to the batch.
     *
     * @param entities the entities to insert; must not be {@literal null}.
     * @param options the WriteOptions to apply; must not be {@literal null}.
     * @return {@code this} {@link CassandraBatchOperations}.
     * @throws IllegalStateException if the batch was already executed.
     * @since 2.0
     */
    CassandraBatchOperations insert(Iterable<?> entities, WriteOptions options);

Вы можете использовать insert(Iterable<?> entities, WriteOptions options) метод

@EqualsAndHashCode(callSuper = true)
public class WriteOptions extends QueryOptions {

private static final WriteOptions EMPTY = new WriteOptionsBuilder().build();

private final Duration ttl;
private final @Nullable Long timestamp;

batchOperations.insert(entity, WriteOptions.builder().ttl(20).build());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...