面试题(千万级别数量以及高并发)
xjpcj 2015-07-07 07:52:38 1.我们的缓存分为两级,第一级只是一个PHP数组,有效范围是Request。而第二级是memcached。这么做的原因是,很多数据在一个Request周期内需要加载多次,这样可以减少memcached的网络请求。另外我们的框架也会尽可能的发送memcached的gets命令来获取数据,从而减少网络请求”, 请使用伪代码实现以上缓存架构
2有一个视频社交app(已知: 视频有大量的增,删,改)
个人主页需要显示用户的所有视频列表,每页20个,客户端会一直传递 max_id(比这个ID发布时间早的视频)做为线索,取下一页的数据
如何利用mc来缓存视频列表,加快速度,减少数据库压力,增加,删除,修改时如何维护缓存,或者有啥其他思路方案(也可不描述该题,直接提供其它觉得高明的mc使用方案代替,)
视频表:
CREATE TABLE `medias_index` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL,
`campaign_id` int(11) unsigned NOT NULL DEFAULT '0',
`city` int(11) unsigned NOT NULL DEFAULT '0',
`status` tinyint(3) unsigned NOT NULL DEFAULT '1',
`type` tinyint(3) unsigned NOT NULL DEFAULT '1',
`language` tinyint(3) unsigned NOT NULL DEFAULT '1',
`created_at` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`,`id`) USING BTREE,
KEY `campaign_id` (`campaign_id`) USING BTREE,
KEY `status` (`status`,`type`,`language`,`id`) USING BTREE,
KEY `created_at` (`created_at`)
) ENGINE=InnoDB AUTO_INCREMENT=100795936 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT COMMENT='视频表'
3有一个好友动态的需求
目前使用数据库语句实现
SELECT medias_index.id FROM medias_index JOIN (
SELECT follow_uid FROM follows WHERE uid=".$uid."
UNION ALL
SELECT ".$uid."
) AS follows
ON medias_index.uid=follow_uid".$where." ORDER BY medias_index.id DESC ".$limit
其中where为客户端在取好友动态第二页时,会提供max_id线索
where medias_index.id < '.$max_id .' ';
以目前6000万行的数据量,该语句开始出现慢得情况
每个用户最多关注5000人
CREATE TABLE `follows_001` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '关注者UID',
`follow_uid` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '被关注者UID',
`likes` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '喜欢数',
`created_at` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '关注时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uid` (`uid`,`follow_uid`) USING BTREE,
KEY `ceated_at` (`uid`,`created_at`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3185092 DEFAULT CHARSET=utf8 COM-MENT='关注表,根据uid取模分128表'
看有没有优化的方案
不限于mysql,可以使用任意方案