当前位置: 首页 > 工具软件 > MemcacheQ > 使用案例 >

MemcacheQ学习总结

朱鹏
2023-12-01
  1. memcacheq 应用背景及特点

        由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达mysql,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too manyconnections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。持久化消息队列memcacheq(简称mcq)是一个轻量级的消息队列。mcq依赖于Berkeley DB和libevent。Berkeley DB用于持久化存储队列的数据,避免在mcq崩溃或这服务器当掉时候,不至于数据丢失。

    memcacheq特点:

    1.damn simple (简单易用)
    2.very fast    (处理速度快)
    3.multiple queue (多条队列)
    4.concurrent well (并发性能好)
    5.memcache protocol compatible (与memcache的协议兼容)

    使用场景:高并发、数据可以弱一致性

  2. 安装

    安装过程不再赘述,注意必须先安装libevent ,  berkeleyDB.

    (最好使用yum安装,稳定性和兼容性可以得到保证, libevent 需要1.4.x更高的版本)

  3. 启动

    memcacheq -d -r -u root -p22201 -H /data1/memcacheq -N -R -v -L 1024 -B 1024 > /data1/memcacheq/mcq_error.log 2>&1

  4. 使用 memcached -h 查看命令行选项:

    --------------------MemcacheQ Options-------------------------------

     -p <num> TCP监听端口(default: 22201)
     -U <num> UDP监听端口(default: 0, off)
     -s <file> unix socket路径(不支持网络)
     -a <mask> unix socket访问掩码(default 0700)
     -l <ip_addr> 监听网卡
     -d 以守护进程方式运行
     -r 最大化核心文件限制
     -u <username> 以用户身份运行(only when run as root)
     -c <num> 最大并发连接数(default is 1024)
     -v 详细输出 (print errors/warnings while in event loop)
     -vv 更详细的输出 (also print client commands/reponses)
     -i 打印许可证信息
     -P <file> PID文件
     -t <num> 线程数(default 4)
     --------------------BerkeleyDB Options-------------------------------
     -m <num> BerkeleyDB内存缓存大小, default is 64MB
     -A <num> 底层页面大小, default is 4096, (512B ~ 64KB, power-of-two)
     -H <dir> 数据库家目录, default is '/data1/memcacheq'
     -L <num> 日志缓冲区大小, default is 32KB
     -C <num> 多少秒checkpoint一次, 0 for disable, default is 5 minutes
     -T <num> 多少秒memp_trickle一次, 0 for disable, default is 30 seconds
     -S <num> 多少秒queue stats dump一次, 0 for disable, default is 30 seconds
     -e <num> 达到缓存百分之多少需要刷新, default is 60%
     -E <num> 一个单一的DB文件有多少页, default is 16*1024, 0 for disable
     -B <num> 指定消息体的长度,单位字节, default is 1024
     -D <num> 多少毫秒做一次死锁检测(deadlock detecting), 0 for disable, default is 100ms
     -N 开启DB_TXN_NOSYNC获得巨大的性能改善, default is off
     -R 自动删除不再需要的日志文件, default is off

  5. 常用命令

       命令: set, get, stats queue, delete

       写队列:

      set <queue name> <flags> 0 <message_len>\r\n

        <put your message body here>\r\n

     STORED\r\n

     取队列:

    get <queue name>\r\n

    VALUE <queue name> <flags> <message_len>\r\n

    <your message body will come here>\r\n

    END\r\n


可以看到,和memcache协议基本一致,只是把key name换成queue name,而且在set的命令中,忽略了expire_time的参数。毕竟mcq的数据存储是存在berkeleyDB中,做了持久化存储,没有内存的过期时间。


当使用set命令时,就向指定的消息队列中写入了一条新消息,也就是向BerkeleyDB中新insert了一条数据,当使用get命令时,就从指定队列中取出一条新消息,也就是向BerkeleyDB中delete了一条数据。当使用stats查看一个指定队列时,可以看到这个队列一共接收了多少消息,其中被取出了多少条。


5. 可能出现的问题

<1>运行: /usr/local/memcacheq/bin/memcacheq -h  错误信息:/usr/local/memcacheq/bin/memcacheq: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory

解决方法:ln -s /usr/local/memcacheq/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2

注: 64位操作系统,需执行 ln -s /usr/local/memcacheq/lib/libevent-1.4.so.2 /usr/lib64/libevent-1.4.so.2


<2> 提示错误信息: memcacheq: error while loading shared libraries: libdb-5.0.so: cannot open shared object file: No such file or directory

解决办法:

在/usr/lib 下建个 libdb-5.0.so 软链就OK啦

ln -s /usr/local/BerkeleyDB.5.0/lib/libdb-5.0.so /usr/lib/


6. 关闭memcacheQ

找到memcacheq的进程杀掉 kill -9, ps -ef |grep memcacheq


7.实例

Xshell:\> telnet 127.0.0.1  22201
stats queue                
END
set test_queue 0 0 2    //队列添加一条消息
12
STORED
set test_queue 0 0 2    
34
STORED
get test_queue             //从队列中取出一条消息
VALUE test_queue 0 2
12
END
stats queue
STAT test_queue 2/1    //队列中有2条消息,已取出一条
END
delete test_queue        //删除队列
DELETED
stats queue
END



 类似资料: