Memcached是一种高性能的分布式内存对象缓存系统(memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能,其“分布式”由客户端函数库完成,成熟算法的为一致性Hash),用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。很多大型网站都使用了Memcached做缓存。MemCache依赖于libevent,后者是一个基于事件触发的网络库。

下面介绍Linux下MemCache数据库的安装和使用。

  libevent版本:libevent-2.0.22-stable.tar.gz

  MemCache版本:memcached-1.4.29.tar.gz

1、安装libevent

//make install后会在==prefix指定的地方产生 bin、include、lib 文件夹

[root@localhost src]# tar -zxvf libevent-2.0.-stable.tar.gz
[root@localhost src]# cd libevent-2.0.-stable
[root@localhost libevent-2.0.-stable]# ./configure --prefix=/usr/local/libevent
[root@localhost libevent-2.0.-stable]# make
[root@localhost libevent-2.0.-stable]# make install

2、安装Memcached服务端

//make install后会在==prefix指定的地方产生 bin、include、share 文件夹

[root@localhost src]# tar -zxvf memcached-1.4..tar.gz
[root@localhost src]# cd memcached-1.4.
[root@localhost memcached-1.4.]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
[root@localhost memcached-1.4.]# make
[root@localhost memcached-1.4.]# make install

3、启动

[root@localhost /] /usr/local/memcached/bin/memcached -d -m  -u root -p  -c  -P /tmp/memcached.pid

选项说明:(更多参考 简单之美的博客 )

    -d:选项是启动一个守护进程,
-m:是分配给Memcache使用的内存数量,单位是MB,默认是64 MB.
-M:内存耗尽时返回错误而并非删除条目.
-u:是运行Memcache的用户.
-l:是监听的服务器IP地址,我这里没有填.
-p:是设置Memcache tcp监听的端口,默认是11211.
-c:选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定.
-P:是设置保存Memcache的pid文件.
-vv:打印客户端的请求和返回信息.
-i:打印memcached和libevent的版权信息
-h:查看选项说明

运行 telnet localhost  能连上则说明启动成功

4、命令行操作

4.1 基本常用操作

(更多可参考:简单之美的博客MemCache常用命令及使用说明

先:telnet localhost
写:set time
读:get time
查看状态:stats
pid Memcached 进程ID
uptime Memcached 运行时间,单位:秒
time Memcached 当前的UNIX时间
version Memcached 的版本号
rusage_user 该进程累计的用户时间,单位:秒
rusage_system 该进程累计的系统时间,单位:秒
curr_items Memcached 当前存储的内容数量
total_items Memcached 启动以来存储过的内容总数
bytes Memcached 当前存储内容所占用的字节数(*//=mb)
curr_connections 当前连接数量
total_connections Memcached 运行以来接受的连接总数
connection_structures Memcached 分配的连接结构的数量
cmd_get 查询请求总数
cmd_set 存储(添加/更新)请求总数
...
get_hits 查询成功获取数据的总次数
get_misses 查询成功未获取到数据的总次数
bytes_read Memcached 从网络读取到的总字节数
bytes_written Memcached 向网络发送的总字节数
limit_maxbytes Memcached 在存储时被允许使用的字节总数
退出telnet:quit

4.2 列出所有key

4.2.1 方法

先用  stats items  得到所有item的id;再用  stats cachedump item_id   得到item的key;最后可以根据key得到value。示例如下:(参考资料:http://www.darkcoding.net/software/memcached-list-all-keys/

stats items
STAT items::number //The first number after ‘items’ is the slab id. the value after 'number' is the pairs of K/V in the slab.
......
STAT items::crawler_items_checked
STAT items::lrutail_reflocked
END stats cachedump //Request a cache dump for each slab id, with a limit for the max number of keys to dump. dump all key in the corresponding slab when it's 0
ITEM beijing_car_distribution [ b; s]
END get beijing_car_distribution
VALUE beijing_car_distribution
[{"region":"881,1731","count":},{"region":"874,1730","count":}
......"count":}]
END

4.2.2 命令

host=192.168.6.135
port=
num=`echo 'stats items' |nc $host $port |grep number |tail -n1 | grep -o ":[0-9]\+" |grep -o "[0-9]\+" `
for ((i=;i<=$num;i++))
do
echo
echo
echo 'slab '$i
echo 'stats cachedump '$i'' | nc $host $port
done

4.2.3 其他组合命令

得到 items:id:number xx 列表: echo 'stats items' |nc 192.168.6.135 |grep number

得到某个itemid的所有K/V pair: echo stats cachedump | nc 192.168.6.135

4.3 各命令行具体用法

5、代码操作

通过代码操作MemCache,常用的Java客户端有:spymemcached客户端(Java)、XMemcached客户端(Java)、Nodejs等。(具体可参考:简单之美的博客

以XMemcached为例:

 /**
*
*/
package cn.edu.buaa.act.test.TestMemcache; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map; import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.command.BinaryCommandFactory;
import net.rubyeye.xmemcached.impl.KetamaMemcachedSessionLocator;
import net.rubyeye.xmemcached.utils.AddrUtil; /**
* @author zsm
*
*/
public class MemcacheTest {
private final int bucket = 1000;
private MemcachedClient mcClient1;
private MemcachedClient mcClient2; public MemcacheTest(String memAddr1, String memAddr2) {
try { MemcachedClientBuilder mcbuilder = new XMemcachedClientBuilder(AddrUtil.getAddresses(memAddr1));
mcbuilder.setSessionLocator(new KetamaMemcachedSessionLocator());
mcbuilder.setCommandFactory(new BinaryCommandFactory());
mcbuilder.setConnectionPoolSize(1);
mcbuilder.setFailureMode(false);
mcClient1 = mcbuilder.build(); mcbuilder = new XMemcachedClientBuilder(AddrUtil.getAddresses(memAddr2));
mcbuilder.setSessionLocator(new KetamaMemcachedSessionLocator());
mcbuilder.setCommandFactory(new BinaryCommandFactory());
mcbuilder.setConnectionPoolSize(1);
mcbuilder.setFailureMode(false);
mcClient2 = mcbuilder.build(); System.out.printf(Thread.currentThread().getName() + "||: mcClient1 create instance: %s %s %s\n",
this.getClass().hashCode(), memAddr1, memAddr2);
} catch (Exception e) {
e.printStackTrace();
}
} public void Set(String key, String value) {
try {
mcClient1.set(key, 0, value);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
mcClient2.set(key, 0, value);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} private String Get(String key) {
try {
return mcClient1.get(key);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
return mcClient2.get(key);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} private Map<String, Object> Get(ArrayList<String> keys) {
try {
Map<String, Object> res = new HashMap<String, Object>();
Map<String, Object> tmp = null;
int keysLen = keys.size();
if (keysLen > bucket) {
ArrayList<String> keyPart = new ArrayList<String>();
for (int i = 0; i < keysLen; i++) {
keyPart.add(keys.get(i));
if (keyPart.size() == bucket || i == keysLen) {// 分批请求
if ((tmp = mcClient1.get(keyPart)) == null) {// 请求
tmp = mcClient2.get(keyPart);
}
res.putAll(tmp);
keyPart.clear();
}
}
} else {
if ((res = mcClient1.get(keys)) == null) {
res = mcClient2.get(keys);
}
}
return res.size() > 0 ? res : null;
} catch (Throwable e) {
System.out.println(e.getMessage());
return null;
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
MemcacheTest mt = new MemcacheTest("192.168.6.135:11211", "192.168.6.136:11211");
mt.Set("zsmtime", new SimpleDateFormat("yyyyMMdd_hhMMssSS").format(System.currentTimeMillis()));
System.out.println(mt.Get("967790142906obd")); }
}

相关Maven依赖:

        <dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.0.</version>
</dependency>

6、参考资料

http://shiyanjun.cn/archives/873.html#highlighter_567286

Linux下Memcache 安装和使用的更多相关文章

  1. Linux 下memcache安装及使用

    memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.据说官方所说,其用户包括twitter.digg.flickr等,都是些互联网大腕呀.目前用memca ...

  2. linux下memcache安装

    安装配置 1. 安装libevent # tar zxf libevent-1.4.6-stable.tar.gz # cd libevent-1.4.6-stable # ./configure # ...

  3. Linux下php安装memcache

    Linux下php安装memcache说明:php安装目录:/phpstudy/server/php/bin/phpphp.ini配置文件路径:/phpstudy/server/php/etc/php ...

  4. Linux下Memcache服务器端的安装

    最近在研究怎么让Discuz!去应用Memcache去做一些事情,记录下Memcache安装的过程. Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版 ...

  5. Linux下memcached安装和启动方法

    Linux下memcached安装和启动方法 1. 首先下载memcached 和 libevent 包. Memcached用到了libevent这个库用于Socket的处理.下面是下载的两个包文件 ...

  6. Windows下memcache安装使用

    Windows下Memcache安装 随着时间的推移,网上现在能找到的在 Windows下安装 Memcache 的文档大多已经过时.雪峰这里再简要介绍一下当下最新版的安装和配置方法. Memcach ...

  7. Linux下php安装phpredis

    说明:php安装目录:/usr/local/php5php.ini配置文件路径:/usr/local/php5/etc/php.iniNginx安装目录:/usr/local/nginxNginx网站 ...

  8. Linux下yum安装MySQL

    写这篇文章的原因是:在刚开始使用Linux操作系统时想要搭建LAMP环境,于是开始在Google和百度上各种寻找资料,碰到了不是很多的问题后,我决定写这篇文章总结一下在Linux下yum安装MySQL ...

  9. LINUX下编译安装PHP各种报错大集合

    本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...

随机推荐

  1. php csv导出

    /** * 下载csv * @param unknown $orders_id * @param unknown $orders_date_start * @param unknown $orders ...

  2. mycat 9066管理端口 常用命令

    1.连接mycat 9066管理端口 命令:mysql -uroot -proot -P9066 -h127.0.0.1 -u:用户名 -p:密码 -P:端口 -h:ip地址例:linux路径切换到m ...

  3. 强连通 HDU 1269

    n点m边 求是否能从任意a->b b->a 强连通分量等于1 #include<stdio.h> #include<algorithm> #include<s ...

  4. Maven 库

    mvnrepository    https://mvnrepository.com/ 最方便查询的库 <repositories> <repository> <id&g ...

  5. Maven-setting.xml详解

    settings.xml对于maven来说相当于全局性的配置,用于所有的项目,当Maven运行过程中的各种配置,例如pom.xml,不想绑定到一个固定的project或者要分配给用户时,我们使用set ...

  6. Linux命令:修改文件权限命令chmod、chgrp、chown的区别

    chmod是更改文件的权限 chown是改改文件的属主与属组 chgrp只是更改文件的属组. (1)chmod是修改文件/目录的权限.可以有文字修改和数字修改. #chmod 777 /home/be ...

  7. 【转】HTTP中的长连接和短连接分析

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...

  8. 【caffe】无法找到gpu/mxGPUArray.h: No such file or directory

    @tags: caffe 问题出现在,windows下编译caffe的过程中.按照github.com/microsoft/caffe的readme配置的. 问题原因是,用的matlab版本较新(20 ...

  9. 新建的SQL Server账号无法使用跟踪功能

    如题,出现了如下图所示: 在IDE中,死活找不到哪里可以设置,最终发现,这功能只能用语句实现: GRANT ALTER TRACE TO 用户名 搞定,特此记录一下.

  10. 深入解析direct path read (转)

    文章转自:http://www.itpub.net/thread-1815281-1-1.html 传统读取数据的方式是服务器进程通过读取磁盘,然后把数据加载到共享内存中,这样后面的进程就可以通过共享 ...