“昨日浏览最多的图片”这种数据库最简单的实现方式该怎么设计?

2018-10-22 11:00:09 +08:00
 alwayshere

目前每张图片都有一个记录浏览量的 views 字段,用户浏览一次则 views+1,想在网站首页每天都显示昨日浏览量最多的图片,并且按降序排列,取前 1000 个结果,怎样以一种最简单的方式来实现? MySQL 或者 nosql (比如 redis 或者 ssdb )都可以

3442 次点击
所在节点    程序员
18 条回复
w516322644
2018-10-22 11:01:45 +08:00
你不都说出来了吗?
alwayshere
2018-10-22 11:03:36 +08:00
@w516322644 我要的是“每天的昨天”
luoyou1014
2018-10-22 11:11:57 +08:00
把浏览记录都记到一张表中。

select pic_id, count(*) as view_num from view_record group by pic_id order by view_num desc
opengps
2018-10-22 11:11:58 +08:00
你确实已经说出来了,我给你换个说法你重新理解下:
有个访问记录表,没访问一次多一条记录,至于你想取哪一天,就去 count 哪个时间段排序吧
像这种增长会很快的表,建议单独用一个表做统计结果,别每次 count
luoyou1014
2018-10-22 11:12:48 +08:00
@luoyou1014 忘了加 where time < today and time >= yesterday
ZhLTE
2018-10-22 11:17:27 +08:00
定时查询 ,然后缓存
iyaozhen
2018-10-22 11:18:37 +08:00
每天零点算一次,存下来。相当于每天打个快照
x86
2018-10-22 11:19:57 +08:00
存 redis,晚上 0 点同步到数据库
xiaoyong
2018-10-22 11:20:03 +08:00
简单粗暴的办法。
如果只需要昨天和今天,不需要查询除这 2 天以外的数据的话,只需要在图片表中增加 2 个字段分别记录“今天浏览量”和“昨天浏览量”即可。每天零点服务器自动执行一个计划任务,把“今天浏览量”数据复制到“昨天浏览量”字段,之后把“今天浏览量”清零。
lhx2008
2018-10-22 11:20:58 +08:00
最简单的方法就是 redis 两个 key,一个 key 是今天,一个 key 是昨天,然后每天把 今天的 key 改名为昨天的 key。
然后数据结构是 hash,用 redis 的 incrase + 1
amon
2018-10-22 11:21:12 +08:00
写个定时任务,第二天凌晨查询前一天的数据,然后缓存或者放到另一张表里。
这样方便后续的历史最热,以及二次统计每周、每月等等。
Livid
2018-10-22 11:22:26 +08:00
如果数据量不是很大的话,可以用 Redis 的 sorted sets:

https://redis.io/commands#sorted_set
lhx2008
2018-10-22 11:26:10 +08:00
也可以不改名,用日期做 key 就行,调用的时候拼一下今天的日期
PulpFunction
2018-10-22 11:35:57 +08:00
还要考虑到随机,不然天天的最热就那几张图片排名靠前
另外不要 12 点更新,凌晨 3 点往后
virusdefender
2018-10-22 12:47:28 +08:00
redis zscore
jevonszmx
2018-10-22 13:01:50 +08:00
用户前台显示的数量、每次浏览 view+1、排序,都用 redis 实现,按日期做 key 存,sorted sets 格式;
每天定时统计旧的数据,存入数据库,如果怕出问题,可以用定时脚本定时(比如 5 分钟)把 redis 数据同步到数据库;


不推荐用数据库来做这种事情,吃力不讨好。
az402
2018-10-22 13:44:16 +08:00
不改表结构的话 views 字段继续按次累加
然后定时每天打一个总次数的快照 昨天次数 = 昨天总次数快照 - 前天总次数快照
根据日期 limit 2 然后减一下
whh945atsyzx
2018-10-22 16:18:20 +08:00
LRU

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/499733

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX