目前每张图片都有一个记录浏览量的 views 字段,用户浏览一次则 views+1,想在网站首页每天都显示昨日浏览量最多的图片,并且按降序排列,取前 1000 个结果,怎样以一种最简单的方式来实现? MySQL 或者 nosql (比如 redis 或者 ssdb )都可以
目前每张图片都有一个记录浏览量的 views 字段,用户浏览一次则 views+1,想在网站首页每天都显示昨日浏览量最多的图片,并且按降序排列,取前 1000 个结果,怎样以一种最简单的方式来实现? MySQL 或者 nosql (比如 redis 或者 ssdb )都可以
|
w516322644Oct 22, 2018
1
你不都说出来了吗?
|
|
2
@w516322644 我要的是“每天的昨天”
|
|
luoyou1014Oct 22, 2018
3
把浏览记录都记到一张表中。
select pic_id, count(*) as view_num from view_record group by pic_id order by view_num desc |
|
opengpsOct 22, 2018
4
你确实已经说出来了,我给你换个说法你重新理解下:
有个访问记录表,没访问一次多一条记录,至于你想取哪一天,就去 count 哪个时间段排序吧 像这种增长会很快的表,建议单独用一个表做统计结果,别每次 count |
|
luoyou1014Oct 22, 2018
5
@luoyou1014 忘了加 where time < today and time >= yesterday
|
|
ZhLTEOct 22, 2018
6
定时查询 ,然后缓存
|
|
iyaozhenOct 22, 2018 via Android
7
每天零点算一次,存下来。相当于每天打个快照
|
|
8
存 redis,晚上 0 点同步到数据库
|
|
xiaoyongOct 22, 2018
9
简单粗暴的办法。
如果只需要昨天和今天,不需要查询除这 2 天以外的数据的话,只需要在图片表中增加 2 个字段分别记录“今天浏览量”和“昨天浏览量”即可。每天零点服务器自动执行一个计划任务,把“今天浏览量”数据复制到“昨天浏览量”字段,之后把“今天浏览量”清零。 |
|
lhx2008Oct 22, 2018 via Android
10
最简单的方法就是 redis 两个 key,一个 key 是今天,一个 key 是昨天,然后每天把 今天的 key 改名为昨天的 key。
然后数据结构是 hash,用 redis 的 incrase + 1 |
|
amonOct 22, 2018
11
写个定时任务,第二天凌晨查询前一天的数据,然后缓存或者放到另一张表里。
这样方便后续的历史最热,以及二次统计每周、每月等等。 |
|
12
|
|
lhx2008Oct 22, 2018 via Android
13
也可以不改名,用日期做 key 就行,调用的时候拼一下今天的日期
|
|
14
还要考虑到随机,不然天天的最热就那几张图片排名靠前
另外不要 12 点更新,凌晨 3 点往后 |
|
virusdefenderOct 22, 2018
15
redis zscore
|
|
jevonszmxOct 22, 2018
16
用户前台显示的数量、每次浏览 view+1、排序,都用 redis 实现,按日期做 key 存,sorted sets 格式;
每天定时统计旧的数据,存入数据库,如果怕出问题,可以用定时脚本定时(比如 5 分钟)把 redis 数据同步到数据库; 不推荐用数据库来做这种事情,吃力不讨好。 |
|
az402Oct 22, 2018
17
不改表结构的话 views 字段继续按次累加
然后定时每天打一个总次数的快照 昨天次数 = 昨天总次数快照 - 前天总次数快照 根据日期 limit 2 然后减一下 |
|
whh945atsyzxOct 22, 2018
18
LRU
|