我遇到一个用例,意味着一个包含过期日期的列必须定期更新并使用范围/切片查询进行过滤。
该表用于维护要处理的元素列表。首先,检索候选列表(具有过去的过期日期),然后用对应于元素的最大处理时间的新的到期日期更新每个元素。当元素处理完成时,到期时间被更新为最大长值,即它永不过期。我知道它看起来像一个队列,它是卡桑德拉的反模式。完整模型更复杂,但我已经简化为范围/切片查询问题。
表格定义如下。
CREATE TABLE IF NOT EXISTS element_status (
partitionkey text,
elementid text,
lockexpirationinmillissinceepoch bigint,
PRIMARY KEY((partitionkey), requestid)) with default_time_to_live = 604800;
初始插入。
INSERT INTO element_status (partitionkey, elementid,clientCallUuid, lockexpirationinmillissinceepoch) VALUES (‘mypartition’, ‘06e6668c-ebad-4e16-9329-a8854ebf1c32’, 123455);
检索候选人的查询
SELECT * FROM element_status WHERE
partitionKey='partitionKey' AND
lockExpirationInMillisSinceEpoch < 123456
LIMIT 123 ALLOW FILTERING;
“锁定”元素的查询,即更新到期日期
UPDATE element_status SET
lockExpirationInMillisSinceEpoch=135456
WHERE partitionKey='partitionKey' AND
requestId='requestId';
“完成”元素的查询。
UPDATE keyspaceName.async_message_status SET
lockExpirationInMillisSinceEpoch=9223372036854775807
WHERE partitionKey='partitionKey' AND
requestId='requestId';
对于范围/切片查询,已使用以下定义创建SASI索引。
CREATE CUSTOM INDEX IF NOT EXISTS element_status_lock_expiration_in_millis_since_epoch_index ON element_status (lockExpirationInMillisSinceEpoch) USING 'org.apache.cassandra.index.sasi.SASIIndex';
按分区划分的预期数量是每天约200,000条记录,TTL是一周。
我使用最新的Cassandra版本(3.11.1)。
但是,不建议在生产中使用SASI索引。 我想评估此SASI索引可能出现的问题。
还在Cassandra user list上提出了问题。