摘要:從年月開始,的開發由作者目前就職贊助。武器一覽無線運營播種機模型動態表單屬性中心標簽系統權限中心模型位置管理一切皆位置回到主題,下面就為大家詳細介紹下,我們如何玩耍。場景包括頁面緩存限速器頁面性能分析狀態統計智能提醒異常線路。
Redis-簡介
Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal(Redis作者目前就職)贊助。
數據類型String(字符串)
List(列表)
Set(集合)
Sort Set(有序集合)
Hash(哈希)
Redis-應用場景Redis作者antirez描述了Redis比較適合的一些應用場景,NoSQLFan簡單列舉在這里,供大家一覽:
取最新N個數據的操作
排行榜應用,取TOP N操作
需要精準設定過期時間的應用
計數器應用
Uniq操作,獲取某段時間所有數據排重值
實時系統,反垃圾系統
Pub/Sub構建實時消息系統
構建隊列系統
緩存
運營研發-場景無線運營研發部,作為無線運營側的兵工廠,成功打造了CMS,位置管理,權限中心,RBZ等運營支撐工具。
武器一覽CMS:無線運營播種機
RBZ:EAV模型(動態表單+屬性中心+標簽系統)
權限中心:RBAC3模型
位置管理:一切皆位置
^^^^^^^ 回到主題,下面就為大家詳細介紹下,我們如何玩耍Redis。
場景包括CMS頁面緩存、API限速器、頁面性能分析、API狀態統計、CMS智能提醒-異常線路。尤其頁面性能分析、API狀態統計、CMS智能提醒等應用簡直X爆了,將頁面和接口性能看板化、智能化,技術應用一目了然、一覽無余。
場景字段的一些說明
應用場景:屬于哪一類應用范疇
數據類型:使用的數據類型
代碼說明:PHP,擴展phpredis
CMS頁面緩存基于Redis的字符串數據類型,用來存儲CMS靜態頁面數據,提高CMS相關頁面訪問速度,緩沖mysql的壓力。
數據類型:String
應用場景:緩存
代碼:
$staticHtml = Yii::app()->redis->get($cmsCacheKey); if (! $staticHtml || $this->clearcache) { $staticHtml = CmsTools::getStaticHtml($pageId, $cityCode); Yii::app()->redis->setex($cmsCacheKey, 3600, $staticHtml); }API限速器
基于Redis的字符串數據類型,用來控制API訪問頻率,一段時間內某一個IP針對某一個請求的訪問控制,官方用例
數據類型:String
應用場景:計數器
代碼:
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的有序集合數據類型,分析頁面執行性能。
數據類型:Sort Set
應用場景:排行榜
代碼:
//基于城市,記錄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);API狀態統計
綜合運用Redis數據類型,匯總API的調用,監控API的實時請求,分析超時請求。
數據類型:String,List,Sort Set
應用場景:計數器,排行榜
代碼(有點長):
/** * 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 } }
API-Status:
CMS智能提醒-異常線路綜合運用Redis數據類型,準實時匯總CMS所有樓層的線路呈現情況,精確的定位異常線路樓層,易于運營人員更好的開展工作。
數據類型:String,List,Sort Set
應用場景:隊列,排行榜,緩存
代碼(有點繞):
//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固然很贊,切記當你手上有一把錘子的時候,看所有的東西都是釘子,理解他,用好他。
Try Redis
Redis官網
Redis設計與實現
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21554.html
摘要:權限中心的依賴聲明聲明依賴關系檢查代碼規范聲明開發依賴命名空間檢查代碼規范,執行單元測試。單元測試持續交付一切都如此的完美,沒有測試,又如何可以證明這件事情的完美,又如何可以保障交付的質量。 序 權限管理是無線運營系統中的核心模塊,通過訪問控制策略的配置,來約定人與資源的訪問關系。 本文著重講解如何通過PHP來構建一個靈活、通用、安全的權限管理系統。 關于權限 首先我們來聊聊權限。 權...
摘要:認為權限授權實際上是的問題。具體的權限,正向授權與負向授權。應用建模業務場景權限管理鑒權設計應用建模系統架構上支撐權限系統靈活配置,不僵硬字段,不僵硬行為,基于各種業務權限管控的特征靈活設計。表示許可權與角色之間多對多的指派關系。 序 之前寫過一篇大話權限中心的PHP架構之道,主要是從軟件工程角度介紹,如何通過編碼規范、依賴管理、數據源架構、事務處理、單元測試等技術,來保障權限系統的高...
摘要:認為權限授權實際上是的問題。具體的權限,正向授權與負向授權。應用建模業務場景權限管理鑒權設計應用建模系統架構上支撐權限系統靈活配置,不僵硬字段,不僵硬行為,基于各種業務權限管控的特征靈活設計。表示許可權與角色之間多對多的指派關系。 序 之前寫過一篇大話權限中心的PHP架構之道,主要是從軟件工程角度介紹,如何通過編碼規范、依賴管理、數據源架構、事務處理、單元測試等技術,來保障權限系統的高...
閱讀 1684·2021-11-23 09:51
閱讀 3174·2021-09-26 10:21
閱讀 798·2021-09-09 09:32
閱讀 881·2019-08-29 16:06
閱讀 3308·2019-08-26 13:36
閱讀 772·2019-08-26 10:56
閱讀 2564·2019-08-26 10:44
閱讀 1143·2019-08-23 14:04