Memcached服务端安装
ymc4
10年前
libevent安装
cd /tmp wget http://monkey.org/~provos/libevent-1.4.14b-stable.tar.gz tar -zxf libevent-1.4.14b-stable.tar.gz cd libevent-1.4.14b-stable ./configure --prefix=/opt/libevent/ make make install
Memcached安装
cd /tmp wget -N http://www.memcached.org/files/memcached-1.4.17.tar.gz tar -zxf memcached-1.4.17.tar.gz cd memcached-1.4.17 ./configure --prefix=/opt/memcached --enable-64bit --with-libevent=/opt/libevent make make install
编写Memcached启动脚本
vi /etc/init.d/memcached #!/bin/sh # chkconfig: - 50 50 # description: memcached # 以下要自己配置 CMD=/opt/memcached/bin/memcached MEMORY=128 USER=root HOST=master PORT=11211 CONNECTION=32 PID=/tmp/memcached.pid start() { echo -n $"memcached starting... " $CMD -d -m $MEMORY -u $USER -l $HOST -p $PORT -c $CONNECTION -P $PID echo } stop() { echo -n $"memcached shutting down... " kill `cat $PID` echo } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit 0
将memcached加入系统启项
chmod +x /etc/init.d/memcached chkconfig --add /etc/init.d/memcached chkconfig --level 35 memcached on chkconfig --level 35 iptables off
启动Memcached
/opt/memcached/bin/memcached -d -m 128 -u root -l master -p 11211 -c 32 -P /tmp/memcached.pid service memcached restart
基于上面,其他一些选项的含义
-d 指定memcached进程作为一个守护进程启动 -m <num> 指定分配给memcached使用的内存,单位是MB -u <username> 运行memcached的用户 -l <ip_addr> 监听的服务器IP地址,如果有多个地址的话,使用逗号分隔,格式可以为“IP地址:端口号”,例如:-l 指定192.168.0.184:19830,192.168.0.195:13542;端口号也可以通过-p选项指定 -p <num> Memcached监听的端口,要保证该端口号未被占用 -c <num> 设置最大运行的并发连接数,默认是1024 -R <num> 为避免客户端饿死(starvation),对连续达到的客户端请求数设置一个限额,如果超过该设置,会选择另一个连接来处理请求,默认为20 -k 设置锁定所有分页的内存,对于大缓存应用场景,谨慎使用该选项 -P 保存memcached进程的pid文件 -s <file> 指定Memcached用于监听的UNIX socket文件 -a <perms> 设置-s选项指定的UNIX socket文件的权限 -U <num> 指定监听UDP的端口,默认11211,0表示关闭 -M 当内存使用超出配置值时,禁止自动清除缓存中的数据项,此时Memcached不可以,直到内存被释放 -r 设置产生core文件大小 -f <factor> 用于计算缓存数据项的内存块大小的乘数因子,默认是1.25 -n 为缓存数据项的key、value、flag设置最小分配字节数,默认是48 -C 禁用CAS -h 显示Memcached版本和摘要信息 -v 输出警告和错误信息 -vv 打印信息比-v更详细:不仅输出警告和错误信息,也输出客户端请求和响应信息 -i 打印libevent和Memcached的licenses信息 -t <threads> 指定用来处理请求的线程数,默认为4 -D <char> 用于统计报告中Key前缀和ID之间的分隔符,默认是冒号“:” -L 尝试使用大内存分页(pages) -B <proto> 指定使用的协议,默认行为是自动协商(autonegotiate),可能使用的选项有auto、ascii、binary。 -I <size> 覆盖默认的STAB页大小,默认是1M -F 禁用flush_all命令 -o <options> 指定逗号分隔的选项,一般用于用于扩展或实验性质的选项
停止Memcached
ps -ef | grep memcached kill -9 <PID>
Java客户端 - XMemcached客户端
spring.xml
<!-- 启动参数加入 -Dxmemcached.jmx.enable=true 可启动jmx支持 --> <!-- 监控端可通过service:jmx:rmi:///jndi/rmi://host:7077/xmemcachedServer连接监控 --> <bean name="memcachedClient" class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"> <!-- servers节点列表格式 主节点1:port,主节点1备份:port 主节点2:port,主节点2备份:port --> <!--可以不设置备份节点,主备节点都好分割,不同的主备分组用空格分隔 --> <property name="servers"> <value>${cache.memcacheHost}</value> </property> <!-- 权重 --> <property name="weights"> <list> <value>${cache.memcacheHostWeights1}</value> </list> </property> <!-- 开启sasl验证需要配置此部分 --> <!-- <bean name="server1" class="java.net.InetSocketAddress"> <constructor-arg> <value>host1</value> </constructor-arg> <constructor-arg> <value>port1</value> </constructor-arg> </bean> <property name="authInfoMap"> <map> <entry key-ref="server1"> <bean class="net.rubyeye.xmemcached.auth.AuthInfo" factory-method="typical"> <constructor-arg index="0"> <value>cacheuser</value> </constructor-arg> <constructor-arg index="1"> <value>123456</value> </constructor-arg> </bean> </entry> </map> </property> --> <!-- nio线程数最好是cpu核数-1 --> <property name="connectionPoolSize"> <value>${cache.memcacheConnectionPoolSize}</value> </property> <!--默认超时时间 --> <property name="opTimeout"> <value>${cache.opTimeout}</value> </property> <!-- 使用二进制保存 --> <property name="commandFactory"> <!-- <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"></bean> --> <bean class="net.rubyeye.xmemcached.command.TextCommandFactory"></bean> </property> <!-- 分布式hash一致策略 --> <property name="sessionLocator"> <bean class="net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator"></bean> </property> <!-- 序列化转换 --> <property name="transcoder"> <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" /> </property> <!-- buffer分配策略 --> <property name="bufferAllocator"> <bean class="net.rubyeye.xmemcached.buffer.SimpleBufferAllocator"></bean> </property> <!-- 在hash一致模式下节点失败路由到下一节点,关闭快速失败模式 --> <property name="failureMode" value="false" /> </bean>