我有一个MySQL表“number_records”,有超过1000万条目。该表具有以下结构。
id | number | cat_id | dialed | uuid |
1 | 2123727345 | 148 | 0 | |
2 | 2123727346 | 148 | 0 | |
3 | 212372737 | 147 | 0 | |
我有两个进程具有相同的cat_id(148),但使用上表同时使用不同的UUID来获取数字。
第一个过程 uuid = abcd-efgh-12345-78908
第二个过程 uuid = zxcv-qwrt-uuuu-kklll
我希望每个进程只获得一个唯一的数字,并在处理后将其拨号状态设置为“1”。 (两个进程都没有相同的数字)
我在每个进程中的三个查询中执行上述操作,以便每个进程只获得一个唯一编号。
第一个过程。
update numbers_records set uuid = 'abcd-efgh-12345-78908' where cat_id = 148 and dialed = 0 and uuid = "";
select number from numbers_records where uuid = 'abcd-efgh-12345-78908' and dialed = 0 and cat_id = 148;
update numbers_records set dialed = 1 where uuid ='abcd-efgh-12345-78908' and cat_id = 148 and dialed = 0;
对于第二个过程。
update numbers_records set uuid = 'zxcv-qwrt-uuuu-kklll' where cat_id = 148 and dialed = 0 and uuid = "";
select number from numbers_records where uuid = 'zxcv-qwrt-uuuu-kklll' and dialed = 0;
update numbers_records set dialed = 1 where uuid = 'zxcv-qwrt-uuuu-kklll'
此过程运行正常。以上查询确保每个进程获得一个唯一编号。
但是表包含超过1000万条记录。这些查询需要5秒以上。我想加快这个过程。
我的经理让我把桌子上方移到Redis。我很困惑如何转移到桌面上方。
在上述情况下如何使用Redis?
非常感谢任何建议。 最好的祝福。
答案 0 :(得分:0)
看起来您正在使用MySql表作为任务队列。您可以将Redis LIST
与LPOP
或BLPOP
操作一起使用以获取工作人员的下一个任务,并使用HASH
来存储任务信息。此外,如果您需要基于cat_id
的处理,则需要将任务推送到不同的列表:
...
number_records_tasks:147
number_records_tasks:148
...
要同时获取多个任务,请使用此question中的建议。
答案 1 :(得分:0)
由于您没有删除此表中的条目,因此任何基于队列结构的解决方案都不会相同 - 在处理队列中的项目后您将丢失它。
你唯一能做的就是在MySQL表上添加其他机制来处理工作队列(redis list,rabbitmq,beanstalkd)。
在我看来,你应该首先检查其他解决方案,它们可能更容易实现: