Q4M(queue for mysql) 是开源的实现队列功能的mysql存储引擎,目前支持mysql 5.1 以上的版本

它已经内置了对多连接并发的的支持,能保证一个消息只能被同一个connection获取到

参考http://q4m.31tools.com/,现在最新的版本是0.8.9

最近,邮箱有一个活动,需要给登录的用户即时发对应的优惠券

开始使用了传统的方法,从mysql的一个表中通过limit来读取一条记录,并更新

但由于这次活动瞬间并发量比较大,这种方法会造成数据库的堵塞

于是,考虑试试Q4M,使用了其二进制方式安装,安装很简单:

   1. tar zxvf mysql-5.1.41-linux-x86_64-glibc23-with-fast-mutexes-q4m-0.8.9.tar.gz

   2. cd q4m-0.8.9-linux-x86_64

   3. cp support-files/q4m-forward /usr/local/mysql/bin/

   4. cp libqueue_engine.so /usr/local/mysql/lib/plugin/

   5. mysql --socket=/data/mysql/mysql.sock < support-files/install.sql

注意:如果mysql是下载的二进制压缩包,则它默认把with-fast-mutexes已经编译进去了

所以,对应的Q4M的包也需要是with-fast-mutexes-q4m-0.8.9.tar.gz的,而不是 without-fast-mutexes-q4m-0.8.9.tar.gz

如果使用源码编译安装:
   1.tar zxvf q4m-0.9.2.tar.gz
   2../configure --with-mysql=/opt/ysz/src/mysql-5.1.44 --prefix=/usr/local/mysql5.1.44/
   3. 可能会报错:my_global.h:80:23: error: my_config.h: No such file or directory
   4. 首先cd /opt/ysz/src/mysql-5.1.44/;make,然后再
   5. vi /opt/ysz/src/mysql-5.1.44/include/my_global.h
   6. my_config.h修改为config.h
   7. make;make install
   8. /usr/local/mysql5.1.44/bin/mysql --socket=/opt/mydata/my3310/my3310.sock < support-files/install.sql

安装后,即可使用其提供的sql进行查询了

目前,Q4M似乎不支持记录二进制log,所以在insert之前需要把log给关闭,这样造成的后果是:

使用了Q4M后,就无法使用Mysql的Master和Slave机制了

   1. #创建queue引擎的表结构
   2. create table product_detail (productid int,cardid varchar(1000)) ENGINE=queue charset=gbk;
   3. #不记录二进制log
   4. SET SQL_LOG_BIN=0
   5. #使用普通的sql语句插入数据,也可使用load data infile来批量灌入数据
   6. insert into product_detail values(1,'1');
   7. #使用queue_wait来获取productid为2的一条数据,设置超时时间为1秒
   8. select cardid from product_detail where queue_wait('product_detail:productid=2',1);
   9. #处理完成删除刚才获取的那条数据
  10. select queue_end()
  11. #处理完成后也可以不删除对应的数据,而释放对应的数据,它将仍然留在队列中
  12. select queue_abort()