Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工做由VMware主持。從2013年5月開始,Redis的開發由Pivotal(Redis做者目前就任)贊助。php
Redis做者antirez描述了Redis比較適合的一些應用場景,NoSQLFan簡單列舉在這裏,供你們一覽:html
無線運營研發部,做爲無線運營側的兵工廠,成功打造了CMS,位置管理,權限中心,RBZ等運營支撐工具。mysql
^^^^^^^ 回到主題,下面就爲你們詳細介紹下,咱們如何玩耍Redis。git
場景包括CMS頁面緩存、API限速器、頁面性能分析、API狀態統計、CMS智能提醒-異常線路。尤爲頁面性能分析、API狀態統計、CMS智能提醒等應用簡直X爆了,將頁面和接口性能看板化、智能化,技術應用一目瞭然、盡收眼底。github
場景字段的一些說明web
基於Redis的字符串數據類型,用來存儲CMS靜態頁面數據,提升CMS相關頁面訪問速度,緩衝mysql的壓力。redis
$staticHtml = Yii::app()->redis->get($cmsCacheKey); if (! $staticHtml || $this->clearcache) { $staticHtml = CmsTools::getStaticHtml($pageId, $cityCode); Yii::app()->redis->setex($cmsCacheKey, 3600, $staticHtml); }
基於Redis的字符串數據類型,用來控制API訪問頻率,一段時間內某一個IP針對某一個請求的訪問控制,官方用例sql
public static function rateLimit($apiKey = null) { //Redis鍵值 $apiRunCountKey = Yii::app()->request->userHostAddress . '-' . $apiKey; //初始化接口訪問頻次 if (Yii::app()->redis->get($apiRunCountKey) === false) { Yii::app()->redis->setex( $apiRunCountKey, self::$RateLimitTime, self::$RateLimitCount ); } //獲取當前可執行的頻次 $currentApiCount = Yii::app()->redis->decr($apiRunCountKey); if ($currentApiCount < 0) { Yii::log($apiRunCountKey, 'info', 'webadmin.cms.api.rate'); return false; } return true; } //CMS頁面-重置頻率控制 return PowerApiService::rateLimit('cms-refresh-page-' . $pageId) && CmsTool::refreshStaticPage($pageId);
基於Redis的有序集合數據類型,分析頁面執行性能。數據庫
//基於城市,記錄PC首頁生成時間 Yii::app()->redis->zAdd( 'homepage-cache-profile', round($endTime - $startTime, 2), $this->letter ); //彙總PC首頁性能數據 Yii::app()->redis->zRange('homepage-cache-profile', 0, -1, true); //基於頁面,記錄CMS頁面重置時間 Yii::app()->redis->zAdd( 'cms-refresh-page-profile', round($pageEndTime - $pageStartTime, 2), $pageId ); //獲取CMS,0-30s性能的頁面 Yii::app()->redis->zRangeByScore('cms-refresh-page-profile', 0, 30); //獲取CMS,>30s性能的頁面 Yii::app()->redis->zRangeByScore('cms-refresh-page-profile', 30, 900);
綜合運用Redis數據類型,彙總API的調用,監控API的實時請求,分析超時請求。json
/** * 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, //接口參數 'c' => $apiStatus->client, //客戶端 'e' => $apiStatus->elapsed(), //響應時長 't' => time() //時間戳 ); //最新請求-數據錄入 Yii::app()->redis->lPush(self::$webApiListLatest, json_encode($apiAction)); Yii::app()->redis->ltrim(self::$webApiListLatest, 0, 29); //最新請求-前臺渲染 //$apiLatest = Yii::app()->redis->lGetRange(self::$webApiListLatest, 0, 29); //收集緩存 if ($apiStatus->cache) { self::collectApiResponseCache($apiStatus->name); //zIncrBy } //收集狀態 if ($apiStatus->status == 200) { self::collectApiResponse200($apiStatus->name); //zIncrBy } else if ($apiStatus->status == 500) { self::collectApiResponse500($apiStatus->name); //zIncrBy } else { // } //收集超時 if ($apiStatus->elapsed() > 2000) { self::collectApiResponseTimeOut($apiAction); //zIncrBy } }
綜合運用Redis數據類型,準實時彙總CMS全部樓層的線路呈現狀況,精確的定位異常線路樓層,易於運營人員更好的開展工做。
//Redis鍵值 $cmsCheckPrdKey = "cms:{$pageId}:{$cityCode}"; //CMS-頁面ID-預約城市 //推送CMS樓層線路信息 PowerApiService::push( $cmsCheckPrdKey, array( 'pid' => $pageId, //頁面ID 'code' => $cityCode, //城市Code 'mid' => $moduleId, //產品模塊ID 'i' => $preRouteIds, //運營配置線路 't' => time() //時間戳 ) ); /** * Worker-計算CMS中的異常產品 */ public static function cmsCheckPrd($item = array()) { $pid = $item['pid']; //頁面ID $code = $item['code']; //城市Code $mid = $item['mid']; //產品模塊ID $i = $item['i']; //待計算的線路 $t = $item['t']; //請求時間戳 //時間戳,用於判斷隊列的實效性,此處代碼省略 //經過搜索接口,判斷線路有效性 $solr = new PowerSolrService(); $recommend = new ror_service_recommend(); $recommend->ids = $i; $recommend->queryFields = array("productId"); $o = $solr->recommendQueryOrigin($recommend); //有效的線路 //數據差集=異常線路 $diff = array_diff($i, $o); if ($diff) { //經過有序集合的特性,模塊的異常線路=score Yii::app()->redis->zAdd($cmsCheckPrdKey, $mid, $mid . ':' . implode(',', $diff)); //數據有效性=1day Yii::app()->redis->expire($cmsCheckPrdKey, 86400); } //獲取CMS頁面模塊信息 //Yii::app()->redis->zRange($cmsCheckPrdKey, 0, -1); //切割數據,獲取模塊對應的異常線路 //list($moduleID, $modulePrd) = explode(':', $checkString); }
圖示1 (樓層提醒):
CMS異常樓層統計(實時計算):
頁面ID | 城市Code | 異常樓層 |
---|---|---|
1992 | 上海 | 4 |
1992 | 廣州 | 7 |
1992 | 成都 | 6 |
1949 | 北京 | 6 |
!顯然,Redis的應用場景遠甚於此。=)
Redis當然很贊,切記**當你手上有一把錘子的時候,看全部的東西都是釘子**,理解他,用好他。