gpt4 book ai didi

scylla - 如何将 ScyllaDB 中的列表/集合修剪为特定大小?

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

有没有办法将列表/集合修剪为特定大小(根据元素数量)?

类似于 Redis 上的 LTRIM 命令(https://redis.io/commands/ltrim)。

目标是向列表/集合中插入一个元素,但确保其最终大小始终为 <= X(丢弃旧条目)。

我希望能够做的事情的例子:


CREATE TABLE images (
name text PRIMARY KEY,
owner text,
tags set<text> // A set of text values
);

-- single command
UPDATE images SET tags = ltrim(tags + { 'gray', 'cuddly' }, 10) WHERE name = 'cat.jpg';

-- two commands (Redis style)
UPDATE images SET tags = tags + { 'gray', 'cuddly' } WHERE name = 'cat.jpg';
UPDATE images SET tags = ltrim(tags, 10) WHERE name = 'cat.jpg';

最佳答案

不,Scylla(或Cassandra)中没有这样的操作。

第一个原因是效率:正如您所知,Scylla 中的写入 如此高效的一个原因是它们不进行读取:将一个元素添加到列表中只会写入单个元素项目到顺序文件(所谓的“sstable”)。它不需要读取现有列表并检查它已有的元素。您建议的操作需要在写入之前读取现有项目,从而显着降低速度。

第二个原因是一致性:如果像您建议的那样并行执行多个操作,以不同的顺序到达不同的协调器和副本,会发生什么情况?如果在较早的问题出现后,其中一个副本缺少其中一个值,会发生什么情况?没有解决这些问题的神奇方法,Scylla 为并发 Read-Modify-Write 操作提供的通用解决方案是 LWT(Lightweight Transacations)。您可以使用 LWT 模拟 ltrim 操作,但它会比普通写入慢得多。您需要将列表读取给客户端,对其进行修改(附加、ltrim 等),然后使用 LWT 将其写回(附加条件是它仍然具有其旧值,或使用额外的“版本号”柱子)。

关于scylla - 如何将 ScyllaDB 中的列表/集合修剪为特定大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61727547/

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