卡桑德拉防止重复

Seb*_*wak 3 cql cassandra cql3

我有一个简单的表,发布者userId

create table test (
  userId uuid,
  placeId uuid,
  visitTime timestamp,
  primary key(userId, placeId, visitTime)
) with clustering order by (placeId asc, visitTime desc);
Run Code Online (Sandbox Code Playgroud)

每对(userId, placeId)可以访问1次或不访问。visitTime只是与之相关的一些数据,用于对诸如之类的查询进行排序select * from test where userId = ? order by visitTime desc

我该如何要求(userId, placeId)与众不同?我需要确保

insert into test (userId, placeId, timeVisit) values (?, ?, ?)
Run Code Online (Sandbox Code Playgroud)

不会(userId, placeId)在不同的时间插入第二次访问。在插入之前检查是否存在不是原子的,有没有更好的方法?

Car*_*ini 5

让我明白-如果这对夫妇(userId, placeId)应该是唯一的,(这意味着您不必在这对数据中放入两行)timeVisit主键有什么用?order by visitTime desc如果只有一行,为什么还要使用查询呢?

如果您需要防止重复,则有两种方法。

1-轻量级交易-使用此功能IF NOT EXISTS可以完成您想要的。但是正如我在这里解释的那样由于cassandra的特殊处理,轻量级交易的速度确实很慢

2- USING TIMESTAMP强制执行写入时间-(请谨慎操作!***)“ 诀窍 ”是强制降低TIMESTAMP

让我举个例子:

INSERT INTO users (uid, placeid , visittime , otherstuffs ) VALUES ( 1, 2, 1000, 'PLEASE DO NOT OVERWRITE ME') using TIMESTAMP 100;
Run Code Online (Sandbox Code Playgroud)

这产生这个输出

select * from users;

 uid | placeid | otherstuffs                | visittime
-----+---------+----------------------------+-----------
   1 |       2 | PLEASE DO NOT OVERWRITE ME |      1000
Run Code Online (Sandbox Code Playgroud)

现在让我们减少 timestamp

INSERT INTO users (uid, placeid , visittime , otherstuffs ) VALUES ( 1, 2, 2000, 'I WANT OVERWRITE YOU') using TIMESTAMP 90;
Run Code Online (Sandbox Code Playgroud)

现在表中的数据尚未更新,因为这对夫妇有更高的TS操作(100)(uid, placeid)-实际上,此处的输出未更改

select * from users;

 uid | placeid | otherstuffs                | visittime
-----+---------+----------------------------+-----------
   1 |       2 | PLEASE DO NOT OVERWRITE ME |      1000
Run Code Online (Sandbox Code Playgroud)

如果性能很重要,请使用解决方案2,如果性能不重要,请使用解决方案1。对于解决方案2,您可以使用固定数字减去系统时间毫秒来计算每次写入的时间戳记

例如:

Long decreasingTimestamp = 2_000_000_000_000L - System.currentTimeMillis();
Run Code Online (Sandbox Code Playgroud)

***例如,如果您要删除然后重新插入数据,此解决方案可能会导致意外行为。重要的是要知道,一旦删除数据,只有在写入操作具有较高的删除时间戳记(如果未指定,则使用的时间戳记是机器的时间戳记)时,您才可以再次写入它们。

HTH,
Carlo