개발 꿀팁/PHP

php에서 redis 클러스터 사용

Jammie 2022. 7. 18. 17:18
반응형

현재 우리가 사용하는 php의 redis 확장에는 주로 2가지가 있습니다. 첫번째 phpredis는 가장 많이 사용되는 phpredis입니다. c로 쓰여진 php의 효율적인 확장입니다: https://github.com/phpredis/phpredis 그리고 1개는 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 #클러스터 분기로 전환
~ 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 확장 버전이 설치되었습니다.php-fpm을 재가동할 수 있다.

➜ sudo kill -USR2 `cat /usr/local/var/run/php-fpm.pid`

공식 문서가 너무 적습니다: https://github.com/phpredis/phpredis/blob/feature/redis_cluster/cluster.markdown. 이것 하나.

이 문서를 바탕으로 간단하게 공부해보도록 하겠습니다.

redis cluster 서버에 연결하기 전에 초기화를 완료합니다

$obj_cluster = new RedisCluster(NULL, ['192.168.33.13:7000', '192.168.33.13:7001', '192.168.33.13:7002', '192.168.33.13:7003', '192.168.33.13:7004']);

var_dump($obj_cluster);

첫 번째 파라미터전 NULL 묻지 마, 나도 몰라.어차피 문서를 못 찾았으니 이 글도 못 읽겠다.
두 번째 파라미터는 우리가 접속해야 하는 redis cluster의 master 서버 목록이다.마스터가 5개 있으니 5개만 채워주세요.

출력 결과는 다음과 같습니다

class RedisCluster#5 (0) {}

RedisCluster 클래스 리소스입니다.redis가 접속에 성공했음을 나타낸다.

그렇다면 이전 레디스 방법으로 시도해 볼 수 있다

$obj_cluster->set('name1', '1111');
$obj_cluster->set('name2', '2222');
$obj_cluster->set('name3', '333');
$name1 = $obj_cluster->get('name1');
$name2 = $obj_cluster->get('name2');
$name3 = $obj_cluster->get('name3');
var_dump($name1, $name2, $name3);die;

결과는 다음과 같다

string(4) "1111"
string(4) "2222"
string(3) "333"

완벽해, 문제 없어.게다가 그는 곧바로 결과를 내놓았다.

앞의 레디스 클러스터 학습, 우리name1, name2, name3가 3개의 key인 것을 알고 알고리즘에 따라 3개의 slot에 할당되며, 3대의 서버에 할당될 수 있습니다.

다음 클라이언트를 연결해서 보겠습니다

➜  redis-cli -h 192.168.33.13 -p 7009 -c
192.168.33.13:7009> get name1
-> Redirected to slot [12933] located at 192.168.33.13:7003
"1111"
192.168.33.13:7003> get name2
-> Redirected to slot [742] located at 192.168.33.13:7000
"2222"
192.168.33.13:7000> get name3
-> Redirected to slot [4807] located at 192.168.33.13:7001
"333"
192.168.33.13:7001>

클라이언트는 점프하는 것이고, php의 확장 ph프레디스는 곧바로 결과를 낸다는 점이 좋다.

phpredis 사용
계란이 아픈 문서를 계속 봅니다. 연결 방법을 제공합니다.

// Connect and specify timeout and read_timeout
$obj_cluster = new RedisCluster(
    NULL, Array("host:7000", "host:7001", 1.5, 1.5);
);

뒤쪽에 타임아웃과 read_timeout 기능을 넣었다.마스터 리스트 뒤에 붙이는 것이다.

timeout은 redis에 접속하는 최장 시간을 의미하며, 여기서 1.5초로 설정해 1.5초가 넘으면 아직 접속하지 않았음을 나타낸다.성공하면 false를 반환합니다.

read_timeout은 redis 접속이 성공한 후 key를 읽는 타임아웃을 의미하며, 때로는 하나를 읽는 시간을 의미한다.key value가 커서 읽는데 시간이 오래 걸릴 수 있는데 여기서 1.5초를 설정하면 1.5초가 지나도 데이터를 읽지 못하면 false가 반환된다는 뜻이다.

좋아. 한번 해보자.

$obj_cluster = new RedisCluster(NULL, ['192.168.33.13:7000', '192.168.33.13:7001', '192.168.33.13:7002', '192.168.33.13:7003', '192.168.33.13:7004', 1.5, 1.5]);

마스터 리스트 뒤에 2개의 파라미터를 추가했다.사실 조작은 거의 똑같다.

내가 시도했던 건 마스터 하나만으로 연결했더니 괜찮아, 나쁘지 않았어.아니야??

다음과 같다.

$obj_cluster = new RedisCluster(NULL, ['192.168.33.13:7000', 1.5, 1.5]);
$obj_cluster->set('name1', '1111');
$name1 = $obj_cluster->get('name1');
var_dump($name1);
//출력
string(4) "1111"

하나만 기입하셔도 됩니다.스스로 식별할 수 있지 않을까 하는 생각이 들었다.이렇게 많이 쓸 필요 없잖아.하지만 내 주장을 뒷받침할 문서를 찾지 못했다.

그리고, 나는 slave로 바꿔서 연결해서 쓸 수 있어!!!

//7009是个slave
$obj_cluster = new RedisCluster(NULL, ['192.168.33.13:7009', 1.5, 1.5]);
$obj_cluster->set('name1', '4555');
$name1 = $obj_cluster->get('name1');
var_dump($name1);
//출력
string(4) "4555"

좋아요. 일단은 내부적으로 주종을 판단하게 될 거라고 생각해요.대단하네요.

zadd, lpop, hge 같은 다른 기능과 명령도 있습니다.t 등. 그만.

프레디스
predis 다운로드 설치
predis는 php 코드로 쓰여진 php 연결 redis 세트이다.그 확장, 네임스페이스에 사용했는데 제가 전에 썼는데, 사실 효율은 괜찮았어요. phpredis보다 조금 더.조금 낮지만, 그것은인터페이스가 많아, 기능이 매우 강하다.크다。

웹 레디스 관리 도구 phpRedisAdmin(h)ttps: // github.com/ErikDubbelboer/phpR에디스애드미n)프레디스를 쓰는데연결된 것으로요.

자, 먼저 다운받아 보세요.composer나 git로 할 수 있어요 clone. 여기 git clone 쓸게요.가장 최근에 안정화된 버전은 v1.03입니다.

➜  redis  git clone git@github.com:nrk/predis.git
➜  redis  cd predis
➜  predis git:(master) git checkout v1.0.3 #최신 문서 버전으로 바꾸기
➜  predis git:(84060b9)

OK, test.php 파일을 새로 만들고 cluster 업무를 다시 테스트합니다

<?php
require 'predis/autoload.php';
$servers = [
    'tcp://192.168.33.13:7000',
    'tcp://192.168.33.13:7001',
    'tcp://192.168.33.13:7002',
    'tcp://192.168.33.13:7003',
    'tcp://192.168.33.13:7004',
    ];
$options = ['cluster' => 'redis'];
$client = new Predis\Client($servers, $options);
$client->set('name1', '1111111');
$client->set('name2', '2222222');
$client->set('name3', '3333333');
$name1 = $client->get('name1');
$name2 = $client->get('name2');
$name3 = $client->get('name3');
var_dump($name1, $name2, $name3);die;

인쇄 결과:

➜  redis  php test.php
string(7) "1111111"
string(7) "2222222"
string(7) "3333333"

너무 좋아요~

물론 이것도 유사합니다. 하나만 기입해도 됩니다. 현재 구덩이도 없고 설명서도 없습니다

require 'predis/autoload.php';
$servers = [
    'tcp://192.168.33.13:7000',
    ];
$options = ['cluster' => 'redis'];
$client = new Predis\Client($servers, $options);
$client->set('name1', '1111111');

기타 일부 용법도 유사하다.

$client->hset('name77', 'name', 'yang');
$b = $client->hget('name77', 'name');
...
...

일단 이곳을 찾으면 나머지는 앞의 레디스처럼 쓴다

반응형