批量獲取數(shù)據(jù)

php版——未測(cè)試過(guò),僅做思路參考~

  • 使用時(shí),繼承此類并實(shí)現(xiàn)對(duì)應(yīng)方法
    <?php
    /**
     * 適用于在緩存中按key-value 的方式存儲(chǔ)對(duì)象且設(shè)置過(guò)期時(shí)間,db做為持久化存儲(chǔ)
     * web 應(yīng)用的瓶頸主要為網(wǎng)絡(luò)io, 因此網(wǎng)絡(luò)操作時(shí)盡量要節(jié)省請(qǐng)求次數(shù),如使用批量操作、redis 的pipeline 等方式來(lái)優(yōu)化,可參考:
     * http://www.lxweimin.com/p/f722faf010fa
     *
     * User: xjyin
     * Date: 15/11/5
     * Time: 下午6:30
     */

    abstract class BatchGetter {

        protected $ids;

        function _construct($ids) {
            $this->ids = $ids;
        }

        // 返回的array長(zhǎng)度必須等于count($ids),實(shí)現(xiàn)時(shí)不要用循環(huán)多次獲取,
        // 要用select a, b, c from table where id in (id1, ..., idn)
        // 注意:上面的sql 返回的數(shù)據(jù)的個(gè)數(shù)及順序會(huì)與$ids不一致,獲取到之后需要重新整理再返回
        abstract protected function getFromDB($ids);

        // 返回的array長(zhǎng)度必須等于count($ids)
        // 實(shí)現(xiàn)時(shí)需要使用redis的pipeline來(lái)操作, 避免循環(huán)調(diào)用多次redis.get(key),用了sharding的話需要使用shardedPipeline
        // 給redis封裝如下方法:
        // get(keys)
        // set(keys, objects)
        // zAdd(key, map)
        // hGetAll(keys)
        // hSet(keys, objects)
        // ...
        abstract protected function getFromCache($ids);

        abstract protected function setToCache($ids, $objects);

        public function exec() {
            if(count($this->ids) == 0) {
                return array();
            }
            $results = $this->getFromCache($this->ids);
            $length = count($this->ids);
            $missedIds = array();
            $missedIndexes = array();
            // 找到未從緩存中獲取到的數(shù)據(jù)
            for($i = 0; $i < $length; $i++) {
                if(!$results[i]) {
                    array_push($missedIds, $this->ids[$i]);
                    array_push($missedIndexes, $i);
                }
            }
            $missedIdsLength = count($missedIds);
            if(count($missedIdsLength) != 0) {
                // 從db中獲取未從緩存中獲取的數(shù)據(jù),并按missIndex放置到results中
                $dbResults = $this->getFromDB($missedIds);
                for($i = 0; $i < $missedIdsLength; $i++) {
                    $results[$missedIndexes[$i]] = $dbResults[$i];
                }
                $this->setToCache($missedIds, $dbResults);
            }
            return $results;
        }
    }
  • 另,盡量要合并網(wǎng)絡(luò)操作,如:

      原有邏輯:
          $redis->set($key, json_encode($data));
          $redis->expire($key, $ttl);
      優(yōu)化邏輯:
          $redis->set($key, json_encode($data), $ttl);
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.1 資料 ,最好的入門(mén)小冊(cè)子,可以先于一切文檔之前看,免費(fèi)。 作者Antirez的博客,Antirez維護(hù)的R...
    JefferyLcm閱讀 17,110評(píng)論 1 51
  • NOSQL類型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,060評(píng)論 2 27
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,948評(píng)論 18 139
  • 1 Redis介紹1.1 什么是NoSql為了解決高并發(fā)、高可擴(kuò)展、高可用、大數(shù)據(jù)存儲(chǔ)問(wèn)題而產(chǎn)生的數(shù)據(jù)庫(kù)解決方...
    克魯?shù)吕?/span>閱讀 5,354評(píng)論 0 36
  • 飯后,溫一盞茶,依窗,看遠(yuǎn)方蔥蘢的景,隔著窗感受陽(yáng)光的溫?zé)?。老媽樓前的不遠(yuǎn)處,有著一棟三層的舊樓,蒼老的樓墻,...
    那些年聆聽(tīng)的閱讀 154評(píng)論 0 0