MemcacheQ介绍
队列(Queue)是一种常用的数据结构。在队列这种数据结构中,最先插入的元素将会最先被取出;反之最后插入的元素将会最后被取出,因此队列又称为“先进先出”(FIFO:First In First Out)的线性表。
加入元素的一端叫“队尾”,取出元素的一端叫“队头”。利用消息队列可以很好地异步处理数据的传送和存储,当遇到频繁且密集地向后端数据库中插入数据时,就可采用消息队列来异步处理这些数据写入。
MemcacheQ是一款基于Memcache协议的开源消息队列服务软件,由于其遵循了Memcache协议,因此开发成本很低,不需要学习额外的知识便可轻松掌握。
我在最近的一个项目中也应用了MemcacheQ,下面我将分享一下MemcacheQ在Linux中的编译和安装过程。
首先,MemcacheQ依赖于BerkeleyDB和Libevent,如果服务器中曾经安装过Memcached,那么Libevent应该已经存在了,否则就需要先下载安装Libevent。
下载链接如下:
Libevent:https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
Berkeley DB:http://download.oracle.com/otn/berkeley-db/db-6.2.23.tar.gz
MemcacheQ:https://github.com/stvchu/memcacheq
MemcacheQ特点
1.简单高效,基于memcache协议,这意味着只要客户端支持memcache协议即可使用。
2.队列数据存储于BDB,持久保存。
3.并发性能好。
4.支持多条队列。
memcacheQ依赖于Berkeley DB和libevent。Berkeley DB用于持久化存储队列的数据,避免在memcacheq崩溃或这服务器当掉时候,不至于数据丢失。对于并发量较高的web环境,特别是数据库写入操作过多的情景,使用队列可大大缓解因并发问题造成的数据库锁死问题。
memcacheQ最大的优势是:它是基于Memcached开发的,可以通过各种Memcached命令对它进行操作。基于Memcached开发的应用完全不需要做任何修改。
启动MemcacheQ
MemcacheQ常用参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-p #TCP监听端口(default: 22201). -U #UDP监听端口(default: 0,off). -s #unix socket路径(不支持网络). -a #unix socket访问掩码(default 0700). -l #监听网卡. -d #守护进程. -r #最大化核心文件限制. -u #以用户身份运行(only when run as root). -c #最大并发连接数(default is 1024). -v #详细输出 (print errors/warnings while in event loop). -vv #更详细的输出 (also print client commands/reponses). -i #打印许可证信息. -P #PID文件. -t #线程数(default 4). |
Berkerledb常用参数
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-m #BerkeleyDB内存缓存大小,default is 64MB. -A #底层页面大小,default is 4096, (512B ~ 64KB, power-of-two). -H #数据库家目录,default is '/data1/memcacheq'. -L #日志缓冲区大小,default is 32KB. -C #多少秒checkpoint一次,0 for disable, default is 5 minutes. -T #多少秒memp_trickle一次,0 for disable, default is 30 seconds. -S #多少秒queue stats dump一次,0 for disable, default is 30 seconds. -e #达到缓存百分之多少需要刷新,default is 60%. -E #一个单一的DB文件有多少页,default is 16*1024, 0 for disable. -B #指定消息体的长度,单位字节,default is 1024. -D #多少毫秒做一次死锁检测(deadlock detecting),0 for disable, default is 100ms. -N #开启DB_TXN_NOSYNC获得巨大的性能改善,default is off. -R #自动删除不再需要的日志文件,default is off. |
创建数据目录
1 2 |
$ mkdir /data/memcacheq/11311/{db,log} -p $ chown -R nobody.nobody /data/memcacheq/ |
启动memcacheq
1 2 |
$ /usr/local/memcacheq/bin/memcacheq -d -unobody -r -l 127.0.0.1 -p11311 -H /data/memcacheq/11311/db -N -R -v -L 1024 -B 1024 \ -P/data/memcacheq/11311/memcacheq.pid > /data/memcacheq/11311/log/mcq_error.log 2>&1 |
测试MemcacheQ
1.使用mcq时只需要用到两个命令:set和get
1 2 3 4 5 6 7 |
set <queue name> <flags> 0 <message_len> <put your message body here> STORED get <queue name> VALUE <queue name> <flags> <message_len> <your message body will come here> END |
测试
1 2 3 4 5 6 7 8 9 10 |
$ telnet 127.0.0.1 11311 set queue 0 0 3 abc STORED get queue VALUE queue 0 3 abc END get queue_test END |
可以看到,和memcache协议基本一致,只是把key name换成queue name,而且在set的命令中,忽略了expire_time的参数。毕竟mq的数据存储是存在berkeleyDB中,做了持久化存储,没有内存的过期时间。当使用set命令时,就向指定的消息队列中写入了一条新消息,也就是向BerkeleyDB中新insert了一条数据,当使用get命令时,就从指定队列中取出一条新消息,也就是向BerkeleyDB中delete了一条数据。
2.查看统计情况
1 2 |
stats #查看memcacheQ统计情况; stats queue #查看队列统计情况; |
3.删除一个队列
1 |
delete queue |
4.也可以使用db_stat查看一个队列有多少记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ /usr/local/berkeleydb/bin/db_stat -d /data/memcacheq/11311/db/queue Mon Nov 7 18:55:22 2016 Local time 42253 Queue magic number 4 Queue version number 1024 Fixed-length record size 0x20 Fixed-length record pad 4096 Underlying database page size 16384 Underlying database extent size 0 Number of records in the database 0 Number of data items in the database 1 Number of database pages 3072 Number of bytes free in database pages (25% ff) 2 First undeleted record 2 Next available record number |