目录索引:1.概念
2.安装并使用memcached
3.对memcached进行curd操作
4.用memcache扩展操作Memcached
5.memcached机制深入理解
6.memcache的细节
1.概念
Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。相关网站: http://danga.com/ http://memcached.org
2.安装并使用memcached
(1).下载memcached软件
(2).运行cmd命令,切换到memcached.exe目录,运行memecache.exe -d install
(3).启动memcached
第一种方法:到【控制面板/服务】里启动
第二种方法:cmd到memcached目录,运行memcached.exe -d start
(4)用netstat -an查看11211端口是否在监听,如果在监听,说明启动成功。
(补充:1.用netstat -anb可以看11211端口是哪个程序在监听,同时可以看到那些用户连接到我们的服务器 2.有名的端口1-1024 apache:80 mysql:3306 ftp:21 ssh:22 oracle:1521 stmp:25)
3.使用telnet连接到memcached服务
telnet 127.0.0.1 11211
如果不能使用telnet命令,拷贝一个telnet.exe放到c:/windows/system32就OK。
(1) 增加
基本语法:add key名 0 (存放时间)数据大小
例:add key1 0 30 5
hello
(2)获取
基本语法:get key名
例:get key1
(3)修改
方式1:set key名 0 存放时间 数据大小
方式2:replace key名 0 存放时间 数据大小
例:set key100 0 70 6
ssssss
(4)删除
基本语法:delete key名
例:delete key300
(补充:1.查看状态stats 命中率cmd_set/cmd_get 2.清空内存数据flush_all 3.操作Memcached命令: http://wenku.baidu.com/link?url=2roCXD80HRkrRZ9prNXvTOeI15Tl4-w8l-JoJUmzti0S_Mp0EQJwaouiYOoIK0-1zT2CZHN54XehrUFo6r9W8Aqka4NQ4LmcuWeLoqZ17sa )
4.用memcache扩展操作Memcached
(1)安装配置
①拷贝一个php_memcache.dll至php的ext目录
②在php.ini开启php_memcache.dll扩展
③重启apache
(2)操作
代码:
1
//
连接memcache服务器
2
$mem
=
new
Memcache();
3
if
(!
$mem
->connect('localhost',11211
)) {
4
die
('connect error!'
);
5
}
6
//
增加
7
if
(
$mem
->set('key1','val1',MEMCACHE_COMPRESSED,60
)) {
8
echo
'add ok!'
;
9
}
10
$arr
=
array
('moushu','yunshu'
);
11
if
(
$mem
->set('arr',
$arr
,MEMCACHE_COMPRESSED,60
)) {
12
echo
'add ok!'
;
13
}
14
class
Dog {
15
public
$name
;
16
public
$age
;
17
}
18
$dog
=
new
Dog();
19
if
(
$mem
->set('dog',
$dog
,MEMCACHE_COMPRESSED,60
)) {
20
echo
'add ok!'
;
21
}
22
$null_val
=
null
;
23
if
(
$mem
->set('null_val',
$null_val
,MEMCACHE_COMPRESSED,60
)) {
24
echo
'add ok!'
;
25
}
26
$bool_val
=
null
;
27
if
(
$mem
->set('bool_val',
false
,MEMCACHE_COMPRESSED,60
)) {
28
echo
'add ok!'
;
29
}
30
$handle
=
fopen
('2.php','a'
);
31
if
(
$mem
->set('res',
$handle
,MEMCACHE_COMPRESSED,60
)) {
32
echo
'add res ok!'
;
33
}
34
if
(
$mem
->set('name','luoyunshu',MEMCACHE_COMPRESSED,30*3600*24
)) {
35
echo
'add name ok!'
;
36
}
//
存储30天
37
if
(
$mem
->set('name2','moushu',MEMCACHE_COMPRESSED,
time
()+31*3600*24
)) {
38
echo
'add name2 ok!'
;
39
}
//
存储31天
40
41
//修改
42
if
(
$mem
->replace('key1','hello',MEMCACHE_COMPRESSED,60
)) {
43
echo
'add ok!'
;
44
}
45
46
//
删除
47
if
(
$mem
->delete('key1'
)) {
48
echo
'del ok!'
;
49
}
50
51
//
查询
52
$val
=
$mem
->get('key1'
);
53
echo
$val
;
54
$val
=
$mem
->get('arr'
);
55
var_dump
(
$val
);
56
$dog
=
$mem
->get('dog');
//
取对象时要先声明类定义
57
var_dump
(
$dog
);
58
$null_val
=
$mem
->get('null_val'
);
59
var_dump
(
$null_val
);
//
null
60
$bool_val
=
$mem
->get('bool_val'
);
61
var_dump
(
$bool_val
);
//
''
62
$res
=
$mem
->get('res'
);
63
var_dump
(
$res
);
//
0
64
$res
=
$mem
->get('key1'
);
65
var_dump
(
$res
);
66
$name
=
$mem
->get('name'
);
67
var_dump
(
$name
);
68
$name2
=
$mem
->get('name2'
);
69
var_dump
(
$name2
);
//
moushu
5.memcached机制深入理解
(1)基于c/s架构 ,协议简单
● c/s架构,此时memcached为服务器端,我们可以使用如PHP,c/c++等程序连接memcached服务器。
● memcached的服务器客户端通信并不使用XML等格式,而使用简单的基于文本行的协议。因此,通过telnet也能在memcached上保存数据、取得数据
(2)基于libevent的事件处理
● libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统: Windows/Linux/BSD/Solaris 等操作系统的的事件处理。
● Memcached 使用libevent来进行网络并发连接的处理,能够保持在很大并发情况下,仍旧能够保持快速的响应能力。
(3)内置内存存储方式
● 为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。
(4)基于客户端的分布式
● memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。
代码:
1
//
连接memcache服务器,启动两个服务器 (memcached.exe -p 9999
2
$mem
=
new
Memcache();
3
if
(!
$mem
->addServer('localhost',11211
)) {
4
die
('connect server1 error!'
);
5
}
//
serv1
6
if
(!
$mem
->addServer('localhost',9999
)) {
7
die
('connect server2 error!'
);
8
}
//
serv2
9
10
//将数据放入哪个memcache服务器,由客户端的mem对象决定
11
//当执行addServer的时候,并不是立即去连接mem服务,而是通过计算,hash后采取决定连接哪个mem服务,因此当你大量加入服务器到连接池时并没有多余的开销。
12
if
(
$mem
->set('key1','val1',MEMCACHE_COMPRESSED,120
)) {
13
echo
'add key1 ok!'
;
14
}
//
放在serv1
15
if
(
$mem
->set('key2','val2',MEMCACHE_COMPRESSED,120
)) {
16
echo
'add key2 ok!'
;
17
}
//
放在serv2
18
if
(
$mem
->set('key3','val3',MEMCACHE_COMPRESSED,120
)) {
19
echo
'add key3 ok!'
;
20
}
//
放在serv1
21
22
$res1
=
$mem
->get('key1'
);
23
$res2
=
$mem
->get('key2'
);
24
$res3
=
$mem
->get('key3'
);
25
echo
$res1
;
26
echo
$res2
;
27
echo
$res3
;
6.memcache的细节
(1)生命周期
从数据放入memcache开始计时,直到时间到了,就销毁,如果时间为0,则表示不过期。memcache的数据被销毁情况有:1.时间到了 ②重启memcached服务 ③delete掉了
(2)将 session数据 放入 memcached 中
①.配置:
第一种方法:修改php.ini 文件,修改如下:
save-handler=memcache
session.save_path = "tcp://localhost:11211"
第二种方法,使用ini_set()
ini_set('session.save_handler','memcache');
ini_set('session.save_path','tcp://localhost:11211');
一些说明: memcached 主要的目的是提速,数据不和用户绑定(session数据存入memcache中以session id作为键值,任何可访问memcache的人都可以取到值)。 session 数据和用户绑定,更安全。
(3) memcached 安全性
通过启用防火墙来防止外网访问 memcached 服务,保证 memcached 的安全。 linux系统设置防火墙的命令:iptables -a input -p tcp -s 127.0.0.1 -dport 11211 -j ACCEPT
(4)样的数据适合放入 memcache 中?
变化频繁,具有不稳定的数据,不需要实时入库(比如用户在线状态、在线人数 .... ),想加快用户访问应用的速度。大数据,如图片、视频不适合放入memcache中。
到这,时间再完善.....

