一.需求描述
从 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:对应字段值
先到此为止,改天继续补充