余亦有所思|面对数据库海量数据,如何保证推送给用户的数据不再重复推送呢?参考今日头条

问题:面对海量数据不重复推送给用户

环境介绍

1.数据库中有2000w条记录,要求根据用户兴趣随机展示给用户。
2.展示过(即被用户阅览过的数据)不能再展示给该用户。
3.效率要高 至少要高过出题人所要求的 order by rand()及 where id not in ( 1, 2, … , n );。

心理分析

  作为一个小白初次看到这个问题时,我的脑海里直接浮现了三款比较类似又各自有着不同特点的应用,列举这三款呢也是因为小白我平时使用的比较多脑海里很快的浮现了这几款应用。
微博热门:
  微博就热门推送板块而言,我们可以发现其时效性还是比较强的,且我们很难在手动刷新一次的情况下再阅览到之前看过的记录。即:通过微博热门呈现给用户的数据创建时间会相对的靠近当前时间,且该条数据一定以某种状态被标记为被当前用户查阅过,但是很难在推送的内容中找到我们感兴趣,"时效性"会比"兴趣性"更强一些。
今日头条:
  今日头条呢是小白我平日闲着无聊就喜欢打开的应用,使用体验来说,我们可以明显的感受到,当系统推送的内容被我们点击阅览,或者主动搜索过部分关键词时,将会发现下一次刷新阅览列表时,系统会推送更多我们感兴趣的部分。这块"诡异"的部分跟大数据有关我们暂且不谈,但是我们可以明显的发现,其推送的数据并不是有这么强的时效性,且很难刷新到相同的内容。即:今日头条呈现给用户的数据创建时间会相对均匀的早于当前时间,且该条数据一定以某种状态被标记为被当前用户查阅过,"兴趣性"会比"时效性"更强一些。
微信朋友圈:
  微信朋友圈自不必说,相信大部分有手机的用户都会接触这款应用,微信朋友圈的消息以时间从此时往前排列出所有好友发送的朋友圈消息,如果你以为仅仅是这样那就错了。朋友圈被设置为可阅览分组的,即一条消息能被哪些好友查看是有状态决定的,可能是当前用户被设置了一个状态不能获取当前消息,也可能是当前消息被设置了若干用户不能获取。那朋友圈就是一个"时效性"以及"权限"都很强的应用。

思考

接下来带着问题和环境我们思考下面几个问题:
1.用户的兴趣与一条消息该如何绑定?
2.在何处何时对向某个用户呈现过的数据进行标记?
3.随机呈现?如何随机呈现?
4.如何提高效率?

解决思路

以下我们对问题进行补充完整并找出解决的思路。
1.用户的兴趣与一条消息该如何绑定?
假设:一个数据库中有2000w条数据,兴趣有20种,我们设定每个兴趣下有100w条记录,平均每个用户持有5个兴趣,即一个用户我们维护500w条数据。
解:
  以时间换空间式:将redis中的app_data的id们取出,再将当前uesrId下存放的查看过的id取出,通过循环将不重复的数据取出,然后根据limit10条的id去数据库里取。这里需要将数据取出再做一个去重操作,相对的在查询上浪费了时间。
  以空间换时间式:不管该用户是否查阅过该数据,只要用户创建并更新兴趣,就将对应的数据按规则放入该用户下的hash中,每次取出一部分并删除。如此每次获取结果集时直接取hash。便省去了一部分操作。
下文我们模拟第一种情况:即每次呈现过后的数据,我们对其标识。
2.在何处何时对向某个用户呈现过的数据进行标记?
解:
  在上一问中,本小白若隐若现的解答了这个问题ÿ

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值