前言:
App里有一功能,叫动态圈。
App打开该功能是默认会加载第一页最新的10条数据。
当通过向上划的手势不断从第1条数据浏览到第10条数据
,划到最后一条数据时,再继续往上划,会加载当前第10条数据后10条数据。
另外动态圈里
除了朋友圈,还有用户自己所属的社交圈,关注圈(关注目标的圈子),而这些动态圈信息发布时,也可以设定信息可见权限,同时用户也有 类似 微信朋友圈 里的“不让他看见我的朋友圈”设置。
问题:
1.动态圈权限计算:
由于动态圈权限过于复杂,没有可能动态计算出当前用户可看的动态圈列表信息,然后再按照时间倒序排序。
所以需要将这些“计算” 缓存起来。
另外每个用户的计算结果也不一样,所以需要每个用户都自己独立的“邮箱”去存放这些计算结果。
2.缓存有效性
可能有人问,如果缓存起来的动态圈,如果有人修改了权限,假如有人把动态圈由原来的“对所有人可见” 改为“指定可见",那缓存的数据岂不是有问题吗?
答案是, 动态圈不允许修改,如果你要修改,就得要删除,然后再新增。
所以这么一个设计就避免了用户修改动态圈信息,需要更新缓存的问题。
3.分页问题
如果按照传统方式,以页码方式分页查询,那有可能第二页查询的数据是跟第一页重复的。
试想一下 ,假如有20条数据,每页10条数据,
在没有新数据插入的情况下,查询第一数据没问题,查询第二页数据也没问题。
但是,当用户查询第一页数据,然后新增10条数据,那查询第二业数据,自然就跟当前已经在显示“第一页数据”是一样的。
注意这里是按照时间倒序排序分页查询的。
4.分页与排序问题
当用户执行“翻页”操作时,只能从最后一条记录id,开始翻页,
id为自增(已经表示了数据的先后顺序),并且按时间倒序查询,大概sql语句为:
select * from xx
where id<最后一条记录id
order by id desc
假如第一页数据为 100 ~ 91 ,那第二页数据为 90 ~ 81
这个实现完全是基于 代表时间到序 的id 来进行查询,一旦不用这个时间倒序,查询的数据自然是乱的,所以这里不能使用更多额外复杂得排序。(当然会有其他方式)
其他问题:待续
解决方案:
待续