这里需要推荐一篇文章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读请求;