Feed系统构建

这里需要推荐一篇文章Feed系统构建

http://www.csdn.net/article/2013-11-07/2817430-design-decisions-for-scaling-your-high-traffic-feeds


# feed table SQL

CREATE TABLE `feeds` (
  `feed_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `uid` int(11) unsigned NOT NULL DEFAULT '0',
  `feed_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT 'feed類型',
  `object_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '對象實體類型',
  `object_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '對象實體ID',
  `feed_info` varchar(255) NOT NULL DEFAULT '' COMMENT 'feed信息',
  `time` int(10) NOT NULL DEFAULT '0' COMMENT '時間戳',
  PRIMARY KEY (`feed_id`),
  KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


在这里谈谈现在项目的Feed系统设计;

1、使用Mysql主从配置和Redis来支持Feed系统;

2、使用redis list为每个用户保存一个Feed list,list长度做好限制(如只保存50条和过期时间6小时),list中只保存feed_id;具体数据需要再次从数据库取;

3、由于使用redis作为读缓存,当有写操作时候需要先写mysql成功后再次写redis缓存;

4、读操作缓存未命中,就可以从mysql从库读取数据然后保存到redis中,读缓存命中情况需要更新Feed list过期时间;

5、Feed产生可以使用beanstalkd队列进行异步插入feeds表和更新用户Feed list;


这样使用redis作为读缓存可以保证数据一致性,即使redis宕机不会出现数据不一致问题;

使用redis设置过期时间可以很好的保证内存够用;

并发写mysql数据库已经使用beanstalkd队列保证异步完成;



可以改进地方:

1、增加redis内存尽可能将Feed内容保存,这样可以迅速减少mysql读请求;


你可能感兴趣的:(php)