PHP Memcached 扩展

之前一直用的Memcache这个扩展,闲来无事把基于libmemcached的Memcached扩展学习一番 两个扩展的主要区别应该是 memcache原生的PHP扩展,不依赖任何其他程 memcached依赖于libmemcached,提供了更多api

详细的可以看这里Comparison of memcache and memcached

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

<?php
/**
* Memcached测试
*
* @author likai<youyuge@gmail.com>
* @link http://www.youyuge.com/
*/

/**
* 一句话memcache和memcached两个扩展的区别
* memcache是PHP原生扩展而memcached是基于libmemcached的PHP扩展,memcached提供更丰富的api
* 详见https://code.google.com/p/memcached/wiki/PHPClientComparison
*/

// 设置memcached链接
ini_set('session.save_path', '127.0.0.1:11211');

// 设置session使用memcached保存
ini_set('session.save_handler', 'memcached');

$m = new Memcached();

// OPT_SERIALIZER 设置非标量存储时序列化所用方法
$m->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_PHP); // default
//$m->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY); // 依赖 igbinary 扩展
//$m->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_JSON); // PHP > 5.2.10

// OPT_HASH 设置key的hash算法
$m->setOption(Memcached::OPT_HASH, Memcached::HASH_DEFAULT);
//$m->setOption(Memcached::OPT_HASH, Memcached::HASH_MD5);
//$m->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);
//$m->setOption(Memcached::OPT_HASH, Memcached::HASH_FNV1_64); // or HASH_FNV1A_32
//$m->setOption(Memcached::OPT_HASH, Memcached::HASH_HSIEH);
//$m->setOption(Memcached::OPT_HASH, Memcached::HASH_MURMUR);

// OPT_DISTRIBUTION 设置key分布到各服务器时使用方法

$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_MODULA); // 余数分布算法
//$m->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); // 一致性分布算法,手册上说“一致性hash算法提供 了更好的分配策略并且在添加服务器到集群时可以最小化缓存丢失。”

$m->setOption(Memcached::OPT_PREFIX_KEY, 'prefix_'); // 设置所有key的前缀

$m->setOption(Memcached::OPT_BINARY_PROTOCOL, true);

// $m->setOption(Memcached::OPT_NO_BLOCK, true); // 开启异步io default: false

// 作用于OPT_NO_BLOCK = false下
$m->setOption(Memcached::OPT_CONNECT_TIMEOUT, 10); //socket链接超时时间
$m->setOption(Memcached::OPT_RECV_TIMEOUT, 10); // socket读取超时时间
$m->setOption(Memcached::OPT_SEND_TIMEOUT, 10); // socket发送超时时间

$m->setOption(Memcached::OPT_SERVER_FAILURE_LIMIT, 1);

// 更多设置 http://www.php.net/manual/en/memcached.constants.php

//$m->addServer('127.0.0.1', 11211, 50);
$m->addServers(array(
array('127.0.0.1', 11211, 50),
array('192.168.1.111', 11211, 50),
// more servers
));

var_dump($m->getServerList()); // 服务器列表

var_dump($m->getStats()); // 各服务器状态

$m->set('deposit', 1);
$m->set('token', '我会在5分钟后过期', time() + 300);
var_dump($m->get('deposit'));
var_dump($m->get('token'));

if(!$m->add('deposit', 2))
var_dump('error', $m->getResultCode() == Memcached::RES_NOTSTORED); // Memcached::RES_NOTSTORED

// replace: 如果key不存在则返回false
if(!$m->replace('name', 'likai'))
var_dump('error', $m->getResultCode() == Memcached::RES_NOTSTORED);

$m->increment('deposit', 1);
$m->increment('token', 1); // token不是数值类型,increment方法将token内容视为0
var_dump($m->get('deposit'));
var_dump($m->get('token'));

$m->decrement('deposit', 1);
var_dump($m->get('deposit'));

// 删除key
$m->delete('name');
$m->delete('token', time() + 300); // 5分钟后删除,期间使用add,replace操作都会失败
// deleteMulti(array $keys, [, int $time = 0]) 批量删除

if(!$m->delete('notfound'))
var_dump('error', $m->getResultCode() == Memcached::RES_NOTFOUND);

$m->add('name', 'likai');

// append, prepend 不能使用在Memcached::OPT_COMPRESSION开启的情况下
//$m->append('name', '_suffix'); // likai_suffix
//$m->prepend('name', 'prefix_'); // prefix_likai_suffix

$m->touch('name', time() + 300); // 设置key的过期时间, name将在5分钟后过期

var_dump($m->getAllKeys());

$m->flush(10); // 清空所有key

$m->quit(); // 关闭所有链接

// 另外Memcached::*ByKey系列接口在多台服务器下,用于指定操作其中某一台服务器

坚持原创技术分享,您的支持将鼓励我继续创作!