您的位置:首页 > 博客中心 > 数据库 >

优化ECStore mongodb大数据 读写效率

时间:2022-03-14 03:50

转自

拆表存取kv

<?php
/*
经过拆变优化的ECStore mongodb 类
base/lib/kvstore/mongodb.php*/
class base_kvstore_mongodb extends base_kvstore_abstract implements base_interface_kvstore_base 
{
    static private $_mongodb = null;

    function __construct($prefix) 
    {
        $prefix = is_string($prefix) ? preg_replace("(\/|\\|\-|-|-|\_|_)",‘.‘, $prefix):md5(var_export($prefix ,true));
        $this->prefix = $prefix;

        if(!isset(self::$_mongodb)){
            $server = defined(‘MONGODB_SERVER_CONFIG‘)?MONGODB_SERVER_CONFIG:"mongodb://localhost:27017";
            $option = defined(‘MONGODB_OPTION_CONFIG‘)?eval(MONGODB_OPEION_CONFIG):array("connect" => TRUE);
            self::$_mongodb = new Mongo($server,$option);
        }

         $this->mongodb = self::$_mongodb->selectCollection(‘ecos‘,$this->prefix);

    }//End Function

    public function fetch($key, &$value, $timeout_version=null) 
    {
        $store = $this->mongodb->findOne(array(‘key‘=>$this->create_key($key)));
        if(!is_null($store) && $timeout_version < $store[‘dateline‘]){
            if($store[‘ttl‘] > 0 && ($store[‘dateline‘]+$store[‘ttl‘]) < time()){
                return false;
            }
            $value = $store[‘value‘];
            return true;
        }
        return false;
    }//End Function

    public function store($key, $value, $ttl=0) 
    {
        $store[‘value‘] = $value;
        $store[‘dateline‘] = time();
        $store[‘ttl‘] = $ttl;
        $store[‘key‘] = $this->create_key($key);
        $store[‘prefix‘] = $this->prefix;
        $res = $this->mongodb->update(array(‘key‘=>$store[‘key‘]), $store, array("upsert" => true));
        return $res;
    }//End Function

    public function delete($key) 
    {
        return $this->mongodb->remove(array(‘key‘=>$this->create_key($key)));
    }//End Function

    public function recovery($record) 
    {
        $key = $record[‘key‘];
        $store[‘key‘] = $this->create_key($key);
        $store[‘value‘] = $record[‘value‘];
        $store[‘dateline‘] = $record[‘dateline‘];
        $store[‘ttl‘] = $record[‘ttl‘];
        $res = $this->mongodb->update(array(‘key‘=>$store[‘key‘]), $store, array("upsert" => true));
        return $res;
    }//End Function

}//End Class

保证各关键表索引情况

每当mongodb 数据量激增,读写频繁,锁表严重,基本就是索引未加,或未经过拆表方案。

/*mongo 命令行操作*/
use ecos
show collections
db.printCollectionStats()
db.default.ensureIndex({key:1})
db.b2c.cart.ensureIndex({key:1})
db.tbdefine.ensureIndex({ke:1})
db.cache.content.nodes.ensureIndex({key:1})
db.b2c.goods.ensureIndex({key:1})

 

热门排行

今日推荐

热门手游