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. this Activity.this Activity.class

    1. this 与 Activity.this this是你当前对象的引用,在你的例子中你肯定在内部类ClickEvent里面实现intent,他指向的是ClickEvent,而不是你要传入的Acti ...

  2. [转]Mybatis3.x与Spring4.x整合

    原文地址:http://www.cnblogs.com/xdp-gacl/p/4271627.html 一.搭建开发环境 1.1.使用Maven创建Web项目 执行如下命令: mvn archetyp ...

  3. Java设计模式(一) 策略模式

    策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 1,定义算法接口 package com.pattern.strategy.test; publ ...

  4. 【BZOJ 4456】【UOJ #184】【ZJOI 2016】旅行者

    http://www.lydsy.com/JudgeOnline/problem.php?id=4456 http://uoj.ac/problem/184 参考(抄)的晨爷的题解(代码) 对矩形进行 ...

  5. Edge Model

    三种edge Step (阶梯) Ramp (坡) Roof 因为噪声的存在, ramp edge是最常见的. 一阶和二阶算子在ramp edge处的表现 一阶和二阶算子对噪声的敏感性 从上自下, 高 ...

  6. swift中的结构体和枚举

    Swift 里的结构体非常特殊. 类是面向对象编程语言中传统的结构单元.和结构体相比,Swift 的类支持实现继承,(受限的)反射,析构函数和多所有者. 既然类比结构体强大这么多,为什么还要使用结构体 ...

  7. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  8. Oracle数据库安装及配置(一)

    http://blog.csdn.net/phacker2010/article/details/7190126 1.安装 Oracle 版本:Oracle Database 10g Release ...

  9. [日常训练]常州集训day2

    T1 Description 给定$N$个点,问这$N$个点能构成的三角形个数. Input 第一行一个整数$N$,代表点数. 接下来$N$行,每行两个非负整数$X,Y$,表示一个点的坐标. Outp ...

  10. Bzoj2007 [Noi2010]海拔

    Time Limit: 20 Sec  Memory Limit: 552 MB Submit: 2380  Solved: 1130 Description YT市是一个规划良好的城市,城市被东西向 ...