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

php版——未測試過,僅做思路參考~

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

    abstract class BatchGetter {

        protected $ids;

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

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

        // 返回的array長度必須等于count($ids)
        // 實現(xiàn)時需要使用redis的pipeline來操作, 避免循環(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容