腾讯产品经理笔试题
  其中第二题是一道偏技术的问题,出现在产品经理的中确实有点意外,但这题不失为一道很好的产品设计与系统分析的题目。系统分析也是我们“产品经理学技术”系列文章规划中的一个局部,也是将我们所讲的技术进行“升华”的一局部内容。
  关于消息的根底数据,比方文字、图片、时间、位置等这些咱就不表了。这些数据根本上与权限和性能没有多大关系,可以理解为单独存储,纯技术活。这里只讨论权限与性能相关的数据结构。
  而在权限管理上,采用了给用户打“标签”来进行分组,这个标签的分组与通讯录一致。在数据上,就是给每个关系增加一个“标签”标记。这里需要注意的是,虽然的关系在产品使用上给用户是双向的(即互相关注),但是在存储的时候,是给互相关的两个用户分别建立了关系数据,也就是每个人独有自己的一份“通讯录”。这通过删除了自己的好友之后,自己并不从别人的通讯录删除就可以看得出来。标签分组的根底数据就是这样了,这也是后面朋友圈权限管理的根底。
  对于个人朋友圈timeline所能看到的消息,按照一般的逻辑是先获取所有朋友的消息,然后剔除掉没有授权给自己看的消息、剔除掉自己屏蔽的用户消息,然后才得到自己当前看到的timeline。如果是这样的逻辑的话,等于每次刷新朋友圈,都要跑到所有的消息池里面去到上述通讯录中朋友们的消息,还要对到的每条消息去判断用户是否有权限阅读。这显然是效率低下的方式,更何况是这么大的一个访问量和数据量。所以,这种数据结构设计是行不通的了。
腾讯 笔试  解决这种性能问题一般的思路就是把需要大计算量的过程分散到平时零散的时间去做。在这里的思路就是:平时就把每个用户需要的 timeline数据按照权限设置准备好,等到用的时候(刷新朋友圈)就直接读取准备好的内容。那么答案就出来了:除了存储一份上面讲到的文字,图片等根本信息外,还需要给每个用户存储一份timeline数据,注意,是每个用户一份。当然,这里的“每份”不需要存储完整信息,只需要存储消息的ID和时间 (可能需要)。每个人刷新自己的朋友圈时,读取自己的那份数据就行了,既不用去消息池子里面筛选,也不用判断用户权限。