Cassandra PHP驱动程序502 badgateway来自准备好的声明

时间:2017-06-05 06:56:40

标签: php cassandra

我将这个驱动程序用于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();

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

感谢任何可以提供帮助的人。

1 个答案:

答案 0 :(得分:1)

我建议您更改以下数据模型:

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的发件人或收件人将是相同的。即

 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

因此,您不需要物化视图和查询。