MySQL-mysql进程间通信- 外加–内存表效率问题?

MySQL-mysql进程间通信- 外加–内存表效率问题?

想挽留 发布于 2016-10-30 字数 823 浏览 1308 回复 2

请问下,当添加数据到mysql数据库中,触发触发器,mysql有什么机制通知并将数据传递给处理进程(例如这个进程是用c语言实现的处理代码)。

这个问题是这样的,我有一个数据抓取进程,抓取是动态的,可能瞬间有大量的数据包到来,可能有时候没有数据,同时另外有一个数据进程,因为处理的速率比较慢,所以需要将抓取的数据进行缓存,然后当缓冲区有数据的时候,逐条处理。使用mysql数据库并接合触发器可以不必开销一个大的内存表(因为数据比较多),但是如上面那个问题,我不知道如何用mysql实现。

我就采用了内存表的方式,抓取的数据写入内存,然后利用进程间通信(共享内存接合条件变量),开始我使用了一个队列,抓取进程不断写队列,如果满了,就覆盖比较老的数据。而处理进程当队列中有数据的时候就进行读取处理。但是老师说最好使用游标 接合 hash的方式来实现,请问大家这类问题一般如何高效的实现?
实现?我找到的很少资料。

谢谢各位。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

虐人心 2017-04-29 2 楼

根据你所描述的,应该不需要实时处理,异步处理的话可以这么做吧,相对来说用队列比较高效、实时性比较好。

一、把数据记录成SQL语句
1.将抓取到的数据转换成SQL语句,然后直接写入文件,文件名可以按小时或更小单位,如yyyymmddhh.log
2.写个crontab定时做mysql导入

二、把数据记录成表字段对应,按TAB键分割。跟第一种类似
1.将抓取到的数据转换成表字段对应,按TAB键分割,一条一条记录,然后直接写入文件,文件名可以按小时或更小单位,如yyyymmddhh.log
2.写个crontab定时做mysqlimport导入

三、如果每个记录内容不是很大的话,采用队列来处理是比较稳定和高效的
1.可以采用rabbitmq 、zeromq等队列服务
2.抓到数据后直接写入队列(可以有多个抓取程序同时写)
3.开启多个进程监听队列,读到一条,就写入MYSQL,写入完成后从队列中干掉

甜柠檬 2016-12-20 1 楼

你这是两个问题吧?
我给你简化一下
1.触发器可以把事件传递后外部程序吗?
触发器仅是数据库内部的应用,与外部程序无关,所以更没有与语言级别的触发器事件交互了。
2.数据的存取工作方式
这个要看你的具体应用了,从你的描述来看,从前端读取数据,然后交给后端程序写入数据库,如果出于效率考虑的话,建议还是在进程内完成,可以参考一下跟随者模式,这种要优于你的进程间通信方式。