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