- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Memcached 入门介绍(安装与配置)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。 Memcached基于一个存储键值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信.
下面来了解下Memcached怎么用~~ 。
1、准备工作 。
下载memcached的windows版 。
再下载一个java_memcached-release.jar 。
2、安装 解压memcached-1.2.5-win32-bin.zip,CMD进入其目录,然后执行如下命令:
c:>memcached.exe -d install c:>memcached.exe -l 127.0.0.1 -m 32 -d start第一行是安装memcached成为服务,这样才能正常运行,否则运行失败! 。
第二行是启动memcached的,这里简单的只分配32M内存了(默认64M),然后监听本机端口和以守护进行运行.
执行完毕后,我们就可以在任务管理器中看到memcached.exe这个进程了.
如果想要在同一台Windows机器中安装2个Memcached,请看这里 。
3、使用 现在服务器已经正常运行了,下面我们就来写java的客户端连接程序.
将java_memcached-release.zip解压,把java_memcached-release.jar文件复制到java项目的lib目录下, 。
然后我们来编写代码,比如我提供的一个应用类如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
package
memcached.test;
import
java.util.Date;
import
com.danga.MemCached.MemCachedClient;
import
com.danga.MemCached.SockIOPool;
/**
* 使用memcached的缓存实用类.
*/
public
class
MemCached {
// 创建全局的唯一实例
protected
static
MemCachedClient mcc =
new
MemCachedClient();
protected
static
MemCached memCached =
new
MemCached();
// 设置与缓存服务器的连接池
static
{
// 服务器列表和其权重
String[] servers = {
"127.0.0.1:11211"
};
Integer[] weights = {
3
};
// 获取socke连接池的实例对象
// 这个类用来创建管理客户端和服务器通讯连接池,
// 客户端主要的工作(包括数据通讯、服务器定位、hash码生成等)都是由这个类完成的。
SockIOPool pool = SockIOPool.getInstance();
// 设置服务器信息
pool.setServers(servers);
// 设置Server权重
pool.setWeights(weights);
// 设置初始连接数、最小和最大连接数以及最大处理时间
pool.setInitConn(
5
);
pool.setMinConn(
5
);
pool.setMaxConn(
250
);
pool.setMaxIdle(
1000
*
60
*
60
*
6
);
// 设置主线程的睡眠时间
pool.setMaintSleep(
30
);
// 设置连接心跳监测开关
// true:每次通信都要进行连接是否有效的监测,造成通信次数倍增,加大网络负载,
// 因此在对HighAvailability要求比较高的场合应该设为true
// 默认状态是false,建议保持默认。
pool.setAliveCheck(
false
);
// 设置连接失败恢复开关
// 设置为true,当宕机的服务器启动或中断的网络连接后,这个socket连接还可继续使用,否则将不再使用.
// 默认状态是true,建议保持默认。
pool.setFailback(
true
);
// 设置容错开关
// true:当当前socket不可用时,程序会自动查找可用连接并返回,否则返回NULL
// 默认状态是true,建议保持默认。
pool.setFailover(
true
);
// 设置hash算法
// alg=0 使用String.hashCode()获得hash code,该方法依赖JDK,可能和其他客户端不兼容,建议不使用
// alg=1 使用original 兼容hash算法,兼容其他客户端
// alg=2 使用CRC32兼容hash算法,兼容其他客户端,性能优于original算法
// alg=3 使用MD5 hash算法
// 采用前三种hash算法的时候,查找cache服务器使用余数方法。采用最后一种hash算法查找cache服务时使用consistent方法。
// 默认值为0
pool.setHashingAlg(
0
);
// 设置是否使用Nagle算法,因为我们的通讯数据量通常都比较大(相对TCP控制数据)而且要求响应及时,
// 因此该值需要设置为false(默认是true)
pool.setNagle(
false
);
// 设置socket的读取等待超时值
pool.setSocketTO(
3000
);
// 设置socket的连接等待超时值
pool.setSocketConnectTO(
0
);
// 初始化连接池
pool.initialize();
// 压缩设置,超过指定大小(单位为K)的数据都会被压缩
// mcc.setCompressEnable(true); //UnsupportedOperation
// mcc.setCompressThreshold(64 * 1024);
}
private
MemCached() {
}
/**
* 获取唯一实例.
* singleton
* @return
*/
public
static
MemCached getInstance() {
return
memCached;
}
/**
* 添加一个指定的键值对到缓存中.
*
* @param key
* @param value
* @return
*/
public
boolean
add(String key, Object value) {
return
mcc.add(key, value);
}
/**
* 添加一个指定的键值对到缓存中.
*
* @param key
* @param value
* @param expiry 多久之后过期
* @return
*/
public
boolean
add(String key, Object value, Date expiry) {
return
mcc.add(key, value, expiry);
}
public
boolean
set(String key, Object value) {
return
mcc.set(key, value);
}
public
boolean
set(String key, Object value, Date expiry) {
return
mcc.set(key, value, expiry);
}
public
boolean
replace(String key, Object value) {
return
mcc.replace(key, value);
}
public
boolean
replace(String key, Object value, Date expiry) {
return
mcc.replace(key, value, expiry);
}
/**
* 根据指定的关键字获取对象.
*
* @param key
* @return
*/
public
Object get(String key) {
return
mcc.get(key);
}
}
MemCached
|
写个Main方法测试下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public
static
void
main(String[] args) {
MemCached cache = MemCached.getInstance();
boolean
result1 = cache.add(
"hello"
,
1234
,
new
Date(
1000
*
2
));
// 设置2秒后过期
System.out.println(
"第一次add : "
+ result1);
System.out.println(
"Value : "
+ cache.get(
"hello"
));
boolean
result2 =cache.add(
"hello"
,
12345
,
new
Date(
1000
*
2
));
// add fail
System.out.println(
"第二次add : "
+ result2);
boolean
result3 =cache.set(
"hello"
,
12345
,
new
Date(
1000
*
2
));
// set successes
System.out.println(
"调用set : "
+ result3);
System.out.println(
"Value : "
+ cache.get(
"hello"
));
try
{
Thread.sleep(
1000
*
2
);
System.out.println(
"已经sleep2秒了...."
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
System.out.println(
"Value : "
+ cache.get(
"hello"
));
}
|
执行结果如下:
1
2
3
4
5
6
7
|
第一次add :
true
Value :
1234
第二次add :
false
调用set :
true
Value :
12345
已经sleep2秒了....
Value :
null
|
说明:
1.第二次add失败是因为"hello"这个key已经存在了。 2.调用set成功,是因为set的时候覆盖了已存在的键值对,这正是add和set的不同之处 3.设置过期之间之后,cache按时自动失效 。
上面的例子是对于基本数据类型,对于普通的POJO而言,如果要进行存储的话,那么比如让其实现java.io.Serializable接口.
因为memcached是一个分布式的缓存服务器,多台服务器间进行数据共享需要将对象序列化的,所以必须实现该接口,否则会报错的(java.io.NotSerializableException).
下面来试试POJO的存储:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package
memcached.test;
public
class
Person
implements
java.io.Serializable {
private
static
final
long
serialVersionUID = 1L;
private
String name;
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
}
|
简单的POJO对象 。
Main方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
static
void
main(String[] args) {
MemCached cache = MemCached.getInstance();
Person p1 =
new
Person();
p1.setName(
"Jack"
);
cache.add(
"bean"
, p1);
Person p2 = (Person) cache.get(
"bean"
);
System.out.println(
"name="
+ p2.getName());
//Jack
p2.setName(
"Rose"
);
// cache.replace("bean", p2);
Person p3 = (Person) cache.get(
"bean"
);
System.out.println(
"name="
+ p3.getName());
}
|
上面的代码中,我们通过p2.setName("Rose")修改了对象的名字, 。
最后一行打印的会是什么呢?
name=Jack name=JackWhy?
这是因为我们修改的对象并不是缓存中的对象,而是通过序列化过来的一个实例对象 那么要修改怎么办?使用replace,注释掉的那一行把注释去掉就可以了.
4、其他 Memcached的命令参数说明 -p <num> 监听的端口 -l <ip_addr> 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d uninstall 卸载memcached服务 -u <username> 以<username>的身份运行 (仅在以root运行的时候有效) -m <num> 最大内存使用,单位MB。默认64MB -M 内存耗尽时返回错误,而不是删除项 -c <num> 最大同时连接数,默认是1024 -f <factor> 块大小增长因子,默认是1.25 -n <bytes> 最小分配空间,key+value+flags默认是48 -h 显示帮助 。
Memcached也可以在控制台中添加键值对,首先使用命令“telnet 127.0.0.1 11211”进入到Memcached控制台, 。
然后使用set、add、replace、get、delete来操作.
更详细操作可参照这里 。
5、Memcached的优势和不足 。
说到Memcached的优势,那当然是:速度快,操作简便,易扩展 。
不足的话,主要有2点:
1.数据的临时性(数据仅保存在内存中) 2.只能通过指定键来读取数据,不支持模糊查询 。
6、Memcached停止时的保障措施 如果数据库的访问量比较大,就需要提前做好准备,以便应对在memcached停止时发生的负载问题.
如果能在停止memcached之前,把数据复制到其他的server就好了。恩,这个可以通过repcached来实现.
repcached是日本人开发的实现memcached复制功能, 它是一个单master、单slave的方案,但它的master/slave都是可读写的,而且可以相互同步 如果master坏掉,slave侦测到连接断了,它会自动listen而成为master 。
最后此篇关于Memcached 入门介绍(安装与配置)的文章就讲到这里了,如果你想了解更多关于Memcached 入门介绍(安装与配置)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
晚上在 QQ 上看到昵称为“乱码”的好友回答了搜搜问问里一个问题: 在VBS中有办法定义字节数组么? 在VBS中有办法定义字节数组么?就是字节子类型数组(VarType是8209的那种)注意不是V
例如,员工管理应用程序可能包括一个EmPloyee 类。然后可以用这个类来创建和维护特定实例,比如Gonn和Sally。 根据预定义的类创建对象常称为类的实例化(class insta
在自然语言中,我们理解抽象的概念是,一个物体的一种大的描述,这种描述对某类物体来说是共有的特性。那么在PHP中也是一样的,我们把一个类进行抽象,可以指明类的一般行为,这个类应该是一个模板,它指示它的
DBA_2PC_PENDING Oracle会自动处理分布事务,保证分布事务的一致性,所有站点全部提交或全部回滚。一般情况下,处理过程在很短的时间内完成,根本无法察觉到。但是,如果在commit或
目录 计算过程 投影分量计算 假设你有一家理发店,已经记录了过去一年中所有顾客的头发长度和发型偏好的数据。现在你想从这些数据中提取一些主要的信息,比如顾客最常
Object.defineProperty函数会直接在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回此对象。 一、简单使用 const obj = {} Object.defineP
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
SPL官网 http://www.scudata.com.cn/ 介绍 业务逻辑经常包含较复杂的流程和计算,同时涉及数据库的读写。由于授权麻烦、影响数据库安全、无法迁移、技术要求高、编写困难等原因,很
一 点睛 Thrift 是一歀基于 CS 架构的 RPC 框架,最初由 Facebook 研发,2008 年转入 Apache 组织。开发人员可以使用 Thrift 提供的 IDL(接口定义语言)来定
数据库应用程序与主应用程序分开存在,并存储数据集合。 每个数据库都使用一个或多个API来创建,访问,管理,搜索和复制其包含的数据。 数据库还使用非关系数据源,例如对象或文件。 然而,数据库证明是大数
介绍 Ant是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构件工具。在我们详细了解 Apache Ant 之前, 让我们来讲解为什么构建工具是需要最先了解的。 构建工具的需求
我现在正在尝试学习ocaml,并希望从一个小程序开始,生成所有位组合: [“0”,“0”,“0”] [“0”,“0”,“1”] [“0”,“1”,“0”] ... 等等 我的想法是下面的代码: let
我正在做我的介绍 C 类(class)作业,我的任务是执行以下任务...... 为一个函数编写代码,该函数通过值接收两个参数(a 和 b)并通过引用具有另外两个参数(c 和 d)。所有参数都是双倍的。
我希望提供有关我网站内容的快速演示,以及如何在用户访问我的页面后立即以正确的方式使用它们。我希望使用顶部的弹出式窗口进行演示。 我的意思是小信息框,一个接一个地通知用户各个步骤。任何人都可以帮助我如何
与C、Java等语言一样,JavaScript中可以用&&、||、!三个逻辑判断符来对boolean值进行逻辑判断。与C、Java不同的是,JavaScript中逻辑与(&&
JavaScript中,==与===操作符均可用于判断两个值是否相等;不同之处在于,如果进行判断的两个值类型不一致,===操作符会直接返回false,而==操作符则会在类型转换后再进行判断。详细的判
JavaScript中,object转换为boolean的操作非常简单:所有的object转换成boolean后均为true;即使是new Boolean(false)这样的object在转换为bo
在android开发中,当不满足触发条件就按返回键的时候,就要对此进行检测。尤其是当前Activity需要往前一个Activity传送消息时。即Activity1跳转到Activity3如果采用的是
背景 当要求系统启动一个应用程序时,系统会先查找当前命令是否是内部命令,若不是,则在当前目录下查找,如果仍没有找到,则在系统变量 Path 指定的路径去查找。JDK(Java Developmen
概述 想做一个微信的公众平台,阅读了微信官方给的网址接入的示例代码,发现有个问题好像一直都是半知半解的,就是在类里边直接使用$_GET。仔细查了下关于这方面的知识,发现PHP中这部分的基础知识掌握
我是一名优秀的程序员,十分优秀!