来自准备好的语句的 Cassandra PHP 驱动程序 502 badgateway

德尔

我正在为 cassandra 使用这个驱动程序:https : //github.com/datastax/php-driver

这是我用来创建表的代码:

CREATE TABLE test.packages (
     packageuuid timeuuid, 
     ruserid text, 
     suserid text, 
     timestamp int, 
     PRIMARY KEY (ruserid, suserid, packageuuid, timestamp)
);

然后我创建了一个物化视图:

CREATE MATERIALIZED VIEW test.packages_by_userid 
    AS SELECT * FROM test.packages 
    WHERE ruserid IS NOT NULL 
       AND suserid IS NOT NULL 
       AND TIMESTAMP IS NOT NULL 
       AND packageuuid IS NOT NULL 
    PRIMARY KEY (ruserid, suserid, timestamp, packageuuid) 
    WITH CLUSTERING ORDER BY (packageuuid DESC);

这是我的 PHP 代码片段,它导致 502 错误网关:

$session   = $cluster->connect($keyspace);
$selectstmt = $session->prepare("SELECT suserid, susername, snickname, msg, savatar, timestamp FROM packages_by_userid WHERE ruserid IN (?, ?) AND suserid IN (?, ?) AND timestamp < ? LIMIT 40;");
$params = array('ruserid' => array($rid, $sid), 'suserid' => array($rid, $sid), 'timestamp' => $endtimestamp);
$options = array('arguments' => $params);
$future    = $session->executeAsync($selectstmt, $options);
$result    = $future->get();

我相信我搞砸了将参数绑定到准备好的语句。在我的情况下,这样做的正确方法是什么,因为我必须将多个值绑定到ruseridand suserid

感谢任何能提供帮助的人。

无耻的伊斯兰教

我建议你改变你的数据模型,如下所示:

CREATE TABLE packages (
    cnvid text,
    packageuuid timeuuid,
    ruserid text,
    suserid text,
    PRIMARY KEY (cnvid, packageuuid)
);

cnvid是对话ID。您可以使用以下功能制作对话 ID:

 function makeConversationId($ruserid, $suserid ) {
    return $ruserid <= $suserid ? $ruserid . ':' . $suserid : $suserid . ':' . $ruserid ;
 }

无论发件人还是收件人,您的对话 ID 都是相同的。IE

 echo makeConversationId('1', '2') . '<br/>';
 echo makeConversationId('2', '1'); 

输出 :

1:2
1:2

现在你有了cnvid,每当你insert/update/delete/select用上面的方法制作cnvid。

虽然 packageuuid 是 timeuuid,但你所有的 packageuuid 都会按时间排序。

因此,要查询首先创建 cnvid(即1:2),然后使用要查询的时间戳创建一个 timeuuid(即896f8110-49d4-11e7-ade6-493d3332b999

检查这个:https : //datastax.github.io/php-driver/api/Cassandra/class.Timeuuid/

因此,您可以查询以获取时间戳大于给定时间戳的 1 到 2 之间的用户包:

示例数据:

 cnvid | packageuuid                          | ruserid | suserid
-------+--------------------------------------+---------+---------
   3:4 | bc0809e0-49d3-11e7-ade6-493d3332b999 |       3 |       4
   1:2 | 1f4aae70-49d1-11e7-ade6-493d3332b999 |       1 |       2
   1:2 | 237ff3b0-49d1-11e7-ade6-493d3332b999 |       2 |       1

询问 :

SELECT * FROM packages WHERE cnvid = '1:2' AND packageuuid < 896f8110-49d4-11e7-ade6-493d3332b999;

输出 :

 cnvid | packageuuid                          | ruserid | suserid
-------+--------------------------------------+---------+---------
   1:2 | 1f4aae70-49d1-11e7-ade6-493d3332b999 |       1 |       2
   1:2 | 237ff3b0-49d1-11e7-ade6-493d3332b999 |       2 |       1

所以你不需要物化视图和查询。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章