如何将mysql表转换为redis

时间:2016-08-07 19:10:40

标签: mysql redis

我有一个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”。 (两个进程都没有相同的数字)

我在每个进程中的三个查询中执行上述操作,以便每个进程只获得一个唯一编号。

第一个过程。

  1. update numbers_records set uuid = 'abcd-efgh-12345-78908' where cat_id = 148 and dialed = 0 and uuid = "";

  2. select number from numbers_records where uuid = 'abcd-efgh-12345-78908' and dialed = 0 and cat_id = 148;

  3. update numbers_records set dialed = 1 where uuid ='abcd-efgh-12345-78908' and cat_id = 148 and dialed = 0;

  4. 对于第二个过程。

    1. update numbers_records set uuid = 'zxcv-qwrt-uuuu-kklll' where cat_id = 148 and dialed = 0 and uuid = "";

    2. select number from numbers_records where uuid = 'zxcv-qwrt-uuuu-kklll' and dialed = 0;

    3. update numbers_records set dialed = 1 where uuid = 'zxcv-qwrt-uuuu-kklll'

    4. 此过程运行正常。以上查询确保每个进程获得一个唯一编号。

      但是表包含超过1000万条记录。这些查询需要5秒以上。我想加快这个过程。

      我的经理让我把桌子上方移到Redis。我很困惑如何转移到桌面上方。

      在上述情况下如何使用Redis?

      非常感谢任何建议。 最好的祝福。

2 个答案:

答案 0 :(得分:0)

看起来您正在使用MySql表作为任务队列。您可以将Redis LISTLPOPBLPOP操作一起使用以获取工作人员的下一个任务,并使用HASH来存储任务信息。此外,如果您需要基于cat_id的处理,则需要将任务推送到不同的列表:

... number_records_tasks:147 number_records_tasks:148 ...

要同时获取多个任务,请使用此question中的建议。

答案 1 :(得分:0)

由于您没有删除此表中的条目,因此任何基于队列结构的解决方案都不会相同 - 在处理队列中的项目后您将丢失它。

你唯一能做的就是在MySQL表上添加其他机制来处理工作队列(redis list,rabbitmq,beanstalkd)。

在我看来,你应该首先检查其他解决方案,它们可能更容易实现: