准备工作
# 为了模拟分布式,需要起两个实例
kill -9 $(pidof memcached)
# 在实际项目中,需要使用 -l 命令来指定内网的 ip 地址和端口
/usr/local/memcached/bin/memcached -d start -u root -m 1024 -l 192.168.1.214:11211 -c 200 -P /tmp/memcached.11211.pid
/usr/local/memcached/bin/memcached -d start -u root -m 1024 -l 192.168.1.214:11311 -c 200 -P /tmp/memcached.11311.pid
代码
<?php
/*
Memcached 类库
*/
// 在默认情况下,Memcached 实例在请求结束后就会被释放,但是可以通过传入参数 persistentId 来为每个 Memcached 实例指定唯一的 id,在请求间共享实例。
// 使用相同的 persistentId 创建的 Memcached 实例是共享一个 Memcached 链接的。
// 在同一个项目或者同一个模块会指定相同的 persistentId 来节约 Memcached 的链接和资源。
$persistentId = 'asdf';
$m = new Memcached($persistentId);
// 当服务器连接池为空,增加 host
if(!$m->getServerList()){
// addservers 的第三个参数是“权重”,由于分布式算法是基于客户端的,设置权重是指定当前服务器被选中的概率
$m->addservers([
['192.168.1.214', '11211', 70],
['192.168.1.214', '11311', 30],
]);
}
// 配置 Memcached
$m->setOptions([
Memcached::OPT_PREFIX_KEY => 'asdf', // 可作为项目前缀
Memcached::OPT_COMPRESSION => false, // 关闭压缩
]
);
$cas = Memcached::GET_EXTENDED; // PHP7 的写法
// # 单个操作( set 方法和 get 方法)
// $m->set('k1', 'demo', time()+10);
// var_dump($m->get('k1', null, $cas), $cas);
// exit;
// # 批量操作( setMulti 方法和 getMulti 方法)
// $m->setMulti([
// 'k1' => 'demo1',
// 'k2' => 'demo2',
// 'k3' => 'demo3',
// 'k4' => 'demo4',
// 'k5' => 'demo5',
// 'k6' => 'demo6'
// ],time()+10);
// $result = $m->getMulti(['k1','k2','k3','k4','k5','k6'], $casTokenList);
// var_dump($result, $casTokenList);
// exit;
// # 并发处理方法(add 方法)
// if ($m->add('k0', 'add', time()+20)) {
// echo '抢到位置';
// }else {
// echo '已经被占用';
// }
// exit;
// # cas
// var_dump($m->get('k1', null, $cas), $cas);
// $m->cas($cas, 'k1', time(), time()+10);
// var_dump($m->get('k1', null, $cas), $cas);
// exit;
// # 自增自减 ( increment 和 decrement )
// $m->set('inc', 10);
// $result = $m->increment('inc', 10);
// var_dump($result);
// $result = $m->decrement('inc', 50);
// var_dump($result);
// exit;
// # append prepend(需要设置压缩 OPT_COMPRESSION 为 false)
// $m->set('app', ' ', time()+10);
// $m->prepend('app', 'hello');
// $m->append('app', 'memcached');
// var_dump($m->get('app', null, $cas), $cas);
// exit;
// $m->delete('k1');
// $m->flush(1);
关于批量操作( setMulti 方法和 getMulti 方法),登录服务器对分布式做了简单的验证,k1到k6的值分布在了两台服务器上。