摘要:從年月開(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 |
學(xué)習(xí)指南!顯然,Redis的應(yīng)用場(chǎng)景遠(yuǎn)甚于此。=)
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
摘要:權(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)...
摘要:認(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)的高...
摘要:認(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)的高...
閱讀 1711·2021-11-23 09:51
閱讀 3265·2021-09-26 10:21
閱讀 828·2021-09-09 09:32
閱讀 911·2019-08-29 16:06
閱讀 3354·2019-08-26 13:36
閱讀 810·2019-08-26 10:56
閱讀 2593·2019-08-26 10:44
閱讀 1171·2019-08-23 14:04