一.需求描述
從 A (外部介面,http或socket介面等等) 取到xml格式資料,然後儲存到平台B(中間平台),對外部提供各種介面,返回JSON格式資料,平台C,D,E.....等等從平台B取資料,需求其實很簡單,在這隻是分析下中間可能的種種問題,怎麼解決,也希望大家多提寶貴意見。
其中從A取資料,每次期間較長,估計十幾分鐘左右,另外C,D,E等等外部平台對B串連比較頻繁,具體峰值現在還不好估算。
二.開發環境
linux+php+apache+mysql+redis
三.設計思路
1. 取資料模組,從A通過http介面取資料,進入mysql做持久化儲存,同時資料進入redis做緩衝,需要設計mysql表對應的redis結構。
每次取資料時間較長,通過php長串連方式或php批處理方式處理,避免服務斷開。
具體方式見php長串連處理整理:http://blog.csdn.net/lxzo123/archive/2011/04/28/6370715.aspx
2. 對外發布http介面,同時開關控制從redis取資料還是mysql取資料,聲明一點,該資料時效性較強,外部每次訪問都返回最新資料
需要提供翻頁介面,預設外部串連redis緩衝,當redis中取不到對應資料才進行查詢mysql庫。
3. redis資料刪除,由於資料每天都很多,需要對redis資料進行定期刪除一些比較舊的資料,可以按一定規則進行,比如幾天前的資料就刪除,或者redis中資料大於一定數目,就刪除最早的資料。
4. 統計分析功能,如使用者串連數,等等。
四.具體實現描述
1.mysql表結構設計,再此簡單設計代替,因為是公司項目。
新聞欄目表 create table news_category (
id integer, 新聞欄目ID
category varchar2新聞欄目名稱
);
新聞結構表 create table news_info (
id integer ,新聞ID
title varchar2 新聞標題
create date 新聞發生時間
categoryid 所屬欄目ID
);
新聞內容表 create table news_content(
id integer 新聞ID
content varchar 新聞內容
);
其它省略.
2. redis對應結構體設計
新聞欄目用hash儲存 key: news:category field: 欄目id value:欄目名稱
新聞ID用zset儲存,因為需要翻頁處理,list沒有提供返回index介面,處理翻頁不是特別完美(後續再說明),zset結構
key: news:id:index:[欄目ID] score: (next:id:index自增為一個string) member :新聞ID
新聞結構體通過hast儲存 key: news:info:[欄目ID]:[新聞ID] field: 對應表中欄位名稱 value:對應欄位值
先到此為止,改天繼續補充