gpt4 book ai didi

cassandra - 如何使用 cassandra 更新处理竞争条件?

转载 作者:行者123 更新时间:2023-12-03 08:04:25 25 4
gpt4 key购买 nike

我正在学习 Cassandra 。我正在为特定用例建模 cassandra 表。下面描述的用例 -

用户可以写一篇文章。
其他用户可以回复帖子。
用户还可以“赞成”或“反对”帖子。
用户按日期或赞成票或反对票对帖子进行排序。

这是我的表定义 -

CREATE TABLE post.comments_by_post (
postid text,
parentpostid text,
createdon bigint,
username text,
userid text,
displayname text,
upvotes int,
downvotes int,
comment text,
PRIMARY KEY ((postid, parentpostid), createdon)
) WITH CLUSTERING ORDER BY (createdon DESC);

要增加“upvote”,我有一个更新查询 -
UPDATE post.comments_by_post SET upvotes = incrementedValue where postid=1 and parentpostid = 2 ;

增量值 计算在先前值中加 1。

增量值 = 先前值 + 1

我的问题是,如果我必须根据表中的先前值计算增量,则会导致竞争条件和数据损坏。

我们有更好的办法吗?

我知道 cassandra 有计数器列定义类型,可以用于此类增量值,但它需要额外的表。计数器列不能与不属于主键的普通列​​一起使用。

最佳答案

下表和二级索引将允许您在没有 Counter 表和任何锁的情况下实现计数:

CREATE TABLE votes_by_comment (
postid text,
parentpostid text,
userid text,
vote text, //can be 'up' or 'down'
PRIMARY KEY (( postid, parentpostid ), userid))

CREATE INDEX ON votes_by_comment (vote);

当用户进行“投票”时:
INSERT INTO votes_by_comment (postid, parentpostid, userid, vote) VALUES ('comment1', 'post1', 'user1', 'up');

当用户进行“否决票”时:
INSERT INTO votes_by_comment (postid, parentpostid, userid, vote) VALUES ('comment1', 'post1', 'user1', 'down');
userid因为集群列将允许它避免竞争条件并限制一个用户的多次投票。

要计算选票:
SELECT count(*) from votes_by_comment WHERE postid='comment1' AND parentpostid='post1' and vote='up';

二级索引将允许它通过 vote 执行选择值,因为二级索引的选择会在一个分区键内进行,所以性能会很好。

但是这种方式不允许在 Cassandra 端实现投票排序,应该在应用端实现。

关于cassandra - 如何使用 cassandra 更新处理竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40957339/

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