社区列表根据关注人数排序(排行榜)的实现思路整理


title: 社区列表根据关注人数排序(排行榜)的实现思路整理
date: 2018-09-08
tags: [工作笔记]


场景说明

客户端有一个社区列表的展示界面,该列表的排序方式是按照关注人数进行反向排序(从大到小),类似:

社区id 社区名称 社区关注人数
1 AAA 4
3 CCC 3
2 BBB 2
4 DDD 1

但是社区的 关注人数是动态变化的 ,当社区数量较多时也要考虑分页的情况,那么该列表的排序和分页有了很大的难度。

这里简单整理当前的实现思路,并指出明显的缺陷和暂时解决不了的问题,待以后有能力解决。

实现思路

这里首先要解决的第一个问题就是将动态转换成静态,然后才能排序。

如果做到根据实时的关注人数进行排序,对于后端是容易实现的,但是要考虑的客户端的处理方式:客户端会缓存已经获取的列表信息,同一个用户分页获取数据的时候,由于关注人数的动态变化,会导致数据出现重复或缺漏的问题。

举个例子说明

某时刻社区的关注人数如下(这里是举个例子说明,所以数据仅列出了4条):

社区id 社区名称 社区关注人数
1 AAA 3
3 CCC 4
2 BBB 3
4 DDD 1

当前时刻为t1,那么此时的社区排序结果如下:

社区id 社区名称 社区关注人数 生成时刻
3 CCC 4 t1
1 AAA 3 t1
2 BBB 3 t1
4 DDD 1 t1

一段时间之后,时刻为t2,那么此时社区的关注人数发生了变化:

社区id 社区名称 社区关注人数
1 AAA 5
3 CCC 7
2 BBB 9
4 DDD 4

那么此时的排序结果相对与t1时刻已经发生了明显的变化:

社区id 社区名称 社区关注人数 生成时刻
2 BBB 9 t2
3 CCC 7 t2
1 AAA 5 t2
4 DDD 4 t2

数据重复或漏缺的复现

这里出现的数据重复漏缺是有前提的:数据条数有点多,不能够一次全部返回给客户端,需要分页获取。

根据上面的那个例子,在t1时刻,用户当前的分页参数 count=2 ,那么返回的是id为 31 的社区信息,当用户在t2时刻继续获取分页的时候,返回的却是id为 14 那么这里id为1的社区就出现重复的问题了,缺漏的原理也类似。

缓存生成的关注排行榜

这里的实现思路是每隔一段时间将当前的关注排行榜进行缓存:

排行榜id 社区id 社区名称 社区关注人数 生成时刻
1 3 CCC 4 t1
2 1 AAA 3 t1
3 2 BBB 3 t1
4 4 DDD 1 t1
5 2 BBB 9 t2
6 3 CCC 7 t2
7 1 AAA 5 t2
8 4 DDD 4 t2

这个时间间隔就是每次任务的时间间隔T,在T间隔内获取的数据都将通过该缓存排行榜中获取。用户在第一次访问的时候,仅携带分页的count即可,返回的数据中,不仅包含社区的相关信息,还包括最新的时刻tn,在以后的分页获取数据过程中,需要携带该时刻。

比如用户在t1时刻传入参数count=2,那么返回的是id为31的社区信息,同时返回参数中也包含t1的值,那么在第二次访问的时候,需要携带count=2&time=t1,这样列表接口将会根据用户的时刻继续获取他的排行队列,那么返回的就应该是id为24的社区信息,同样包括t1的值。

其实也就是用户访问的时候,如果没有携带时刻参数,那么就默认返回距离当前时间最近的时刻。

缓存的过期和时刻参数t的失效设定

讨论一下极端情况:

  • 当时刻为t9的时候,时刻参数是t1的用户获取的将是很久以前的数据,可能这个数据对当前用户来说已经没有意义了。
  • 最理想的情景就是,用户发出请求的时候,刚好有一批新的社区排行缓存生成,这是拿到的数据也是最合理的数据。
  • 还有一种比较不合理的情景,就是用户发出请求的时候,刚好有一批新的社区排行榜将要生成,那么用户拿到的数据也就是间隔时间T之前的缓存。

所以这里就需要进行缓存过期和时刻参数失效的设定。

  • 设定时刻参数比当前时间小N×T的为无效时刻,将自动返回最新的缓存信息。
  • 缓存排行榜列表也会在任务执行的时候清除 N×T 前的缓存数据。

后端的实现

数据库中缓存表的构建

  • 该缓存表专门缓存各个时刻的排行信息,有定时任务进行插入和删除数据,任何用户均不能操作修改该表中数据。
  • 该表包含的基本字段有: 自身的id社区的id关注的人数生成的时刻(时间戳)

定时任务的调度

  • 社区排行榜生成任务,该任务是每T时间执行一次,完成对当前社区排行榜的计算、排序和入缓存库,任务执行时生成当前任务的唯一时刻值并一同存入缓存数据库中。
  • 缓存数据库清理任务,该任务的执行间隔可以是N×T,完成对N×T时刻前的排行榜数据进行清除。

列表接口的实现

  • 判断用户传入时刻值的有效性。如果用户没有传入时刻值或时刻值比当前时间小N×T则分配最新的时刻值。
  • 向缓存表中获取指定分页的社区id,并返回响应的社区信息列表和对应的时刻值。

客户端相关的任务

  • 用户首次进入列表界面时,请求不需要携带时刻值。
  • 用户下拉刷新的时候,请求不需要携带时刻值。
  • 用户上拉浏览列表的时候,请求需要携带时刻值。
  • 用户上拉浏览列表的时候,如果时刻值失效,需要清楚本地的部分缓存。

存在的问题

  • 用户浏览的数据不是最新的数据,在上面的极端情况中已经讨论
  • 客户端处理较为复杂
  • 用户在界面滞留时间越久,客户端的到的数据越不理想
  • 用户在当前列表的上的操作,比如关注某个社区,客户端需要将原本的关注人数+1,但是刷新界面之后,关注的人数又会变成原来的数字。
  • 由于是缓存的数据,当用户点击某个社区的详情时,看到的关注人数可能与列表中的人数不一致。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,863评论 2 89
  • 四天两晚的绘画学习结束了。 感触最深的是严老师时而语重心长的提点:“你急什么急嘞 你着什么急嘞” 操练环节,画一...
    淡看云舒阅读 365评论 0 0
  • “生命必须是一场勇敢的冒险,不然你就一无所获。”这句话是从李华老师的《写出心灵深处的故事》一书中摘出来的,李华老师...
    喜水阅读 228评论 1 2
  • 虽然你个子在班上是最矮的,但妈妈还是为你快要到我的肩膀高而高兴; 虽然你比还是那么瘦,但妈妈还是为你热爱足球而高兴...
    看上去不瘦阅读 322评论 0 0
  • 背景图片(一般是Button)设置为RippleDrawable,以波纹效果实现不同状态间的转换。RippleDr...
    乐此不痞阅读 204评论 0 0