如何每个月“缓存”一次 mysql 的查询结果?

2021-03-23 12:52:05 +08:00
 b00tyhunt3r
需求:

现有一个监控某款商品销量的后台网站,每售出一件该商品,记录进表。golang template 后端。

因为表非常之巨大,每 query 一次非常耗时。
又因为老大对此款商品销量的监控,实时性要求不高,


故 leader 希望只在每个月最后一天查询一次 DB,更新这个月的销量,然后把查询结果缓存在某个地方,
显示在后台网站上,以供这个月随时查看。


后台网站的界面是,选择某年某个月份,可以列出当月,此款商品的销量状况。




-----------------



不太明白的点,

1.每月 1 次查询 DB 的结果缓存在哪,

2.具体以什么形式缓存,如何缓存

3.如何做到每个月只查询,更新缓存一次?

4.redis 能否实现上述需求?


诚谢大佬解救!!!!!!!!!!
3384 次点击
所在节点    MySQL
18 条回复
redtea
2021-03-23 13:00:42 +08:00
MySQL 增加一张表,销售月度表,MySQL 里增加定时任务查询当月销量写入该表,需要查询时只要查询该表就可以了。
airyland
2021-03-23 13:02:08 +08:00
redis 或者数据库保存都可以,具体看数据量。保存商品 id 日期 数据。
用定时任务,或者可以用最简单的请求触发逻辑:如果当月请求不到上月数据缓存,说明还未缓存,执行查询并保存缓存。
fuis
2021-03-23 13:36:13 +08:00
随便写个定时任务存 redis 里呗
xiaoxinshiwo
2021-03-23 13:51:31 +08:00
感觉题主啥也不懂啊
b00tyhunt3r
2021-03-23 13:56:18 +08:00
@airyland
@fuis
@redtea
感谢回复!

想问一下用 redis 的情况,
不太理解的是,
譬如我今天查到的数据存进 redis 里面了,
但因为商品每天都在卖,明天 DB 里肯定会有新的数据变动,
然后明天我通过后台网站看销量,后台网站访问 redis 拿数据,结果 redis 发现 DB 里面数据更新了,
这时候 redis 不是又要去访问 DB 了?

和每个月只访问一次 DB 的需求有冲突?

redis 小白说错勿怪
chniccs
2021-03-23 13:56:47 +08:00
一个月一次,查出来你做 excel 吧。简单不。
lithiumii
2021-03-23 14:25:10 +08:00
假如没有退货之类的问题需要处理
每个月一号查询上个月的销量,查完存起来不用动了,一辈子都不用改
你今天新增的销量要到下个月一号才会被查询和更新
b00tyhunt3r
2021-03-23 14:27:34 +08:00
@lithiumii
是这个意思 但就是“查完存起来” 不知道如何实现
lithiumii
2021-03-23 14:36:19 +08:00
用 Redis 我觉得没必要
就请你们的 MySQL 数据库的 DBA 新建一张表,叫每月销量(当然具体表名建议符合规范来,比如 monthly_sales )
然后一列是月份,一列是销量数字,其他的列比如自增 id 、创建日期之类的等等建议按你们的规范来。然后你每月跑一次查询写进去就行了。

当然你一定要用 Redis 也行,就是 Redis 里面把过去每个月的数据存下来。自己查 Redis 怎么运行,怎么存储
limuyan44
2021-03-23 15:07:20 +08:00
新建个表就好了,redis 一点都不适合你这个场景,用了 redis 你数据还是要落地的,还是得建表,干嘛不直接建表,一个月一次的统计表能有多大的性能消耗。
XiaMuCoder
2021-03-23 15:14:00 +08:00
mysql 新建表+1
b00tyhunt3r
2021-03-23 15:19:00 +08:00
@limuyan44
好的老哥 已经决定新建表了。
btw 你这头像是本人吗?练了多久?
dayeye2006199
2021-03-23 15:46:34 +08:00
你这个就是个数据 ETL,把这个查询过程,做一个每个月的定时任务,得到的结果写入一张新表;报表查询,直接查这张新表就行了。
ch2
2021-03-23 18:00:31 +08:00
@b00tyhunt3r #5 redis 不会主动访问别人,它只会返回你给它的东西
gBurnX
2021-03-23 22:05:22 +08:00
1.一张表拿来做流式计算的统计,一张表拿来存历史数据。

2.流式计算的表,意思是,把一个数据结构,转化为只有一条数据的一张表。表里的某个字段用于记录当前商品的销量。当爬虫更新商品页面时,把最新的销量,更新到该数据的相关字段里。

3.历史数据表,用于爬虫更新商品页面时,把获取到的销量数据,insert 进去。

4.流式计算表拿来实时输出需要的统计数据,无论什么时候取都行,不一定非要等每月月末;历史数据表拿来做离线分析数据统计。
symons
2021-03-24 11:46:04 +08:00
可以考虑 Hive 表存储+BI 的方式来做
julyclyde
2021-03-24 12:42:28 +08:00
redis 不会“去发现”db 更新了
zhangysh1995
2021-03-24 17:05:08 +08:00
问题是怎么做:简单方法, 触发器+dump
问题是太慢,存不下:性能优化,加硬盘,减少存的信息

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

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

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

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

© 2021 V2EX