首页 > ecshop实现定时任务,我先说下我的思路,也请你们给出思路

ecshop实现定时任务,我先说下我的思路,也请你们给出思路

需求描述:

user用户表中有约100万条用户记录,现在想根据注册时间(create_time)这个字段,
判断该用户是老用户还是新用户(user_type new新用户 old老用户)
1、新用户:注册两周内,14(含)天以内。
2、老用户:注册两周以上,14(不含)天以上。
我的思路如下:

因为ECShop不是纯OOP的框架,所以我打算在根目录建个crontab目录
里面新建个user.php
user.php里面 先统计出整张表的总记录数 total
然后分页获取100条,循环update 整张表的数据
查询的时候 where条件过滤已经是老用户的数据
也就是说where永远是 user_type='new',整个表
默认全是new

问题来了,表里有100万条记录,我怕执行我PHP脚本的时候
循环查库会把数据库MySQL拖垮,咋办?

100万数据每一页100条,那就是1万页,如何处理呢?
for循环这个思路是否可靠?


对user表的create_time添加索引(索引字段必须放在where中的左边),执行以下sql,

UPDATE user SET user_type = 'old' WHERE create_time < date_sub(curdate(),interval 14 day)

每天凌晨3:00执行即可(truncate),100万条数据不算很多


我觉得这件事儿不着急动手,最好还是先分析一下需求,其要点是老用户和新用户有什么区别?同时是否涉及批量操作(如给老用户群发站短属于批量操作,而某特定优惠必须当前用户是老用户才能用则不属于批量操作)。

很多时候这个新老用户只是显示上的区分,没有什么本质的变化,或者说总是应用在当前登录者自身,此时你根本没必要增加一个 user_type 字段,直接判断当前用户的create_time - time()是否大于142460*60就足够用了。

如果确实需要该功能也不需要过于担心,还是注意细节:
1- 首次更新是针对所有数据的,一条update语句搞定,你早晨早来一会儿在数据库上直接执行一下就行了(请再三确认语句正确),比你想象的快得多。
2- 定时更新: 注意,你每次仅需要针对 user_type = new and create_time < ... 的用户执行检查,而不是所有人,因此不存在性能问题。最近14天难道能注册10万人?user_type和create_time字段应该进行索引,这也是提高效率必须的。


你可以评估一下你的数据库增量,因为其实你可以每天将今天变成老用户的修改一下,这样子筛选的数据量会大幅度降低


直接根据创建时间批量更新,一条语句执行完毕,每天定时执行即可,
当前时间 - (创建时间+86400*14)< 0 表示新用户

UPDATE user SET user_type = 'old' WHERE (unix_timestamp(now()) - (create_time+86400*14)) < 0;

【热门文章】
【热门文章】