Php Riak:快速获取多个项目

Php Riak:快速获取多个项目,php,riak,Php,Riak,假设我有这个PHP数组 $ids = [ 246, 8362, 5241, 2586, 6548, 9372, 28504, 14, 5729 ]; 这些数组元素对应于bucket“articles”中的项目,有时这个数组可能有1000个元素深 目前,我正在对所有这些数据进行循环,并逐个提取数据 $articles = []; foreach($ids as $id) { $articles[] = Riak::g

假设我有这个PHP数组

$ids = [
    246,
    8362,
    5241,
    2586,
    6548,
    9372,
    28504,
    14,
    5729
];
这些数组元素对应于bucket“articles”中的项目,有时这个数组可能有1000个元素深

目前,我正在对所有这些数据进行循环,并逐个提取数据

$articles = [];
foreach($ids as $id)
{
    $articles[] = Riak::get("articles.$id");
}
当ID列表变得相当长时,这比我想花费的时间要多


有没有更快的方法从Riak桶中提取项目列表?我环顾了一下,map reduce很有用,但显然会导致比使用顺序GET请求节省更多的开销。

不幸的是,从Riak高效地获取大量记录很困难,因为这些记录分布在集群中,必须单独检索。一些客户端库最近获得了对客户端multi-get的支持,它允许使用多个连接并行获取对象,但我认为这还没有到达PHP客户端

使用mapreduce执行此操作将减少对数据库的调用次数,但不会导致仲裁读取,因为它只查询覆盖的一组分区。然而,Mapreduce是一种相当广泛的查询数据的方法,它的伸缩性或性能不如直接密钥访问

如果这是您需要执行的常见操作,则可能表明您的数据模型过于规范化,并且您可能需要取消规范化,以使其更好地支持您的应用程序及其访问模式

确切地说,如何最好地做到这一点需要了解您的数据以及您的访问和查询模式。一种方法可能是在一个对象中存储多个项目,该对象具有一个已知且可预测的密钥,例如基于固定范围的项目ID。这将使文章的检索更加高效,因为需要读取的对象数量大大减少,但在更新和插入时可能会增加一些复杂性

另一种选择是通过复制数据来解除标准化。例如,如果您只需要文章中的一些信息,您可以将这些数据存储在单独的对象中,专门用于有效地服务于这些查询

在Riak中,检索包含比您需要的更多信息的较大对象并在应用程序级别进行过滤通常比从数据库中获取您需要的记录要好

基于PHP示例:

/**
     * Retrieve JSON-encoded objects from Riak.
     * @param  array(int) $keys - List of the key.
     * @return RiakObjects
     */
    public function multiGet($keys) {
        if (!$keys || !count($keys))
            return array();
        $query = null;
        foreach ($keys as $key) {
            if ($query) {
                $query->add($this->getBucketName(), $key);
            } else {
                $query = $this->riak->add($this->getBucketName(), $key);
            }
        }
        $results = $query->map(('function(riakObject){return [{"key":riakObject.key, "document":riakObject.values}];}'))->run();
        if (!$results || !count($results)) {
            return array();
        }

        $objects = array();
        foreach ($results as $data) {
            if (isset($data->key) && isset($data->document[0]->data) && !empty($data->document[0]->data)) {
                $object = json_decode($data->document[0]->data, true);
                if ($object) {
                    $objects[$data->key] = $object;
                }
            }
        }
        return $objects;
    }

+我想用一种方法来连接它,这种方法可以实现我一直在寻找的功能,但不幸的是,它的执行速度仍然太慢,不符合我的喜好。我最终以不同的格式存储了数据。我知道这是人们正在寻找的一个相当常见的东西,我希望这对其他人有用。这个方法使用mapreduce来检索多个对象。值得指出的是,这是一个相当昂贵的操作,其缺点是不会导致定额读取(将其视为R=1和notfound\u ok=true的读取)。最后,我仔细查看了我们是如何存储数据的。对数据进行去标准化最终是更好的方法。有些数据可能不像我们希望的那样是最新的,但对我们来说,它远不如尽快检索数据那么重要。谢谢你的回答,这正是我需要的。