V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
b00tyhunt3r
V2EX  ›  MySQL

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

  •  
  •   b00tyhunt3r · 2021-03-23 12:52:05 +08:00 · 3388 次点击
    这是一个创建于 1372 天前的主题,其中的信息可能已经有所发展或是发生改变。
    需求:

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

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


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


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




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



    不太明白的点,

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

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

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

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


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

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

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

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

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

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

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

    4.流式计算表拿来实时输出需要的统计数据,无论什么时候取都行,不一定非要等每月月末;历史数据表拿来做离线分析数据统计。
    symons
        16
    symons  
       2021-03-24 11:46:04 +08:00
    可以考虑 Hive 表存储+BI 的方式来做
    julyclyde
        17
    julyclyde  
       2021-03-24 12:42:28 +08:00
    redis 不会“去发现”db 更新了
    zhangysh1995
        18
    zhangysh1995  
       2021-03-24 17:05:08 +08:00
    问题是怎么做:简单方法, 触发器+dump
    问题是太慢,存不下:性能优化,加硬盘,减少存的信息
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3112 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 13:02 · PVG 21:02 · LAX 05:02 · JFK 08:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.