您的位置:首页 > 数据库 > Memcache

memcache cache session

2016-12-22 00:00 429 查看

memcache 和 memcached 的使用

配置
客户端
(1)
memcache 是pecl扩展库版本,php.ini 中 extension=memcache.so (自带)。
memecached是基于 libmemcached 开发的(手动安装)。
mkdir /usr/src/php -p
cd /usr/src/php
wget https://pecl.php.net/get/memcached -O memcached-2.2.0.tgz
tar xf memcached-2.2.0.tgz
cd memcached-2.2.0
phpize
# 我们在配置的添加一些新的功能,使其支持json和igbinary
./configure --enable-memcached --enable-memcached-json --enable-memcached-igbinary
make
make install

# 注意最后的输出
# Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/

cp /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/*.so /usr/local/php/lib/php/extensions/

#
vim /usr/local/php/etc/php.ini
# 添加以下配置
[Memcached]
extension=memcached.so

从手册上看,memcached 会比 memcache 多几个方法;
(2)memcache 是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached,只支持OO接口;
(3)memcached 的 flag 不是在操作时设置的,而是有了一个统一的setOption(),Memcached 实现了更多的 memcached 协议;
服务端
memcached:服务端守护进程,展现是酱紫滴.
# /usr/local/bin/memcached -d -m 2048  -u root -l 192.168.1.20 -p 12111 -c 1024 -P /tmp/memcached.pid


初始化
memcache: $mc = new memcache;
$mc->addServer(host1,port1);
$mc->addServer(host2,port2);
......
memcached : $mdc = new memcached;
$mdc->addServer(
array(host1,port1),
array(host2,port2),
......
);

普遍使用场景:

1)cache 数据库 select 数据;

2)cache session;

### 一些概念梳理:
$_COOKIE[session.name] == session_id();
存放 /tmp/file:sess_+ session_id()
存放 mem: SessionDriver.php 定义的 session_ 前缀 + session_id() ,验证方式参考“命令行遍历

一些参数设置:

memcache.allow_failover 一个布尔值,用于控制当连接出错时 Memcache 扩展是否故障转移到其他服务器上。默认值为 1 (true)。
memcache.max_failover_attempts 一个整型值,用于限制连接到持久性数据或检索数据的服务器数目。如果 memcache.allow_failover 为 false,则将忽略此参数。默认值为 20。
memcache.chunk_size 一个整型值,用于控制数据传输的大小。默认值为 8192 字节 (8 KB),但是如果设置为 32768 (32 KB),则可以获得更好的性能。
memcache.default_port 另一个整型值,用于设置连接到 Memcache 所使用的 TCP 端口。除非您修改它,否则默认值为无特权的端口 11211。

PHP 遍历 memcached

public function dispMemcache(){
$host='127.0.0.1';
$port=11211;
$mem=new Memcache();
$mem->connect($host,$port);
$items=$mem->getExtendedStats('items');
$items=$items["$host:$port"]['items'];
foreach($items as $key => $values){
$number=$key;
$str=$mem->getExtendedStats("cachedump",$number,0);
$line=$str["$host:$port"];
if( is_array($line) && count($line)>0){
foreach($line as $key=>$value){
echo $key.'=>';
print_r($mem->get($key));
echo "\r\n";
}
}
}
}

命令行遍历:

# key:session_....

telnet 127.0.0.1 11211

stats items
......
stats cachedump 2 0
ITEM session_p97rknannrdfsji4cldmd0oar1 [15 b; 1480379257 s]
END

get session_p97rknannrdfsji4cldmd0oar1
VALUE session_p97rknannrdfsji4cldmd0oar1 0 15
aaa|s:4:"vaaa";

遇到的问题:

产品用了两台分布式的memcached服务器。
某一个计数器取回来的数偶尔会不对,最后定位在php memcache client的failover机制上面。
我们知道,在memcached分布式环境下,某一个key是通过hash计算,分配到某一个memcached上面的,如果php.ini里面 memcache.allow_failover = 1的时候,在分布式环境下,某一台memcached出问题的话,会自动到其他的memcached尝试,就会出现上面的问题,原因如下:
这个key是hash到服务器A的,但是服务器A正好一瞬间连不上(网络或者其他问题),PHP就会去另一台服务器B去尝试。
经过很偶然发生的网络问题和很多次increment操作,有可能两台服务器上面都有这个key,而且值不一样……
get的时候有可能取到不同的值。如果对数据一致性要求很严格的话,可以关掉这个参数 memcache.allow_failover = 0

Session

[php手册]

session_id() 返回当前会话ID。 如果当前没有会话,则返回空字符串("")。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息