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)在不同的时间插入第二次访问。在插入之前检查是否存在不是原子的,有没有更好的方法?
让我明白-如果这对夫妇(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
| 归档时间: |
|
| 查看次数: |
6275 次 |
| 最近记录: |