最近在调研PHP中的session数据如何存储到Redis Cluster中,到底有几种方式实现呢?本文作者和你一探究竟。
一、为什么Session要存在Redis Cluster中?
公司以前的session数据存储在memcached当中,mc天然不支持cluster模式,导致mc出现故障时,session数据丢失,造成用户投诉。Redis存在standalone,sentinel,cluster模式,由于cluster模式存在数据冗余而且自动故障转移,我们采用Redis cluster模式进行存储,具体是三主三从的配置。
二、php存储实现session存储到Redis的两种方式
2.1、采用安装Redis扩展phpredis进行存储
(1)升级Redis扩展, 到官网选择支持Redis Cluster模式的扩展
扩展地址:http://pecl.php.net/get/redis-5.0.2.tgz
执行命令
$ cd /home/swh/redis-5.0.2
$ /home/swh/php/bin/phpize
$ ./configure --with-php-config=/home/swh/php/bin/php-config
$ make && make install
php扩展安装位置:/home/swh/php/lib/php/extensions/no-debug-non-zts-20151012,位置不固定,可以查看php.ini配置位置。
(2) 主要代码
$sessionSavePath = "seed[]=192.168.20.234:6383&seed[]=192.168.20.234:6390&seed[]=192.168.20.234:6391&seed[]=192.168.20.234:6392&seed[]=192.168.20.234:6393&seed[]=192.168.20.234:6394&auth=8df7387ddefe6127d6430a0ace4dea91";
ini_set('session.save_path', $sessionSavePath);
ini_set('session.save_handler', 'rediscluster');
(3) phpredis参考文档
https://github.com/phpredis/phpredis/blob/develop/cluster.markdown#readme
2.2 采用composer依赖predis实现
predis实现了SessionHandlerInterface接口, 将session数据存储到redis中。
文档:https://github.com/nrk/predis
1、利用composer依赖安装predis
2、主要代码,具体超时参数设置详见predis文档。
// Prepend a base path if Predis is not available in your "include_path".
require 'Predis/Autoloader.php';
Predis\Autoloader::register();
// create redis cluster client
$parameters = ['tcp://10.0.0.1', 'tcp://10.0.0.2', 'tcp://10.0.0.3'];
$client = new Predis\Client($parameters);
// Register the session handler.
$handler = new Predis\Session\Handler($client, array('gc_maxlifetime' => 5));
$handler->register();