gpt4 book ai didi

database - 在 Cassandra 中存储上次触摸时间的最佳方式

转载 作者:搜寻专家 更新时间:2023-10-30 20:09:07 25 4
gpt4 key购买 nike

我在 Postgres 的用户表中存储了最后一次触摸的时间,但是有很多频繁的更新和足够多的争用,我可以看到 3 个相同更新死锁的示例。

Cassandra 似乎更适合这个——但我是否应该专门为此目的专门放置一张 table ?而且我不需要旧的时间戳,只需要最新的。我应该使用 Cassandra 以外的东西吗?如果我应该使用 Cassandra,关于表属性的任何提示?

我心目中的表格:

CREATE TABLE ksp1.user_last_job_activities (
user_id bigint,
touched_at timeuuid,
PRIMARY KEY (user_id, touched_at)
) WITH CLUSTERING ORDER BY (touched_at DESC)
AND bloom_filter_fp_chance = 0.01
AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
AND comment = ''
AND compaction = {'min_threshold': '4', 'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32'}
AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99.0PERCENTILE';

更新

谢谢!我围绕写入时间做了一些实验,因为无论如何我都必须写入一个值,所以我只写入了时间。

像这样:

CREATE TABLE simple_user_last_activity (
user_id bigint,
touched_at timestamp,
PRIMARY KEY (user_id)
);

然后:

INSERT INTO simple_user_last_activity (user_id, touched_at) VALUES (6, dateof(now()));
SELECT touched_at from simple_user_last_activity WHERE user_id = 6;

由于 touched_at 不再在主键中,因此每个用户只存储一条记录。

更新 2

还有一个我要选择的选项。我也可以存储 job_id,这为分析提供了更多数据:

CREATE TABLE final_user_last_job_activities (
user_id bigint,
touched_at timestamp,
job_id bigint,
PRIMARY KEY (user_id, touched_at)
)
WITH CLUSTERING ORDER BY (touched_at DESC)
AND default_time_to_live = 604800;

添加 1 周的 TTL 会处理过期记录 - 如果没有记录,我会返回当前时间。

INSERT INTO final_user_last_job_activities (user_id, touched_at, job_id) VALUES (5, dateof(now()), 5);
INSERT INTO final_user_last_job_activities (user_id, touched_at, job_id) VALUES (5, dateof(now()), 6);
INSERT INTO final_user_last_job_activities (user_id, touched_at, job_id) VALUES (5, dateof(now()), 7);
INSERT INTO final_user_last_job_activities (user_id, touched_at, job_id) VALUES (5, dateof(now()), 6);

SELECT * FROM final_user_last_job_activities LIMIT 1;

这给了我:

 user_id | touched_at               | job_id
---------+--------------------------+--------
5 | 2015-06-17 12:43:30+1200 | 6

简单的基准测试表明在存储或从更大的表中读取时没有显着的性能差异。

最佳答案

因为 c* 是最后写入的,所以你可以简单地保留每一行的最新版本。

您可以按照 MSD 的建议,使用 writetime 来拉取写入时间。但要小心,因为这是特定于列的,您不能在主键列上使用写入时间。例如在一个表中如下:

cqlsh> create TABLE test.test ( a int, b int, c int, d int, primary key (a))
... ;
cqlsh> insert INTO test.test (a, b, c, d) VALUES ( 1,2,3,4)
... ;

cqlsh> select * from test.test
... ;

a | b | c | d
---+------+---+------
1 | 2 | 3 | 4

(2 rows)

cqlsh> insert into test.test (a,c) values (1, 6);
cqlsh> select * from test.test ;

a | b | c | d
---+------+---+------
1 | 2 | 6 | 4

(2 rows)
cqlsh> select writetime(a), writetime(b), writetime(c), writetime(d) from test.test
... ;
InvalidRequest: code=2200 [Invalid query] message="Cannot use selection function writeTime on PRIMARY KEY part a"

cqlsh> select writetime(b), writetime(c), writetime(d) from test.test ;

writetime(b) | writetime(c) | writetime(d)
------------------+------------------+------------------
1434424690700887 | 1434424690700887 | 1434424702420929

否则,您可以添加带有时间戳的 cql 列:

create TABLE test.test ( a int, b int, c int, d int, touched_at timeuuid, primary key (a)) ;

一些快速基准测试可以帮助您确定哪个性能更好。

关于database - 在 Cassandra 中存储上次触摸时间的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30855412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com