MemcacheQ安装及使用方法
一.安装
MemcacheQ是一个简单的分布式队列服务,它的运行依赖于BerkeleyDB和libevent,所以需要先安装BerkeleyDB和libevent.
BerkeleyDB4.7orlater
Downloadfrom
HowtoinstallBerkeleyDB:
$tar-xvzfdb-5.3.21.tar.gz $cddb-5.3.21/ $cdbuild_unix/ $../dist/configure $make $makeinstall
安装BerkeleyDB时,可以手动指定安装路径:
../dist/configure--prefix=/usr/local/berkeleydb
不指定的话,默认安装在:/usr/local/BerkeleyDB.5.3
libevent1.4.xorlater
先检查libevent是否已经安装:
#rpm-qa|greplibevent
libevent-devel-2.0.10-2.fc15.x86_64
libevent-2.0.10-2.fc15.x86_64
libevent-2.0.10-2.fc15.i686
或者:
ls-al/usr/lib|greplibevent
如果还没有安装:
Downloadfrom
Howtoinstalllibevent:
$tar-xvzflibevent-1.4.x-stable.tar.gz $cdlibevent-1.4.x-stable $./configure $make $makeinstall
安装libevent时,可以手动指定安装路径:
./configure--prefix=/usr/local/libevent
不指定的话,默认安装在:/usr/lib64(64位系统)或者/usr/lib(32位系统)
memcacheQ
下载软件包:http://code.google.com/p/memcacheq/downloads/list
解压缩,cd进目录
./configure--enable-threads make makeinstall
configure时,如果libevent不是安装在默认目录,需--with--libevent=/usr/local/libevent指定libevent的安装目录
若没有将
/usr/local/lib
/usr/local/BerkeleyDB.5.3/lib
添加进/etc/ld.so.conf并运行/sbin/ldconfig则需--with-bdb=/usr/local/BerkeleyDB.5.3指定berkeleyDb库的路径
二.使用
启动memcacheQ
使用memcacheq-h的命令来查看命令行选项
启动memcacheq:memcacheq-d-unobody-r-H/tmp/memcacheq-N-R-v-L1024-B1024>/tmp/mq_error.log2>&1
启动时需-u参数,指定运行memcacheQ的用户,且指定的用户必须有数据文件的读写权限,如这里的/tmp/memcacheQ目录,否则不能启动
命令行使用memcacheQ
telnet127.0.0.122202
Trying127.0.0.1…
Connectedto127.0.0.1.
Escapecharacteris‘^]'.
只有两个命令可以在命令行下使用memcacheQ
写对列:
set
STORED\r\n
取出队列:
get
VALUE
END\r\n
与memcache协议基本一致,只是把keyname换成queuename,而且在set的命令中,忽略了expire_time的参数。mq的数据存储是存在berkeleyDB中,做了持久化存储,没有内存的过期时间。
示例:
telnet127.0.0.122202
Trying127.0.0.1…
Connectedto127.0.0.1.
Escapecharacteris‘^]'.
setq4005
hello
STORED
setq4005
world
STORED
statsqueue
STATq42/0
END
getq4
VALUEq405
hello
END
statsqueue
STATq42/1
END
三.安装使用过程中可能出现的错误
1.编译出现错误:checkingforlibrarycontainingdb_create...no
configure:error:cannotfindlibdb.soin/usr/local/BerkeleyDB.5.3/lib
需要修改configure中的BerkeleyDB中的预编译参数vimconfigure找到bdbdir="/usr/local/berkeleydb"改为
bdbdir="/usr/local/BerkeleyDB.5.3"再次编译
2.configure:error:cannotfindlibdb.soin/usr/local/BerkeleyDB.5.3/lib
出现此错误的原因在于没有安装BerkyleyDb,安装即可
3./usr/local/memcacheq/bin/memcachq-h
运行报:
memcacheq:errorwhileloadingsharedlibraries:libdb-5.3.so:cannotopensharedobjectfile:Nosuchfileordirectory
解决方法:ln-s/usr/local/BerkeleyDB.5.3/lib/libdb-5.3.so/usr/lib/libdb-5.3.so
注:在64位操作系统中,需执行
ln-s/usr/local/BerkeleyDB.5.3/lib/libdb-5.3.so/usr/lib64/libdb-5.3.so
使用memcacheq做异步队列,做个简单的生产者-消费者模型。生产者将数据写入mq中,消费者异步去队列中去取数据,进而进一步的消费处理数据。
#!/usr/bin/envpython #-*-coding:utf8-*- importsys importtime importrandom importmemcache mc=memcache.Client(["%s:%s"%("127.0.0.1","22202")]) queue_name="q1" defputter(): count=0 whileTrue: data="hello%d"%(count) mc.set(queue_name,data) print"put",data count+=1 time.sleep(random.randint(1,10)) defprocess_data(data): print"processingdata:",data defgetter(): whileTrue: data=mc.get(queue_name) ifdata: process_data(data) else: print"nomessage,sleepforawhile..." time.sleep(30) if__name__=="__main__": iflen(sys.argv)!=2: print"Wrongargnumbers" else: cmd=sys.argv[1] ifcmd=="put":putter() elifcmd=="get":getter() else:print"wrongcmd"
在使用时,开两个终端模拟两个进程,在一个终端中运行
pythonmqdemo.pyput
来模拟生产者;另一个终端中运行
pythonmqdemo.pyget
模拟消费者。