Cassandra:表中的固定行数

Cassandra:表中的固定行数,cassandra,cassandra-2.2,Cassandra,Cassandra 2.2,我想创建一个具有固定行数(比如N)的表,如果添加了N+1行,那么第一行将被删除 这是表格,我用于存储图形分析的最后N个最佳结果: CREATE TABLE IF NOT EXISTS lp_registry.best ( value float, // best value for current graph verts int, // number of vertices in graph edges int, // number of edges in gra

我想创建一个具有固定行数(比如N)的表,如果添加了N+1行,那么第一行将被删除

这是表格,我用于存储图形分析的最后N个最佳结果:

CREATE TABLE IF NOT EXISTS lp_registry.best (
    value float, // best value for current graph
    verts int,   // number of vertices in graph
    edges int,   // number of edges in graph
    wid text,    // worker id       
    id timeuuid, // timeuuid
    PRIMARY KEY (wid, id)
) WITH CLUSTERING ORDER BY (id ASC);
我读过,但只发现TTL过期。所以我决定按照下面的方法做

我的方法A:

每次需要添加新结果时,都会检索最旧行的id

SELECT wid, id FROM lp_registry.best LIMIT 1;
..以及当前行数

SELECT COUNT(*) FROM FROM lp_registry.best;
因此,如果计数>=N,则删除最旧的行,并添加最新的行

BEGIN BATCH
    INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
    DELETE FROM lp_registry.best WHERE wid = ? AND id = ?;
APPLY BATCH;
这种方法有一个问题,即第一批选择不是与下一批一起进行的原子操作。所以,如果任何其他工作进程删除了select和batch之间最早的行,或者超过了N,那么这将不起作用

我的方法B:

同样的第一步

SELECT wid, id FROM lp_registry.best LIMIT 1;
SELECT COUNT(*) FROM FROM lp_registry.best;
然后尝试一次又一次地删除最旧的行,直到成功

if count < N {
  INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
} else { 
  while not success {
    DELETE FROM lp_registry.best WHERE wid = ? AND id = ? IF EXISTS;
  }
  INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
}
如果计数
在这种方法中,在检查计数
你能给我指出正确的解决方案吗?

这是我的解决方案。首先,我们需要创建一个表来存储当前的行数

CREATE TABLE IF NOT EXISTS row_counter (
  rmax int,  // maximum allowed number of rows
  rows int,  // current number of rows
  name text, // name of table
  PRIMARY KEY (name)
);
然后为给定的固定行表初始化它:

INSERT INTO row_counter (name, rmax, rows) 
VALUES ('best', 100, 0);
以下是以下代码中使用的语句:

q1 = "SELECT rows, rmax FROM row_counter WHERE name = 'best'";
q2 = "UPDATE row_counter SET rows = ? WHERE name = 'best' IF rows < ?";
q3 = "SELECT wid, id FROM best LIMIT 1";
q4 = "DELETE FROM best WHERE wid = ? AND id = ? IF EXISTS";
q5 = "INSERT INTO best (vertex, value, verts, edges, wid, id) VALUES (?, ?, ?, ?, ?, now())";

selectCounter = session.prepare(q1);
updateCounter = session.prepare(q2);
selectOldBest = session.prepare(q3);
deleteOldBest = session.prepare(q4);
insertNewBest = session.prepare(q5);
q1=“从行计数器中选择行,其中名称=‘最佳’”;
q2=“更新行\计数器设置行=?其中,如果行<?,名称='最佳'”;
q3=“从最佳限制1中选择wid、id”;
q4=“如果存在,从wid=?和id=?的最佳位置删除”;
q5=“插入最佳(顶点、值、顶点、边、wid、id)值(?,,,,,,,现在())”;
selectCounter=session.prepare(q1);
updateCounter=session.prepare(q2);
选择oldbest=session.prepare(第三季度);
deleteOldBest=session.prepare(第4季度);
insertNewBest=会话准备(q5);
Java解决方案:

// Success indicator
boolean succ = false;

// Get number of registered rows in the table with best results
Row row = session.execute(selectCounter.bind()).one();
int rows = row.getInt("rows") + 1;
int rmax = row.getInt("rmax");

// Repeatedly try to reserve empty space in table
while (!succ && rows <= rmax) {
  succ = session.execute(updateCounter.bind(rows, Math.min(rows, rmax))).wasApplied();
  rows = session.execute(selectCounter.bind()).one().getInt("rows") + 1;
}

// If there is not empty space in table, repeatedly try to make new empty space
while (!succ) {
  row = session.execute(selectOldBest.bind()).one();
  succ = session.execute(deleteOldBest.bind(row.getString("wid"), row.getUUID("id"))).wasApplied();
}

// Insert new row
session.execute(insertNewBest.bind(vertex, value, verts, edges, workerCode));
//成功指示器
布尔成功=假;
//获取表中具有最佳结果的已注册行数
行=session.execute(selectCounter.bind()).one();
int rows=row.getInt(“rows”)+1;
int rmax=row.getInt(“rmax”);
//反复尝试在表中保留空白

虽然(!succ&&rows)有一个简单的问题:为什么需要它?也许另一种方法更适合您的用例。有许多并行计算机(worker)每一个都对不同的数据执行相同类型的计算,计算时间变化很大。然后有一个顶层逻辑,它获取N个最新结果并使用它执行计算。