成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

途牛原創(chuàng)|無(wú)線中心運(yùn)營(yíng)研發(fā)Redis酷實(shí)踐

zoomdong / 3317人閱讀

摘要:從年月開(kāi)始,的開(kāi)發(fā)由作者目前就職贊助。武器一覽無(wú)線運(yùn)營(yíng)播種機(jī)模型動(dòng)態(tài)表單屬性中心標(biāo)簽系統(tǒng)權(quán)限中心模型位置管理一切皆位置回到主題,下面就為大家詳細(xì)介紹下,我們?nèi)绾瓮嫠?。?chǎng)景包括頁(yè)面緩存限速器頁(yè)面性能分析狀態(tài)統(tǒng)計(jì)智能提醒異常線路。

Redis-簡(jiǎn)介

Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。從2010年3月15日起,Redis的開(kāi)發(fā)工作由VMware主持。從2013年5月開(kāi)始,Redis的開(kāi)發(fā)由Pivotal(Redis作者目前就職)贊助。

數(shù)據(jù)類(lèi)型

String(字符串)

List(列表)

Set(集合)

Sort Set(有序集合)

Hash(哈希)

Redis-應(yīng)用場(chǎng)景

Redis作者antirez描述了Redis比較適合的一些應(yīng)用場(chǎng)景,NoSQLFan簡(jiǎn)單列舉在這里,供大家一覽:

取最新N個(gè)數(shù)據(jù)的操作

排行榜應(yīng)用,取TOP N操作

需要精準(zhǔn)設(shè)定過(guò)期時(shí)間的應(yīng)用

計(jì)數(shù)器應(yīng)用

Uniq操作,獲取某段時(shí)間所有數(shù)據(jù)排重值

實(shí)時(shí)系統(tǒng),反垃圾系統(tǒng)

Pub/Sub構(gòu)建實(shí)時(shí)消息系統(tǒng)

構(gòu)建隊(duì)列系統(tǒng)

緩存

運(yùn)營(yíng)研發(fā)-場(chǎng)景

無(wú)線運(yùn)營(yíng)研發(fā)部,作為無(wú)線運(yùn)營(yíng)側(cè)的兵工廠,成功打造了CMS,位置管理,權(quán)限中心,RBZ等運(yùn)營(yíng)支撐工具。

武器一覽

CMS:無(wú)線運(yùn)營(yíng)播種機(jī)

RBZ:EAV模型(動(dòng)態(tài)表單+屬性中心+標(biāo)簽系統(tǒng))

權(quán)限中心:RBAC3模型

位置管理:一切皆位置

^^^^^^^ 回到主題,下面就為大家詳細(xì)介紹下,我們?nèi)绾瓮嫠edis。

場(chǎng)景包括CMS頁(yè)面緩存、API限速器、頁(yè)面性能分析、API狀態(tài)統(tǒng)計(jì)、CMS智能提醒-異常線路。尤其頁(yè)面性能分析、API狀態(tài)統(tǒng)計(jì)、CMS智能提醒等應(yīng)用簡(jiǎn)直X爆了,將頁(yè)面和接口性能看板化、智能化,技術(shù)應(yīng)用一目了然、一覽無(wú)余。

場(chǎng)景字段的一些說(shuō)明

應(yīng)用場(chǎng)景:屬于哪一類(lèi)應(yīng)用范疇

數(shù)據(jù)類(lèi)型:使用的數(shù)據(jù)類(lèi)型

代碼說(shuō)明:PHP,擴(kuò)展phpredis

CMS頁(yè)面緩存

基于Redis的字符串?dāng)?shù)據(jù)類(lèi)型,用來(lái)存儲(chǔ)CMS靜態(tài)頁(yè)面數(shù)據(jù),提高CMS相關(guān)頁(yè)面訪問(wèn)速度,緩沖mysql的壓力。

數(shù)據(jù)類(lèi)型:String

應(yīng)用場(chǎng)景:緩存

代碼:

$staticHtml = Yii::app()->redis->get($cmsCacheKey);

if (! $staticHtml || $this->clearcache) {
   $staticHtml = CmsTools::getStaticHtml($pageId, $cityCode);
   Yii::app()->redis->setex($cmsCacheKey, 3600, $staticHtml);
}
API限速器

基于Redis的字符串?dāng)?shù)據(jù)類(lèi)型,用來(lái)控制API訪問(wèn)頻率,一段時(shí)間內(nèi)某一個(gè)IP針對(duì)某一個(gè)請(qǐng)求的訪問(wèn)控制,官方用例

數(shù)據(jù)類(lèi)型:String

應(yīng)用場(chǎng)景:計(jì)數(shù)器

代碼:

public static function rateLimit($apiKey = null)
{
    //Redis鍵值
    $apiRunCountKey = Yii::app()->request->userHostAddress . "-" . $apiKey;
    //初始化接口訪問(wèn)頻次
    if (Yii::app()->redis->get($apiRunCountKey) === false) {
        Yii::app()->redis->setex(
            $apiRunCountKey,
            self::$RateLimitTime,
            self::$RateLimitCount
        );
    }
    //獲取當(dāng)前可執(zhí)行的頻次
    $currentApiCount = Yii::app()->redis->decr($apiRunCountKey);

    if ($currentApiCount < 0) {
        Yii::log($apiRunCountKey, "info", "webadmin.cms.api.rate");
        return false;
    }
    return true;
}

//CMS頁(yè)面-重置頻率控制
return PowerApiService::rateLimit("cms-refresh-page-" . $pageId)
    && CmsTool::refreshStaticPage($pageId);
性能分析

基于Redis的有序集合數(shù)據(jù)類(lèi)型,分析頁(yè)面執(zhí)行性能。

數(shù)據(jù)類(lèi)型:Sort Set

應(yīng)用場(chǎng)景:排行榜

代碼:

//基于城市,記錄PC首頁(yè)生成時(shí)間
Yii::app()->redis->zAdd(
    "homepage-cache-profile",
    round($endTime - $startTime, 2),
    $this->letter
);

//匯總PC首頁(yè)性能數(shù)據(jù)
Yii::app()->redis->zRange("homepage-cache-profile", 0, -1, true);

//基于頁(yè)面,記錄CMS頁(yè)面重置時(shí)間
Yii::app()->redis->zAdd(
    "cms-refresh-page-profile",
    round($pageEndTime - $pageStartTime, 2),
    $pageId
);

//獲取CMS,0-30s性能的頁(yè)面
Yii::app()->redis->zRangeByScore("cms-refresh-page-profile", 0, 30);

//獲取CMS,>30s性能的頁(yè)面
Yii::app()->redis->zRangeByScore("cms-refresh-page-profile", 30, 900);
API狀態(tài)統(tǒng)計(jì)

綜合運(yùn)用Redis數(shù)據(jù)類(lèi)型,匯總API的調(diào)用,監(jiān)控API的實(shí)時(shí)請(qǐng)求,分析超時(shí)請(qǐng)求。

數(shù)據(jù)類(lèi)型:String,List,Sort Set

應(yīng)用場(chǎng)景:計(jì)數(shù)器,排行榜

代碼(有點(diǎn)長(zhǎng)):

/**
 * Webadmin-API-Status
 */

public static $webApiList200       = "web:api:list:200";

public static $webApiList500       = "web:api:list:500";

public static $webApiListTimeOut   = "web:api:list:timeout";

public static $webApiListCache     = "web:api:list:cache";

public static $webApiListLatest    = "web:api:List:latest";

public static function collectApiStatus(ApiStatus $apiStatus)
{
    $apiAction = array(
        "n" => $apiStatus->name, //接口名
        "p" => $apiStatus->params, //接口參數(shù)
        "c" => $apiStatus->client, //客戶(hù)端
        "e" => $apiStatus->elapsed(), //響應(yīng)時(shí)長(zhǎng)
        "t" => time() //時(shí)間戳
    );

    //最新請(qǐng)求-數(shù)據(jù)錄入
    Yii::app()->redis->lPush(self::$webApiListLatest, json_encode($apiAction));
    Yii::app()->redis->ltrim(self::$webApiListLatest, 0, 29);

    //最新請(qǐng)求-前臺(tái)渲染
    //$apiLatest = Yii::app()->redis->lGetRange(self::$webApiListLatest, 0, 29);

    //收集緩存
    if ($apiStatus->cache) {
        self::collectApiResponseCache($apiStatus->name); //zIncrBy
    }

    //收集狀態(tài)
    if ($apiStatus->status == 200) {
        self::collectApiResponse200($apiStatus->name); //zIncrBy
    } else if ($apiStatus->status == 500) {
        self::collectApiResponse500($apiStatus->name); //zIncrBy
    } else {
      //
    }

    //收集超時(shí)
    if ($apiStatus->elapsed() > 2000) {
        self::collectApiResponseTimeOut($apiAction); //zIncrBy
    }
}

API-Status:

CMS智能提醒-異常線路

綜合運(yùn)用Redis數(shù)據(jù)類(lèi)型,準(zhǔn)實(shí)時(shí)匯總CMS所有樓層的線路呈現(xiàn)情況,精確的定位異常線路樓層,易于運(yùn)營(yíng)人員更好的開(kāi)展工作。

數(shù)據(jù)類(lèi)型:String,List,Sort Set

應(yīng)用場(chǎng)景:隊(duì)列,排行榜,緩存

代碼(有點(diǎn)繞):

//Redis鍵值
$cmsCheckPrdKey = "cms:{$pageId}:{$cityCode}"; //CMS-頁(yè)面ID-預(yù)定城市

//推送CMS樓層線路信息
PowerApiService::push(
    $cmsCheckPrdKey,
    array(
        "pid"  => $pageId, //頁(yè)面ID
        "code" => $cityCode, //城市Code
        "mid"  => $moduleId, //產(chǎn)品模塊ID
        "i"    => $preRouteIds, //運(yùn)營(yíng)配置線路
        "t"    => time() //時(shí)間戳
    )
);

/**
 * Worker-計(jì)算CMS中的異常產(chǎn)品
 */
public static function cmsCheckPrd($item = array())
{
    $pid  = $item["pid"]; //頁(yè)面ID
    $code = $item["code"]; //城市Code
    $mid  = $item["mid"]; //產(chǎn)品模塊ID
    $i    = $item["i"]; //待計(jì)算的線路
    $t    = $item["t"]; //請(qǐng)求時(shí)間戳

    //時(shí)間戳,用于判斷隊(duì)列的實(shí)效性,此處代碼省略

    //通過(guò)搜索接口,判斷線路有效性  
    $solr = new PowerSolrService();
    $recommend = new ror_service_recommend();
    $recommend->ids = $i;
    $recommend->queryFields = array("productId");
    $o = $solr->recommendQueryOrigin($recommend); //有效的線路

    //數(shù)據(jù)差集=異常線路
    $diff = array_diff($i, $o);

    if ($diff) {
        //通過(guò)有序集合的特性,模塊的異常線路=score
        Yii::app()->redis->zAdd($cmsCheckPrdKey, $mid, $mid . ":" . implode(",", $diff));
        //數(shù)據(jù)有效性=1day
        Yii::app()->redis->expire($cmsCheckPrdKey, 86400);
    }

    //獲取CMS頁(yè)面模塊信息
    //Yii::app()->redis->zRange($cmsCheckPrdKey, 0, -1);

    //切割數(shù)據(jù),獲取模塊對(duì)應(yīng)的異常線路
    //list($moduleID, $modulePrd) = explode(":", $checkString);
}

圖示1 (樓層提醒):

CMS異常樓層統(tǒng)計(jì)(實(shí)時(shí)計(jì)算):

頁(yè)面ID 城市Code 異常樓層
1992 上海 4
1992 廣州 7
1992 成都 6
1949 北京 6

!顯然,Redis的應(yīng)用場(chǎng)景遠(yuǎn)甚于此。=)

學(xué)習(xí)指南

Redis固然很贊,切記當(dāng)你手上有一把錘子的時(shí)候,看所有的東西都是釘子,理解他,用好他。

Try Redis

Redis官網(wǎng)

Redis設(shè)計(jì)與實(shí)現(xiàn)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21554.html

相關(guān)文章

  • 途牛原創(chuàng)|大話權(quán)限中心的PHP架構(gòu)之道

    摘要:權(quán)限中心的依賴(lài)聲明聲明依賴(lài)關(guān)系檢查代碼規(guī)范聲明開(kāi)發(fā)依賴(lài)命名空間檢查代碼規(guī)范,執(zhí)行單元測(cè)試。單元測(cè)試持續(xù)交付一切都如此的完美,沒(méi)有測(cè)試,又如何可以證明這件事情的完美,又如何可以保障交付的質(zhì)量。 序 權(quán)限管理是無(wú)線運(yùn)營(yíng)系統(tǒng)中的核心模塊,通過(guò)訪問(wèn)控制策略的配置,來(lái)約定人與資源的訪問(wèn)關(guān)系。 本文著重講解如何通過(guò)PHP來(lái)構(gòu)建一個(gè)靈活、通用、安全的權(quán)限管理系統(tǒng)。 關(guān)于權(quán)限 首先我們來(lái)聊聊權(quán)限。 權(quán)...

    miracledan 評(píng)論0 收藏0
  • 途牛原創(chuàng)途牛無(wú)線權(quán)限系統(tǒng)的架構(gòu)設(shè)計(jì)與實(shí)踐

    摘要:認(rèn)為權(quán)限授權(quán)實(shí)際上是的問(wèn)題。具體的權(quán)限,正向授權(quán)與負(fù)向授權(quán)。應(yīng)用建模業(yè)務(wù)場(chǎng)景權(quán)限管理鑒權(quán)設(shè)計(jì)應(yīng)用建模系統(tǒng)架構(gòu)上支撐權(quán)限系統(tǒng)靈活配置,不僵硬字段,不僵硬行為,基于各種業(yè)務(wù)權(quán)限管控的特征靈活設(shè)計(jì)。表示許可權(quán)與角色之間多對(duì)多的指派關(guān)系。 序 之前寫(xiě)過(guò)一篇大話權(quán)限中心的PHP架構(gòu)之道,主要是從軟件工程角度介紹,如何通過(guò)編碼規(guī)范、依賴(lài)管理、數(shù)據(jù)源架構(gòu)、事務(wù)處理、單元測(cè)試等技術(shù),來(lái)保障權(quán)限系統(tǒng)的高...

    TwIStOy 評(píng)論0 收藏0
  • 途牛原創(chuàng)途牛無(wú)線權(quán)限系統(tǒng)的架構(gòu)設(shè)計(jì)與實(shí)踐

    摘要:認(rèn)為權(quán)限授權(quán)實(shí)際上是的問(wèn)題。具體的權(quán)限,正向授權(quán)與負(fù)向授權(quán)。應(yīng)用建模業(yè)務(wù)場(chǎng)景權(quán)限管理鑒權(quán)設(shè)計(jì)應(yīng)用建模系統(tǒng)架構(gòu)上支撐權(quán)限系統(tǒng)靈活配置,不僵硬字段,不僵硬行為,基于各種業(yè)務(wù)權(quán)限管控的特征靈活設(shè)計(jì)。表示許可權(quán)與角色之間多對(duì)多的指派關(guān)系。 序 之前寫(xiě)過(guò)一篇大話權(quán)限中心的PHP架構(gòu)之道,主要是從軟件工程角度介紹,如何通過(guò)編碼規(guī)范、依賴(lài)管理、數(shù)據(jù)源架構(gòu)、事務(wù)處理、單元測(cè)試等技術(shù),來(lái)保障權(quán)限系統(tǒng)的高...

    姘擱『 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<