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 安装和使用的更多相关文章
-
Linux 下memcache安装及使用
memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度.据说官方所说,其用户包括twitter.digg.flickr等,都是些互联网大腕呀.目前用memca ...
-
linux下memcache安装
安装配置 1. 安装libevent # tar zxf libevent-1.4.6-stable.tar.gz # cd libevent-1.4.6-stable # ./configure # ...
-
Linux下php安装memcache
Linux下php安装memcache说明:php安装目录:/phpstudy/server/php/bin/phpphp.ini配置文件路径:/phpstudy/server/php/etc/php ...
-
Linux下Memcache服务器端的安装
最近在研究怎么让Discuz!去应用Memcache去做一些事情,记录下Memcache安装的过程. Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端,目前的最新版 ...
-
Linux下memcached安装和启动方法
Linux下memcached安装和启动方法 1. 首先下载memcached 和 libevent 包. Memcached用到了libevent这个库用于Socket的处理.下面是下载的两个包文件 ...
-
Windows下memcache安装使用
Windows下Memcache安装 随着时间的推移,网上现在能找到的在 Windows下安装 Memcache 的文档大多已经过时.雪峰这里再简要介绍一下当下最新版的安装和配置方法. Memcach ...
-
Linux下php安装phpredis
说明:php安装目录:/usr/local/php5php.ini配置文件路径:/usr/local/php5/etc/php.iniNginx安装目录:/usr/local/nginxNginx网站 ...
-
Linux下yum安装MySQL
写这篇文章的原因是:在刚开始使用Linux操作系统时想要搭建LAMP环境,于是开始在Google和百度上各种寻找资料,碰到了不是很多的问题后,我决定写这篇文章总结一下在Linux下yum安装MySQL ...
-
LINUX下编译安装PHP各种报错大集合
本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...
随机推荐
-
Silverlight无法启动调试,错误“Unable to start debugging. The Silverlight Developer Runtime is not installed. Please install a matching version.” 解决办法
今天调试Silverlight出现了以下错误: 意思是“无法启动调试,因为Silverlight Developer Runtime没有安装,请安装一个匹配的版本”.但是按Ctrl + F5可以调试运 ...
-
Redis Tools
1. Resources Redis Desktop Manager http://redisdesktop.com/ Redis命令的中文文档 http://redisdoc.com/ Redis安 ...
-
Table AdvanceTable针对表内行禁用multipleSelection , singleSelection
OATableBean table = (OATableBean)webBean.findChildRecursive("LineTable"); table.setInserta ...
-
php框架Symfony资料
1.http://snippets.symfony-project.org/snippets/tagged/criteria/order_by/date 2.Propel API: http://ap ...
-
excel导入 导出 兼容各个版本服务器不装EXCEL也可以
给出 demo源码: http://pan.baidu.com/s/1hqGMudY 提取码:pw4n首先要引用 NPOI.dll (可在网上下载!) //导入 public void OnSubmi ...
-
IT痴汉的工作现状13-吓唬电话
那是一个普通的周末上午,稍微阴沉的天,使得暑气消退了好多.刚吃过早饭,我懒懒的浏览着CSDN论坛上有趣的问题和答案. 突然电话响起.是一个陌生的号码.我像往常一样接起电话,""您好 ...
-
c# 图片插入Excel
引用COM:Microsoft Office 11.0 Object Library 引用类: using System; using System.Windows.Forms; u ...
-
Excel两列查找重复值
判断A列的值在B列是否存在,如果存在则输出“yes” 在C1单元格使用如下公式: =IF(COUNTIF(A:A,B2)>0,"yes","")
-
C++ vc中怎么使用SendMessage自定义消息函数
vc中怎么使用SendMessage自定义消息函数: SendMessage的基本结构如下:SendMessage( HWND hWnd, //消息传递的目标窗口或线程的句柄. UINT ...
-
swift - 高斯模糊
/* case extraLight case light case dark @available(iOS 10.0, *) case regular @available(iOS 10.0, ...