目前我們用到的 PHP 的 Redis 擴展 主要有2個,第一個是最常用的 phpredis, 它是用c寫的php的高效擴展:https://github.com/phpredis/phpredis,還有1個是predis, 它是用php代碼寫的掖看,也用的蠻多的:https://github.com/nrk/predis丈氓。
我們主要看一下phpredis在集群中的用法:
一憋沿,phpredis的安裝
我Mac上是有安裝過phpredis擴展的熊尉,但是是2.* 版本,是不支持cluster的劲适,所以需要升級到3.0擴展。我記錄下升級過程:
~ git clone git@github.com:phpredis/phpredis.git
~ cd phpredis
~ git fetch
~ git checout feature/redis_cluster #切換到cluster分支
~ phpize
~ ./configure
~ make
~ make install
Installing shared extensions:? ? /usr/local/php5/lib/php/extensions/no-debug-non-zts-20131226/
這樣就可以用了厢蒜。如果你是第一次安裝redis擴展霞势,還需要在php.ini中加上:
extension=redis.so
3.0版本的redis擴展已經(jīng)安裝好了烹植。我們可以重啟一下php-fpm。
接下來就可以使用redis cluster集群服務:
1,先完成初始化連接到redis cluster服務器:
$obj_cluster = new RedisCluster(NULL, [‘127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7002']);
var_dump($obj_cluster);
第一個參數(shù)傳NULL 別問我愕贡,我也不知道為啥刊橘。反正文檔沒找到,這篇也沒看懂颂鸿。
第二個參數(shù)是我們需要連接的redis cluster的master服務器列表促绵。我這有3個master,就填3個嘴纺。
打印結(jié)果如下:
class RedisCluster#5 (0) {}
一個RedisCluster 類資源败晴。表示redis 已經(jīng)連接成功了。
那么栽渴,我們就可以實用之前redis的方法來嘗試了:
$obj_cluster->set('name11', '1111');
$obj_cluster->set('name22', '2222');
$obj_cluster->set('name33', '333');
$name1 = $obj_cluster->get('name11');
$name2 = $obj_cluster->get('name22');
$name3 = $obj_cluster->get('name33');
var_dump($name1, $name2, $name3);die;
結(jié)果如下:
string(4) "1111"
string(4) "2222"
string(3) "333"
很完美尖坤,沒啥問題。而且闲擦,他是直接就給結(jié)果了慢味。
前面的redis cluster 的學習,我們知道name1, name2, name3 是3個key , 會按照算法墅冷,分配到3個slot上纯路,有可能分到3臺服務器上。
我們連接客戶端看下:
redis-cli -c -p 7004
127.0.0.1:7004> get name11
-> Redirected to slot [11311] located at 127.0.0.1:7002
"1111"
127.0.0.1:7002> get name22
-> Redirected to slot [2335] located at 127.0.0.1:7000
"2222"
127.0.0.1:7000> get name33
-> Redirected to slot [10767] located at 127.0.0.1:7001
"333"
127.0.0.1:7001>
客戶端是有跳轉(zhuǎn)的寞忿,而php的擴展phpredis直接就給出結(jié)果了驰唬,這點很贊。
phpredis的使用
我們繼續(xù)看這個蛋疼的文檔腔彰,它還提供了一種連接方式:
// Connect and specify timeout and read_timeout
$obj_cluster = new RedisCluster(
NULL, Array("127.0.0.1:7000", "127.0.0.1:7001", 1.5, 1.5);
);
后面加入了timeout和read_timeout功能叫编。就是加到master列表的后面。
timeout表示連接redis的最長時間霹抛,這里設(shè)為1.5秒搓逾,表示超過1.5秒要是還沒連接成功就返回false 。
read_timeout表示連接redis成功后杯拐,讀取一個key的超時時間霞篡,有時候讀取一個key 可能value比較大,讀取需要很長時間藕施,這里設(shè)置1.5秒寇损,表示要是過了1.5秒還沒讀取到數(shù)據(jù)就返回false。
好裳食。我們試一下:
$obj_cluster = new RedisCluster(NULL, ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7002', 1.5, 1.5]);
在master列表后面加入了2個參數(shù)矛市。其實的操作幾乎一樣。
我嘗試的只用了一個master去連接诲祸,發(fā)現(xiàn)也可以浊吏,并沒什么差別而昨??找田?
如下:
$obj_cluster = new RedisCluster(NULL, ['127.0.0.1:7000', 1.5, 1.5]);
$obj_cluster->set('name1', '1111');
$name1 = $obj_cluster->get('name1');
var_dump($name1);
//輸出
string(4) "1111"
只填一個也可以歌憨。我在想,它是不是自己就能識別啊墩衙。不需要填這么多啊务嫡。但是,我沒找到相關(guān)的文檔漆改,證明我的觀點心铃。
而且,我換一個slave來連接挫剑,寫也可以成功Hタ邸!樊破!
//7009是個slave
$obj_cluster = new RedisCluster(NULL, ['127.0.0.1:7004’, 1.5, 1.5]);
$obj_cluster->set('name1', '4555');
$name1 = $obj_cluster->get('name1');
var_dump($name1);
//輸出
string(4) "4555"
好吧愉棱。我姑且認為,它會自動內(nèi)部判斷主從哲戚。還蠻厲害的奔滑。
還有其他的功能和命令,例如:zadd惫恼、lpop档押、hget等。就不說了祈纯。
相關(guān)文章:
? ? ? centos安裝redis3.0.0集群?
? ? ? Ruby 安裝 - Linux?