PHP配置及使用redis cluster集群

目前我們用到的 PHP 的 Redis 擴(kuò)展 主要有2個(gè),第一個(gè)是最常用的 phpredis, 它是用c寫的php的高效擴(kuò)展:https://github.com/phpredis/phpredis,還有1個(gè)是predis, 它是用php代碼寫的,也用的蠻多的:https://github.com/nrk/predis。

我們主要看一下phpredis在集群中的用法:

一,phpredis的安裝

我Mac上是有安裝過phpredis擴(kuò)展的,但是是2.* 版本,是不支持cluster的,所以需要升級到3.0擴(kuò)展。我記錄下升級過程:

~ 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擴(kuò)展,還需要在php.ini中加上:

extension=redis.so

3.0版本的redis擴(kuò)展已經(jīng)安裝好了。我們可以重啟一下php-fpm。

接下來就可以使用redis cluster集群服務(wù):

1,先完成初始化連接到redis cluster服務(wù)器:

$obj_cluster = new RedisCluster(NULL, [‘127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7002']);

var_dump($obj_cluster);

第一個(gè)參數(shù)傳NULL 別問我,我也不知道為啥。反正文檔沒找到,這篇也沒看懂。

第二個(gè)參數(shù)是我們需要連接的redis cluster的master服務(wù)器列表。我這有3個(gè)master,就填3個(gè)。

打印結(jié)果如下:

class RedisCluster#5 (0) {}

一個(gè)RedisCluster 類資源。表示redis 已經(jīng)連接成功了。

那么,我們就可以實(shí)用之前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 的學(xué)習(xí),我們知道name1, name2, name3 是3個(gè)key , 會按照算法,分配到3個(gè)slot上,有可能分到3臺服務(wù)器上。

我們連接客戶端看下:

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的擴(kuò)展phpredis直接就給出結(jié)果了,這點(diǎn)很贊。

phpredis的使用

我們繼續(xù)看這個(gè)蛋疼的文檔,它還提供了一種連接方式:

// 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í)間,這里設(shè)為1.5秒,表示超過1.5秒要是還沒連接成功就返回false 。

read_timeout表示連接redis成功后,讀取一個(gè)key的超時(shí)時(shí)間,有時(shí)候讀取一個(gè)key 可能value比較大,讀取需要很長時(shí)間,這里設(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個(gè)參數(shù)。其實(shí)的操作幾乎一樣。

我嘗試的只用了一個(gè)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"

只填一個(gè)也可以。我在想,它是不是自己就能識別啊。不需要填這么多啊。但是,我沒找到相關(guān)的文檔,證明我的觀點(diǎn)。

而且,我換一個(gè)slave來連接,寫也可以成功?。?!

//7009是個(gè)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"

好吧。我姑且認(rèn)為,它會自動(dòng)內(nèi)部判斷主從。還蠻厲害的。

還有其他的功能和命令,例如:zadd、lpop、hget等。就不說了。


相關(guān)文章:

? ? ? centos安裝redis3.0.0集群?

? ? ? Ruby 安裝 - Linux?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容