workerman-redis

소개

workeman/redis는 workerman 기반의 비동기 redis 컴포넌트입니다.

주의
이 프로젝트의 주요 목적은 redis 비동기 구독(subscribe, pSubscribe)을 구현하는 것입니다.
redis는 충분히 빠르므로 psubscribe와 subscribe 비동기 구독이 필요하지 않다면, 이 비동기 클라이언트를 사용할 필요가 없으며, redis 확장을 사용하는 것이 더 나은 성능을 제공합니다.

설치:

composer require workerman/redis ^v2.0.3

콜백 사용법

use Workerman\Worker;
use Workerman\Redis\Client;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:6161');

$worker->onWorkerStart = function() {
    global $redis;
    $redis = new Client('redis://127.0.0.1:6379');
};

$worker->onMessage = function(TcpConnection $connection, $data) {
    global $redis;
    $redis->set('key', 'hello world');    
    $redis->get('key', function ($result) use ($connection) {
        $connection->send($result);
    });  
};

Worker::runAll();

협조체 사용법

주의
협조체 사용법은 workerman>=5.0, workerman/redis>=2.0.0이 필요하며 composer require revolt/event-loop ^1.0.0을 설치해야 합니다.

use Workerman\Worker;
use Workerman\Redis\Client;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:6161');

$worker->onWorkerStart = function() {
    global $redis;
    $redis = new Client('redis://127.0.0.1:6379');
};

$worker->onMessage = function(TcpConnection $connection, $data) {
    global $redis;
    $redis->set('key', 'hello world');    
    $result = $redis->get('key');
    $connection->send($result);
};

Worker::runAll();

콜백 함수를 설정하지 않으면 클라이언트는 동기 방식으로 비동기 요청 결과를 반환하며, 요청 과정은 현재 프로세스를 차단하지 않아 동시 처리가 가능합니다.

주의
psubscribe와 subscribe는 협조체 사용법을 지원하지 않습니다.

문서

설명

콜백 방식에서 콜백 함수는 일반적으로 2개의 매개변수($result, $redis)를 가집니다. $result는 결과값, $redis는 redis 인스턴스입니다. 예를 들어:

use Workerman\Redis\Client;
$redis = new Client('redis://127.0.0.1:6379');
// 콜백 함수에서 set 호출 결과 확인
$redis->set('key', 'value', function ($result, $redis) {
    var_dump($result); // true
});
// 콜백 함수는 선택적 매개변수이며, 여기서 콜백 함수를 생략했습니다.
$redis->set('key1', 'value1');
// 콜백 함수는 중첩할 수 있습니다.
$redis->get('key', function ($result, $redis){
    $redis->set('key2', 'value2', function ($result) {
        var_dump($result);
    });
});

연결

use Workerman\Redis\Client;
// 콜백 생략
$redis = new Client('redis://127.0.0.1:6379');
// 콜백 포함
$redis = new Client('redis://127.0.0.1:6379', [
    'connect_timeout' => 10 // 연결 타임아웃 10초 설정, 설정하지 않으면 기본값 5초
], function ($success, $redis) {
    // 연결 결과 콜백
    if (!$success) echo $redis->error();
});

auth

//  비밀번호 인증
$redis->auth('password', function ($result) {

});
// 사용자 이름과 비밀번호 인증
$redis->auth('username', 'password', function ($result) {

});

pSubscribe

하나 이상의 주어진 패턴의 채널을 구독합니다.

각 패턴은 *을 와일드카드로 사용하여, 예를 들어 it*는 it로 시작하는 모든 채널(it.news, it.blog, it.tweets 등)을 매치합니다. news.*는 news.로 시작하는 모든 채널(news.it, news.global.today 등)을 매치합니다.

주의: pSubscribe 콜백 함수는 4개의 매개변수($pattern, $channel, $message, $redis)를 가집니다.

$redis 인스턴스가 pSubscribe 또는 subscribe 인터페이스를 호출한 후, 현재 인스턴스에서 다른 메서드 호출은 무시됩니다.

$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');
$redis->psubscribe(['news*', 'blog*'], function ($pattern, $channel, $message) {
    echo "$pattern, $channel, $message"; // news*, news.add, news content
});

Timer::add(5, function () use ($redis2){
    $redis2->publish('news.add', 'news content');
});

subscribe

주어진 하나 이상의 채널의 정보를 구독합니다.

주의: subscribe 콜백 함수는 3개의 매개변수($channel, $message, $redis)를 가집니다.

$redis 인스턴스가 pSubscribe 또는 subscribe 인터페이스를 호출한 후, 현재 인스턴스에서 다른 메서드 호출은 무시됩니다.

$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');
$redis->subscribe(['news', 'blog'], function ($channel, $message) {
    echo "$channel, $message"; // news, news content
});

Timer::add(5, function () use ($redis2){
    $redis2->publish('news', 'news content');
});

publish

지정된 채널로 메시지를 전송합니다.

수신된 메시지의 구독자 수를 반환합니다.

$redis2->publish('news', 'news content');

select

// 콜백 생략
$redis->select(2);
$redis->select('test', function ($result, $redis) {
    // select 인자는 숫자여야 하므로 여기서 $result는 false입니다.
    var_dump($result, $redis->error());
});

get

지정된 key의 값을 가져오는데 사용됩니다. key가 존재하지 않으면 NULL을 반환합니다. key에 저장된 값이 문자열 타입이 아닐 경우 false를 반환합니다.

$redis->get('key', function($result) {
     // key가 존재하지 않으면 NULL을 반환하고, 오류가 발생하면 false를 반환합니다.
    var_dump($result);
});

set

지정된 key의 값을 설정하는 데 사용됩니다. key가 이미 다른 값을 저장하고 있다면, SET 명령은 이전 값을 덮어씁니다.

$redis->set('key', 'value');
$redis->set('key', 'value', function($result){});
// 세 번째 인자를 통해 만료 시간을 설정할 수 있으며, 10초 후에 만료됩니다.
$redis->set('key', 'value', 10);
$redis->set('key', 'value', 10, function($result){});

setEx, pSetEx

지정된 key에 값과 만료 시간을 설정합니다. key가 이미 존재하는 경우, SETEX 명령은 이전 값을 대체합니다.

// 두 번째 인자로 만료 시간을 설정합니다. 단위는 초입니다.
$redis->setEx('key', 3600, 'value'); 
// pSetEx의 단위는 밀리초입니다.
$redis->pSetEx('key', 3600, 'value'); 

del

존재하는 key를 삭제하는 데 사용되며, 반환 결과는 숫자로 삭제된 key의 개수를 나타냅니다(존재하지 않는 key는 계산하지 않음).

// 하나의 key 삭제
$redis->del('key');
// 여러 key 삭제
$redis->del(['key', 'key1', 'key2']);

setNx

(SETifNot eXists) 명령은 지정된 key가 존재하지 않을 때, key에 지정된 값을 설정합니다.

$redis->del('key');
$redis->setNx('key', 'value', function($result){
    var_dump($result); // 1
});
$redis->setNx('key', 'value', function($result){
    var_dump($result); // 0
});

exists

지정된 key가 존재하는지를 확인하는 명령입니다. 반환 결과는 숫자로 존재하는 key의 개수를 나타냅니다.

$redis->set('key', 'value');
$redis->exists('key', function ($result) {
    var_dump($result); // 1
}); 
$redis->exists('NonExistingKey', function ($result) {
    var_dump($result); // 0
}); 

$redis->mset(['foo' => 'foo', 'bar' => 'bar', 'baz' => 'baz']);
$redis->exists(['foo', 'bar', 'baz'], function ($result) {
    var_dump($result); // 3
}); 

incr, incrBy

key에 저장된 숫자 값을 1 또는 지정된 값만큼 증가시킵니다. key가 존재하지 않으면 key의 값은 먼저 0으로 초기화된 다음 incr/incrBy 작업이 실행됩니다.
값의 타입이 잘못되거나 문자열 타입의 값이 숫자로 표현될 수 없으면 false를 반환합니다.
성공하면 증가된 수치를 반환합니다.

$redis->incr('key1', function ($result) {
    var_dump($result);
}); 
$redis->incrBy('key1', 10, function ($result) {
    var_dump($result);
}); 

incrByFloat

key에 저장된 값에指定된 부동 소수점 수치를 더합니다.
key가 존재하지 않으면 INCRBYFLOAT는 key의 값을 0으로 설정한 후 덧셈 작업을 실행합니다.
값의 타입이 잘못되거나 문자열 타입의 값이 숫자로 표현될 수 없다면 false를 반환합니다.
성공하면 증가된 수치를 반환합니다.

$redis->incrByFloat('key1', 1.5, function ($result) {
    var_dump($result);
}); 

decr, decrBy

key에 저장된 값을 1 또는 지정된 감소 값만큼 감소시킵니다.
key가 존재하지 않으면 key의 값은 먼저 0으로 초기화된 후 decr/decrBy 작업이 실행됩니다.
값의 타입이 잘못되거나 문자열 타입의 값이 숫자로 표현될 수 없다면 false를 반환합니다.
성공하면 감소된 수치를 반환합니다.

$redis->decr('key1', function ($result) {
    var_dump($result);
}); 
$redis->decrBy('key1', 10, function ($result) {
    var_dump($result);
}); 

mGet

모든(하나 이상의) 주어진 key의 값을 반환합니다. 주어진 key 중에 하나라도 존재하지 않는 key가 있다면, 그 key는 NULL을 반환합니다.

$redis->set('key1', 'value1');
$redis->set('key2', 'value2');
$redis->set('key3', 'value3');
$redis->mGet(['key0', 'key1', 'key5'], function ($result) {
    var_dump($result); // [null, 'value1', null];
}); 

getSet

지정된 key의 값을 설정하고 해당 key의 이전 값을 반환합니다.

$redis->set('x', '42');
$redis->getSet('x', 'lol', function ($result) {
    var_dump($result); // '42'
}) ;
$redis->get('x', function ($result) {
    var_dump($result); // 'lol'
}) ;

randomKey

현재 데이터베이스에서 임의의 key를 반환합니다.

$redis->randomKey(function($key) use ($redis) {
    $redis->get($key, function ($result) {
        var_dump($result); 
    }) ;
})

move

현재 데이터베이스의 key를 지정된 데이터베이스 db로 이동합니다.

$redis->select(0);  // DB 0으로 전환
$redis->set('x', '42'); // x에 42 저장
$redis->move('x', 1, function ($result) {   // DB 1로 이동
    var_dump($result); // 1
}) ;  
$redis->select(1);  // DB 1으로 전환
$redis->get('x', function ($result) {
    var_dump($result); // '42'
}) ;

rename

key의 이름을 변경합니다. key가 존재하지 않으면 false를 반환합니다.

$redis->set('x', '42');
$redis->rename('x', 'y', function ($result) {
    var_dump($result); // true
}) ;

renameNx

새로운 key가 존재하지 않을 때 key의 이름을 변경합니다.

$redis->del('y');
$redis->set('x', '42');
$redis->renameNx('x', 'y', function ($result) {
    var_dump($result); // 1
}) ;

expire

key의 만료 시간을 설정합니다. key가 만료되면 더 이상 사용 불가능해집니다. 단위는 초입니다. 성공하면 1, key가 존재하지 않으면 0, 오류가 발생하면 false를 반환합니다.

$redis->set('x', '42');
$redis->expire('x', 3);

keys

주어진 패턴 pattern에 부합하는 모든 key를 찾는 명령입니다.

$redis->keys('*', function ($keys) {
    var_dump($keys); 
}) ;
$redis->keys('user*', function ($keys) {
    var_dump($keys); 
}) ;

type

key에 저장된 값의 타입을 반환합니다. 반환 결과는 문자열로 string, set, list, zset, hash 중 하나이며, none은 key가 존재하지 않음을 나타냅니다.

$redis->type('key', function ($result) {
    var_dump($result); // string set list zset hash none
}) ;

append

key가 이미 존재하고 문자열이면, APPEND 명령은 value를 key 원래 값의 끝에 추가하고 문자열 길이를 반환합니다.

key가 존재하지 않으면 APPEND는 주어진 key를 value로 설정하며, 마치 SET key value를 실행한 것처럼 동작하고 문자열 길이를 반환합니다.

key가 존재하지만 문자열이 아닐 경우 false를 반환합니다.

$redis->set('key', 'value1');
$redis->append('key', 'value2', function ($result) {
    var_dump($result); // 12
}) ; 
$redis->get('key', function ($result) {
    var_dump($result); // 'value1value2'
}) ;

getRange

지정된 key에 저장된 문자열의 부분 문자열을 가져옵니다. 문자열의 잘라내기 범위는 start와 end 두 개의 오프셋에 의해 결정되며(시작과 끝 포함), key가 존재하지 않으면 빈 문자열을 반환합니다. key가 문자열 타입이 아닐 경우 false를 반환합니다.

$redis->set('key', 'string value');
$redis->getRange('key', 0, 5, function ($result) {
    var_dump($result); // 'string'
}) ; 
$redis->getRange('key', -5, -1 , function ($result) {
    var_dump($result); // 'value'
}) ;

setRange

지정된 문자열로 주어진 key의 저장된 문자열 값을 덮어씌우며, 덮어쓰기 시작 위치는 오프셋 offset부터 시작합니다. key가 존재하지 않으면 key를 지정된 문자열로 설정합니다. key가 문자열 타입이 아닐 경우 false를 반환합니다.

변경된 후의 문자열 길이를 반환합니다.

$redis->set('key', 'Hello world');
$redis->setRange('key', 6, "redis", function ($result) {
    var_dump($result); // 11
}) ; 
$redis->get('key', function ($result) {
    var_dump($result); // 'Hello redis'
}) ; 

strLen

지정된 key에 저장된 문자열 값의 길이를 가져옵니다. key에 저장된 값이 문자열이 아닐 경우 false를 반환합니다.

$redis->set('key', 'value');
$redis->strlen('key', function ($result) {
    var_dump($result); // 5
}) ; 

getBit

key에 저장된 문자열 값의 지정된 오프셋에서 비트를 가져옵니다.

$redis->set('key', "\x7f"); // 이는 0111 1111입니다.
$redis->getBit('key', 0, function ($result) {
    var_dump($result); // 0
}) ; 

setBit

key에 저장된 문자열 값의 지정된 오프셋에서 비트를 설정하거나 지웁니다.
반환값은 0 또는 1, 수정 전의 값입니다.

$redis->set('key', "*");    // ord("*") = 42 = 0x2f = "0010 1010"
$redis->setBit('key', 5, 1, function ($result) {
    var_dump($result); // 0
}) ; 

bitOp

여러 key(문자열 값 포함) 간에 비트 연산을 수행하고 그 결과를 대상 key에 저장합니다.

BITOP 명령은 네 가지 비트 연산을 지원합니다: AND, OR, XOR, 및 NOT.

반환 결과는 대상 key에 저장된 문자열의 크기이며, 이는 가장 긴 입력 문자열의 크기와 같습니다.

$redis->set('key1', "abc");
$redis->bitOp( 'AND', 'dst', 'key1', 'key2', function ($result) {
    var_dump($result); // 3
}) ;

bitCount

문자열에 설정된 비트 수를 계산합니다(인구수).

기본적으로, 문자열에 포함된 모든 바이트를 검사합니다. 추가 매개변수 startend를 넘길 경우 특정 범위 내에서 카운팅 작업을 지정할 수 있습니다.

GETRANGE 명령과 유사하게, 시작과 끝은 음수 값을 포함할 수 있어 문자열의 끝에서 시작하여 바이트를 인덱싱할 수 있습니다. 여기서 -1은 마지막 바이트이고, -2는 마지막에서 두 번째 바이트 등입니다.

결과는 문자열에서 값이 1인 비트 수를 반환합니다.

존재하지 않는 키는 빈 문자열로 간주되며, 따라서 이 명령은 0을 반환합니다.

$redis->set('key', 'hello');
$redis->bitCount( 'key', 0, 0, function ($result) {
    var_dump($result); // 3
}) ;
$redis->bitCount( 'key', function ($result) {
    var_dump($result); //21
}) ;

sort

sort 명령은 list, set 및 sorted set의 요소를 정렬할 수 있습니다.

원형: sort($key, $options, $callback);

여기서 options는 다음과 같은 선택적 key와 값입니다.

$options = [
     'by' => 'some_pattern_*',
    'limit' => [0, 1],
    'get' => 'some_other_pattern_*', // 또는 패턴의 배열
    'sort' => 'asc', // 또는 'desc'
    'alpha' => true,
    'store' => 'external-key'
];
$redis->del('s');
$redis->sAdd('s', 5);
$redis->sAdd('s', 4);
$redis->sAdd('s', 2);
$redis->sAdd('s', 1);
$redis->sAdd('s', 3);
$redis->sort('s', [], function ($result) {
    var_dump($result); // 1,2,3,4,5
}); 
$redis->sort('s', ['sort' => 'desc'], function ($result) {
    var_dump($result); // 5,4,3,2,1
}); 
$redis->sort('s', ['sort' => 'desc', 'store' => 'out'], function ($result) {
    var_dump($result); // (int)5
}); 

ttl, pttl

초/밀리초 단위로 key의 남은 만료 시간을 반환합니다.

key에 ttl이 없으면 -1을 반환합니다. key가 존재하지 않으면 -2를 반환합니다.

$redis->set('key', 'value', 10);
// 초 단위
$redis->ttl('key', function ($result) {
    var_dump($result); // 10
});
// 밀리초 단위
$redis->pttl('key', function ($result) {
    var_dump($result); // 9999
});
// key가 존재하지 않음
$redis->pttl('key-not-exists', function ($result) {
    var_dump($result); // -2
});

persist

지정된 key의 만료 시간을 제거하여 key가 영원히 만료되지 않도록 합니다.

성공적으로 제거되면 1을 반환하고, key가 존재하지 않거나 만료 시간이 없으면 0을 반환하며, 오류가 발생하면 false를 반환합니다.

$redis->persist('key');

mSet, mSetNx

원자 명령으로 다수의 key-value 쌍을 설정합니다. mSetNx는 모든 key를 설정한 경우에만 1을 반환합니다.

성공하면 1을 반환하고, 실패하면 0, 오류가 발생하면 false를 반환합니다.

$redis->mSet(['key0' => 'value0', 'key1' => 'value1']);

hSet

해시 테이블의 필드에 값을 설정합니다.

필드가 해시 테이블에 새로 생성된 필드인 경우, 값 설정이 성공하면 1을 반환합니다. 해시 테이블 내의 필드가 이미 존재하고 이전 값이 새로운 값으로 덮어씌워진 경우, 0을 반환합니다.

$redis->del('h');
$redis->hSet('h', 'key1', 'hello', function ($r) {
    var_dump($r); // 1
}); 
$redis->hGet('h', 'key1', function ($r) {
    var_dump($r); // hello
}); 
$redis->hSet('h', 'key1', 'plop', function ($r) {
    var_dump($r); // 0
});
$redis->hGet('h', 'key1', function ($r) {
    var_dump($r); // plop
}); 

hSetNx

해시 테이블에서 존재하지 않는 필드에 값을 설정합니다.

해시 테이블이 존재하지 않으면 새로운 해시 테이블이 생성되고 HSET 작업이 수행됩니다.

필드가 이미 해시 테이블에 존재하면 작업이 무효화됩니다.

key가 존재하지 않으면 새로운 해시 테이블이 생성되며 HSETNX 명령이 실행됩니다.

$redis->del('h');
$redis->hSetNx('h', 'key1', 'hello', function ($r) {
    var_dump($r); // 1
});
$redis->hSetNx('h', 'key1', 'world', function ($r) {
    var_dump($r); // 0
});

hGet

해시 테이블 내의 지정된 필드의 값을 반환합니다.

지정된 필드 또는 key가 존재하지 않으면 null을 반환합니다.

$redis->hGet('h', 'key1', function ($result) {
    var_dump($result);
});

hLen

해시 테이블 내의 필드 수를 가져오는 데 사용됩니다.

key가 존재하지 않으면 0을 반환합니다.

$redis->del('h');
$redis->hSet('h', 'key1', 'hello');
$redis->hSet('h', 'key2', 'plop');
$redis->hLen('h', function ($result) {
    var_dump($result); // 2
});

hDel

명령은 해시 테이블 key 내의 하나 이상의 지정된 필드를 삭제하는 데 사용되며, 존재하지 않는 필드는 무시됩니다.

성공적으로 삭제된 필드의 수를 반환하며, 무시된 필드는 포함되지 않습니다. key가 해시가 아닌 경우 false를 반환합니다.

$redis->hDel('h', 'key1');

hKeys

해시 테이블 내의 모든 필드를 배열 형태로 가져옵니다.

key가 존재하지 않으면 빈 배열을 반환합니다. key가 해시가 아닌 경우 false를 반환합니다.

$redis->hKeys('key', function ($result) {
    var_dump($result);
});

hVals

해시 테이블 내의 모든 필드 값을 배열 형태로 반환합니다.

key가 존재하지 않으면 빈 배열을 반환합니다. key가 해시가 아닌 경우 false를 반환합니다.

$redis->hVals('key', function ($result) {
    var_dump($result);
});

hGetAll

해시 테이블 내의 모든 필드와 값을 연관 배열 형태로 반환합니다.

key가 존재하지 않으면 빈 배열을 반환합니다. key가 해시 타입으로 설정되지 않으면 false를 반환합니다.

$redis->del('h');
$redis->hSet('h', 'a', 'x');
$redis->hSet('h', 'b', 'y');
$redis->hSet('h', 'c', 'z');
$redis->hSet('h', 'd', 't');
$redis->hGetAll('h', function ($result) {
    var_export($result); 
});

반환

array (
    'a' => 'x',
    'b' => 'y',
    'c' => 'z',
    'd' => 't',
)

hExists

해시 테이블의 지정된 필드가 존재하는지를 확인합니다. 존재하면 1을 반환하고, 필드가 존재하지 않거나 key가 존재하지 않으면 0을 반환하며, 오류가 발생하면 false를 반환합니다.

$redis->hExists('h', 'a', function ($result) {
    var_dump($result); //
});

hIncrBy

해시 테이블 내의 필드 값에 지정된 증가 값을 더하는 데 사용됩니다.

증가 값은 음수가 될 수 있으며, 이는 해당 필드에 대해 뺄셈 작업을 수행하는 것과 같습니다.

해시 테이블의 key가 존재하지 않으면 새로운 해시 테이블이 생성되고 HINCRBY 명령이 실행됩니다.

지정된 필드가 존재하지 않으면 명령을 실행하기 전에 필드의 값이 0으로 초기화됩니다.

문자열 값이 저장된 필드에서 HINCRBY 명령을 실행하면 false를 반환합니다.

이 작업의 값은 64비트(bit) 부호 있는 숫자 범위 내로 제한됩니다.

$redis->del('h');
$redis->hIncrBy('h', 'x', 2,  function ($result) {
    var_dump($result);
});

hIncrByFloat

hIncrBy와 유사하지만 증가 값이 부동 소수점입니다.

hMSet

동시에 여러 field-value(필드-값) 쌍을 해시 테이블에 설정합니다.

이 명령은 해시 테이블 내의 기존 필드를 덮어씁니다.

해시 테이블이 존재하지 않으면 빈 해시 테이블이 생성되고 HMSET 작업이 수행됩니다.

$redis->del('h');
$redis->hMSet('h', ['name' => 'Joe', 'sex' => 1])

hMGet

해시 테이블 내의 하나 이상의 지정된 필드의 값을 연관 배열 형태로 반환합니다.

지정된 필드가 해시 테이블에 존재하지 않으면 해당 필드는 null 값으로 반환됩니다. key가 해시가 아닌 경우 false를 반환합니다.

$redis->del('h');
$redis->hSet('h', 'field1', 'value1');
$redis->hSet('h', 'field2', 'value2');
$redis->hMGet('h', ['field1', 'field2', 'field3'], function ($r) {
    var_export($r);
});

출력

array (
 'field1' => 'value1',
 'field2' => 'value2',
 'field3' => null
)

blPop, brPop

리스트에서 첫 번째/마지막 요소를 제거하고 가져옵니다. 리스트에 요소가 없으면 대기 시간 초과까지 대기하며, 대기 시간 초과 후에도 제거할 요소가 발견되지 않으면 null을 반환합니다.

$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');

$redis->blPop(['key1', 'key2'], 10, function ($r) {
    var_export($r); // array ( 0 => 'key1',1 => 'a')
});

Timer::add(1, function () use ($redis2) {
    $redis2->lpush('key1', 'a');
});

bRPopLPush

리스트에서 마지막 요소를 제거하고 다른 리스트의 머리로 삽입합니다. 리스트에 요소가 없으면 대기 시간 초과까지 대기하며, 대기 시간 초과 후에도 제거할 요소가 발견되지 않으면 null을 반환합니다.

$redis = new Client('redis://127.0.0.1:6379');
$redis2 = new Client('redis://127.0.0.1:6379');
$redis->del(['key1', 'key2']);
$redis->bRPopLPush('key1', 'key2', 2, function ($r) {
    var_export($r);
});
Timer::add(2, function () use ($redis2) {
    $redis2->lpush('key1', 'a');
    $redis2->lRange('key2', 0, -1, function ($r) {
        var_dump($r);
    });
}, null, false);

lIndex

인덱스를 사용하여 리스트의 요소를 가져옵니다. 음수 인덱스를 사용하는 경우 -1은 리스트의 마지막 요소를, -2는 마지막에서 두 번째 요소를 나타냅니다.

지정된 인덱스 값이 리스트의 범위 밖인 경우 null을 반환합니다. 해당 key가 리스트 타입이 아닐 경우 false를 반환합니다.

$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lindex('key1', 0, function ($r) {
    var_dump($r); // A
});

lInsert

리스트의 요소 앞이나 뒤에 요소를 삽입합니다. 지정된 요소가 리스트에 존재하지 않을 경우 아무 작업도 수행하지 않습니다.

리스트가 존재하지 않을 경우 빈 리스트로 처리되며, 아무 작업도 수행하지 않습니다.

key가 리스트가 아닌 타입일 경우 false를 반환합니다.

$redis->del('key1');
$redis->lInsert('key1', 'after', 'A', 'X', function ($r) {
    var_dump($r); // 0
});
$redis->lPush('key1', 'A');
$redis->lPush('key1', 'B');
$redis->lPush('key1', 'C');
$redis->lInsert('key1', 'before', 'C', 'X', function ($r) {
    var_dump($r); // 4
});
$redis->lRange('key1', 0, -1, function ($r) {
    var_dump($r); // ['A', 'B', 'X', 'C']
});

lPop

리스트의 첫 번째 요소를 제거하고 반환합니다.

리스트의 key가 존재하지 않으면 null을 반환합니다.

$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->lPop('key1', function ($r) {
    var_dump($r); // A
});

lPush

하나 이상의 값을 리스트의 헤드로 삽입합니다. key가 존재하지 않을 경우 빈 리스트가 생성되고 LPUSH 작업이 수행됩니다. key가 존재하지만 리스트 타입이 아닐 경우 false를 반환합니다.

주의: Redis 2.4 버전 이전의 LPUSH 명령은 단일 value 값만 허용합니다.

$redis->del('key1');
$redis->lPush('key1', 'A');
$redis->lPush('key1', ['B','C']);
$redis->lRange('key1', 0, -1, function ($r) {
    var_dump($r); // ['C', 'B', 'A']
});

lPushx

이미 존재하는 리스트의 헤드에 값을 삽입하며, 리스트가 존재하지 않을 경우 작업이 무효화되고 0을 반환합니다. key가 리스트 타입이 아닐 경우 false를 반환합니다.

리턴 값은 lPushx 명령 실행 후 리스트의 길이입니다.

$redis->del('key1');
    $redis->lPush('key1', 'A');
$redis->lPushx('key1', ['B','C'], function ($r) {
    var_dump($r); // 3
});
$redis->lRange('key1', 0, -1, function ($r) {
    var_dump($r); // ['C', 'B', 'A']
});

lRange

지정된 범위 내의 리스트 요소를 반환합니다. 범위는 오프셋 START와 END로 지정됩니다. 0은 리스트의 첫 번째 요소를, 1은 리스트의 두 번째 요소를 나타냅니다. 음수 인덱스를 사용할 경우 -1은 리스트의 마지막 요소를, -2는 마지막에서 두 번째 요소를 나타냅니다.

지정된 범위 내의 요소 배열을 포함하는 것을 반환합니다. key가 리스트 타입이 아닐 경우 false를 반환합니다.

$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1, function ($r) {
    var_dump($r); // ['C', 'B', 'A']
});

lRem

매개변수 COUNT의 값에 따라 리스트에서 매개변수 VALUE와 같은 요소를 제거합니다.

COUNT의 값은 다음 중 하나 일 수 있습니다:

  • count > 0 : 리스트의 머리에서 꼬리까지 검색하며 VALUE와 같은 요소를 제거하며 개수는 COUNT입니다.
  • count < 0 : 리스트의 꼬리에서 머리로 검색하며 VALUE와 같은 요소를 제거하며 개수는 COUNT의 절대값입니다.
  • count = 0 : 리스트 내의 모든 VALUE와 같은 값을 제거합니다.

제거된 요소의 개수를 반환합니다. 리스트가 존재하지 않을 경우 0을 반환하며, 리스트가 아닐 경우 false를 반환합니다.

$redis->lRem('key1', 2, 'A', function ($r) {
    var_dump($r); 
});

lSet

인덱스를 사용하여 요소의 값을 설정합니다.

성공하면 true를 반환하며, 인덱스 매개변수가 범위를 초과하거나 빈 리스트에 대해 LSET을 수행할 경우 false를 반환합니다.

$redis->lSet('key1', 0, 'X');

lTrim

리스트를 잘라내어(trim) 지정된 범위 내의 요소만 유지합니다. 지정된 범위 외의 요소는 모두 삭제됩니다.

인덱스 0은 리스트의 첫 번째 요소를 나타내며, 1는 리스트의 두 번째 요소를 나타냅니다. 음수 인덱스를 사용할 경우 -1은 리스트의 마지막 요소를, -2는 마지막에서 두 번째 요소를 나타냅니다.

성공하면 true를 반환하며, 실패할 경우 false를 반환합니다.

$redis->del('key1');

$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lRange('key1', 0, -1, function ($r) {
    var_dump($r); // ['A', 'B', 'C']
});
$redis->lTrim('key1', 0, 1);
$redis->lRange('key1', 0, -1, function ($r) {
    var_dump($r); // ['A', 'B']
});

rPop

리스트의 마지막 요소를 제거하고, 제거된 요소를 반환합니다.

리스트가 존재하지 않으면 null을 반환합니다.

$redis->rPop('key1', function ($r) {
    var_dump($r);
});

rPopLPush

리스트의 마지막 요소를 제거하고 그 요소를 다른 리스트에 추가하여 반환합니다.

$redis->del('x', 'y');
$redis->lPush('x', 'abc');
$redis->lPush('x', 'def');
$redis->lPush('y', '123');
$redis->lPush('y', '456');
$redis->rPopLPush('x', 'y', function ($r) {
    var_dump($r); // abc
});
$redis->lRange('x', 0, -1, function ($r) {
    var_dump($r); // ['def']
});
$redis->lRange('y', 0, -1, function ($r) {
    var_dump($r); // ['abc', '456', '123']
});

rPush

하나 이상의 값을 리스트의 꼬리(오른쪽)에 삽입하고 삽입 후 리스트의 길이를 반환합니다.

리스트가 존재하지 않으면 빈 리스트가 생성되고 RPUSH 작업이 수행됩니다. 리스트가 존재하지만 리스트 타입이 아닐 경우 false를 반환합니다.

주의: Redis 2.4 버전 이전의 RPUSH 명령은 단일 value 값만 허용합니다.

$redis->del('key1');
$redis->rPush('key1', 'A', function ($r) {
    var_dump($r); // 1
});

rPushX

이미 존재하는 리스트의 꼬리에 값을 삽입하고 리스트의 길이를 반환합니다. 리스트가 존재하지 않으면 작업이 무효화되고 0을 반환하며, 리스트가 존재하지만 리스트 타입이 아닐 경우 false를 반환합니다.

$redis->del('key1');
$redis->rPushX('key1', 'A', function ($r) {
    var_dump($r); // 0
});

lLen

리스트의 길이를 반환합니다. 리스트의 key가 존재하지 않으면 key는 빈 리스트로 간주되어 0을 반환합니다. key가 리스트 타입이 아닐 경우 false를 반환합니다.

$redis->del('key1');
$redis->rPush('key1', 'A');
$redis->rPush('key1', 'B');
$redis->rPush('key1', 'C');
$redis->lLen('key1', function ($r) {
    var_dump($r); // 3
});

sAdd

하나 이상의 멤버 요소를 집합에 추가하며, 이미 집합에 존재하는 멤버 요소는 무시됩니다.

집합 key가 존재하지 않으면 추가된 요소만 포함하는 집합을 생성합니다.

집합 key가 집합 타입이 아닐 경우 false를 반환합니다.

주의: Redis 2.4 버전 이전의 SADD는 단일 멤버 값만 수용합니다.

$redis->del('key1');
$redis->sAdd('key1', 'member1');
$redis->sAdd('key1', ['member2', 'member3'], function ($r) {
    var_dump($r); // 2
});
$redis->sAdd('key1', 'member2', function ($r) {
    var_dump($r); // 0
});

sCard

집합 내 요소의 수를 반환합니다. 집합 key가 존재하지 않으면 0을 반환합니다.

$redis->del('key1');
$redis->sAdd('key1', 'member1');
$redis->sAdd('key1', 'member2');
$redis->sAdd('key1', 'member3');
$redis->sCard('key1', function ($r) {
    var_dump($r); // 3
});
$redis->sCard('keyX', function ($r) {
    var_dump($r); // 0
});

sDiff

첫 번째 집합과 다른 집합 간의 차이점을 반환하며, 첫 번째 집합에만 고유한 요소라고 볼 수 있습니다. 존재하지 않는 집합 key는 빈 집합으로 처리합니다.

$redis->del('s0', 's1', 's2');

$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s0', '3');
$redis->sAdd('s0', '4');
$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');
$redis->sDiff(['s0', 's1', 's2'], function ($r) {
    var_dump($r); // ['2', '4']
});

sDiffStore

주어진 집합 간의 차집합을 지정된 집합에 저장합니다. 지정된 집합 key가 존재하는 경우 덮어씌워집니다.

$redis->del('s0', 's1', 's2');
$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s0', '3');
$redis->sAdd('s0', '4');
$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');
$redis->sDiffStore('dst', ['s0', 's1', 's2'], function ($r) {
    var_dump($r); // 2
});
$redis->sMembers('dst', function ($r) {
    var_dump($r); // ['2', '4']
});

sInter

모든 주어진 집합의 교집합을 반환합니다. 존재하지 않는 집합 key는 빈 집합으로 처리되며, 주어진 집합 중 하나가 빈 집합일 경우 결과도 빈 집합이 됩니다.

$redis->del('s0', 's1', 's2');
$redis->sAdd('key1', 'val1');
$redis->sAdd('key1', 'val2');
$redis->sAdd('key1', 'val3');
$redis->sAdd('key1', 'val4');
$redis->sAdd('key2', 'val3');
$redis->sAdd('key2', 'val4');
$redis->sAdd('key3', 'val3');
$redis->sAdd('key3', 'val4');
$redis->sInter(['key1', 'key2', 'key3'], function ($r) {
    var_dump($r); // ['val4', 'val3']
});

sInterStore

주어진 집합 간의 교집합을 지정된 집합에 저장하고 저장된 교집합의 개수를 반환합니다. 지정된 집합이 존재하는 경우, 이를 덮어씌웁니다.

$redis->sAdd('key1', 'val1');
$redis->sAdd('key1', 'val2');
$redis->sAdd('key1', 'val3');
$redis->sAdd('key1', 'val4');

$redis->sAdd('key2', 'val3');
$redis->sAdd('key2', 'val4');

$redis->sAdd('key3', 'val3');
$redis->sAdd('key3', 'val4');

$redis->sInterStore('output', 'key1', 'key2', 'key3', function ($r) {
    var_dump($r); // 2
});
$redis->sMembers('output', function ($r) {
    var_dump($r); // ['val4', 'val3']
});

sIsMember

멤버 요소가 집합의 멤버인지 판단합니다.

멤버 요소가 집합의 멤버인 경우 1을 반환합니다. 멤버 요소가 집합의 멤버가 아닌 경우, 또는 key가 존재하지 않으면 0을 반환합니다. key가 집합 타입이 아닐 경우 false를 반환합니다.

$redis->sIsMember('key1', 'member1', function ($r) {
    var_dump($r); 
});

sMembers

집합 내 모든 멤버를 반환합니다. 존재하지 않는 집합 key는 빈 집합으로 처리됩니다.

$redis->sMembers('s', function ($r) {
    var_dump($r); 
});

sMove

지정된 멤버 member 요소를 source 집합에서 destination 집합으로 이동합니다.

SMOVE는 원자적 작업입니다.

source 집합이 존재하지 않거나 지정된 member 요소가 포함되어 있지 않으면 SMOVE 명령은 아무 작업도 수행하지 않고 0을 반환합니다. 그렇지 않으면, member 요소는 source 집합에서 제거되며, destination 집합에 추가됩니다.

destination 집합에 member 요소가 이미 포함되어 있으면, SMOVE 명령은 단순히 source 집합에서 member 요소를 제거합니다.

source 또는 destination이 집합 타입이 아닐 경우 false를 반환합니다.

$redis->sMove('key1', 'key2', 'member13');

sPop

집합에서 지정된 key의 임의의 요소를 하나 또는 여러 개 제거합니다. 제거한 후에는 제거된 요소를 반환합니다.

집합이 존재하지 않거나 빈 집합일 경우 null을 반환합니다.

$redis->del('key1');
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3');
$redis->sPop('key1', function ($r) {
    var_dump($r); // member3
});
$redis->sAdd('key2', ['member1', 'member2', 'member3']);
$redis->sPop('key2', 3, function ($r) {
    var_dump($r); // ['member1', 'member2', 'member3']
});

sRandMember

Redis Srandmember 명령은 집합에서 임의의 요소를 반환합니다.

Redis 2.6 버전부터 Srandmember 명령은 선택적인 count 매개변수를 허용합니다:

  • count가 양수이고 집합의 기수보다 작으면, 명령은 count 개의 요소로 구성된 배열을 반환합니다. 배열 내 요소는 서로 다릅니다. count가 집합의 기수보다 크거나 같으면 전체 집합을 반환합니다.
  • count가 음수인 경우, 명령은 배열을 반환하며, 요소는 여러 번 나타날 수 있고, 배열의 길이는 count의 절댓값입니다.

이 작업은 SPOP과 유사하지만, SPOP은 집합에서 임의의 요소를 제거하고 반환하는 반면, Srandmember는 단순히 임의의 요소를 반환하며 집합에 아무 변경도 가하지 않습니다.

$redis->del('key1');
$redis->sAdd('key1' , 'member1');
$redis->sAdd('key1' , 'member2');
$redis->sAdd('key1' , 'member3'); 

$redis->sRandMember('key1', function ($r) {
    var_dump($r); // member1
});

$redis->sRandMember('key1', 2, function ($r) {
    var_dump($r); // ['member1', 'member2']
});
$redis->sRandMember('key1', -100, function ($r) {
    var_dump($r); // ['member1', 'member2', 'member3', 'member3', ...]
});
$redis->sRandMember('empty-set', 100, function ($r) {
    var_dump($r); // []
}); 
$redis->sRandMember('not-a-set', 100, function ($r) {
    var_dump($r); // []
});

sRem

집합에서 하나 이상의 멤버 요소를 제거합니다. 존재하지 않는 멤버 요소는 무시됩니다.

성공적으로 제거된 요소의 개수를 반환하며, 무시된 요소는 포함하지 않습니다.

key가 집합 타입이 아닐 경우 false를 반환합니다.

Redis 2.4 버전 이전의 SREM은 단일 멤버 값만 허용합니다.

$redis->sRem('key1', ['member2', 'member3'], function ($r) {
    var_dump($r); 
});

sUnion

명령은 주어진 집합의 합집합을 반환합니다. 존재하지 않는 집합 key는 빈 집합으로 처리됩니다.

$redis->sUnion(['s0', 's1', 's2'], function ($r) {
    var_dump($r); // []
});

sUnionStore

주어진 집합의 합집합을 지정된 집합 destination에 저장하고 요소 수를 반환합니다. destination이 이미 존재하면 이를 덮어씌웁니다.

$redis->del('s0', 's1', 's2');
$redis->sAdd('s0', '1');
$redis->sAdd('s0', '2');
$redis->sAdd('s1', '3');
$redis->sAdd('s1', '1');
$redis->sAdd('s2', '3');
$redis->sAdd('s2', '4');
$redis->sUnionStore('dst', 's0', 's1', 's2', function ($r) {
    var_dump($r); // 4
});
$redis->sMembers('dst', function ($r) {
    var_dump($r); // ['1', '2', '3', '4']
});