workerman-redis

Introdução

workeman/redis é um componente de redis assíncrono baseado em workerman.

Nota
O objetivo principal deste projeto é implementar a assinatura assíncrona do redis (subscribe, pSubscribe).
Como o redis é rápido o suficiente, a menos que seja necessário assinaturas assíncronas psubscribe subscribe, não é necessário usar este cliente assíncrono. A extensão redis oferecerá um desempenho melhor.

Instalação:

composer require workerman/redis

Uso de Callback

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();

Uso de Corotina

Nota
O uso de corotina requer workerman>=5.0, workerman/redis>=2.0.0 e a instalação com 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();

Quando não há função de retorno de chamada definida, o cliente retornará o resultado do pedido assíncrono de forma síncrona, sem bloquear o processo atual, permitindo o processamento concorrente dos pedidos.

Nota
psubscribe subscribe não suporta o uso de corotina.

Documentação

Explicação

No método de retorno de chamada, geralmente há 2 parâmetros na função de retorno ($result, $redis), onde $result é o resultado e $redis é a instância do redis. Por exemplo:

use Workerman\Redis\Client;
$redis = new Client('redis://127.0.0.1:6379');
// Definir a função de retorno para verificar o resultado do comando set
$redis->set('key', 'value', function ($result, $redis) {
    var_dump($result); // true
});
// As funções de retorno são opcionais, então é omitida aqui
$redis->set('key1', 'value1');
// Funções de retorno podem ser aninhadas
$redis->get('key', function ($result, $redis){
    $redis->set('key2', 'value2', function ($result) {
        var_dump($result);
    });
});

Conexão

use Workerman\Redis\Client;
// Omitir função de retorno
$redis = new Client('redis://127.0.0.1:6379');
// Com função de retorno
$redis = new Client('redis://127.0.0.1:6379', [
    'connect_timeout' => 10 // Definir um tempo de conexão de 10 segundos, o padrão é 5 segundos se não estiver definido
], function ($success, $redis) {
    // Função de retorno da conexão
    if (!$success) echo $redis->error();
});

auth

// Autenticação de senha
$redis->auth('senha', function ($result) {

});
// Autenticação de nome de usuário e senha
$redis->auth('nome de usuário', 'senha', function ($result) {

});

pSubscribe

Subscreve a um ou mais canais que correspondem a um padrão específico.

Cada padrão usa '' como curinga, por exemplo, it* corresponde a todos os canais que começam com "it" (como it.news, it.blog, it.tweets, etc). news. corresponde a todos os canais que começam com "news." (como news.it, news.global.today, etc), e assim por diante.

Observe: a função de retorno de pSubscribe possui 4 parâmetros ($pattern, $channel, $message, $redis).

Após chamar os métodos pSubscribe ou subscribe da instância $redis, a chamada de outros métodos na mesma instância será ignorada.

$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

Usado para assinar um ou mais canais específicos.

Observação: a função de retorno de subscribe possui 3 parâmetros ($channel, $message, $redis).

Após chamar os métodos pSubscribe ou subscribe da instância $redis, a chamada de outros métodos na mesma instância será ignorada.

$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

Usado para enviar informações para um canal específico.

Retorna o número de assinantes que receberam a mensagem.

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

select

// Omitir função de retorno
$redis->select(2);
$redis->select('test', function ($result, $redis) {
    // O parâmetro select deve ser numérico, então $result será false aqui
    var_dump($result, $redis->error());
});

get

Comando usado para obter o valor de uma chave específica. Se a chave não existir, retorna NULL. Se o valor armazenado na chave não for do tipo string, retorna false.

$redis->get('key', function($result) {
     // Se a chave não existir, retorna NULL, se houver um erro, retorna false
    var_dump($result);
});

set

Usado para definir o valor de uma chave específica. Se a chave já tiver um valor, o SET sobrescreverá o valor antigo, ignorando o tipo.

$redis->set('key', 'value');
$redis->set('key', 'value', function($result){});
// O terceiro parâmetro pode levar um tempo de expiração, expira em 10 segundos
$redis->set('key','value', 10);
$redis->set('key','value', 10, function($result){});

setEx, pSetEx

Define o valor de uma chave com seu tempo de expiração. Se a chave já existir, o comando SETEX substituirá o valor antigo.

// Observe que o segundo parâmetro é o tempo de expiração em segundos
$redis->setEx('key', 3600, 'value'); 
// pSetEx com tempo em milissegundos
$redis->pSetEx('key', 3600, 'value');

del

Usado para excluir chaves existentes. O resultado é o número de chaves excluídas (as chaves inexistentes não são contadas).

// Excluir uma chave
$redis->del('key');
// Excluir várias chaves
$redis->del(['key', 'key1', 'key2']);

setNx

(Set If Not Exists) usado para definir um valor para uma chave que não existe.

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

exists

Usado para verificar se uma chave específica existe. O resultado é o número de chaves existentes.

$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

Incrementa o valor de uma chave específica em 1 ou pelo valor especificado. Se a chave não existir, ela será inicializada como 0 e a operação de incremento / incremento será executada.
Se o valor for de um tipo incorreto ou se uma string não puder ser representada como número, retorna false. Retorna o valor após o aumento com sucesso.

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

incrByFloat

Adiciona o valor flutuante especificado à chave. Se a chave não existir, a operação assume que o valor inicial é 0. Se o valor for de um tipo incorreto ou se uma string não puder ser representada como número, retorna false. Retorna o valor após o aumento com sucesso.

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

decr, decrBy

Diminui o valor da chave em 1 ou pelo valor especificado. Se a chave não existir, ela será inicializada como 0 e a operação de decremento / decremento será executada.
Se o valor for de um tipo incorreto ou se uma string não puder ser representada como número, retorna false. Retorna o valor após a redução com sucesso.

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

mGet

Retorna todos (um ou mais) valores das chaves especificadas. Se alguma chave não existir, retornará NULL para essa chave.

$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

Usado para definir o valor de uma chave especificada e retornar o valor antigo da chave.

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

randomKey

Retorna uma chave aleatória do banco de dados atual.

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

move

Move a chave do banco de dados atual para o banco de dados especificado.

$redis->select(0); // mudar para o DB 0
$redis->set('x', '42'); // escrever 42 em x
$redis->move('x', 1, function ($result) { // mover para o DB 1
    var_dump($result); // 1
});
$redis->select(1); // mudar para o DB 1
$redis->get('x', function ($result) {
    var_dump($result); // '42'
});

rename

Renomeia uma chave, retornando false se a chave não existe.

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

renameNx

Renomeia uma chave somente se a nova chave não existir.

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

expire

Define o tempo de expiração de uma chave em segundos. Retorna 1 em caso de sucesso, 0 se a chave não existe e falso em caso de erro.

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

keys

Usado para encontrar todas as chaves que correspondem ao padrão especificado.

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

type

Retorna o tipo de valor armazenado em uma chave, que pode ser string, set, list, zset, hash ou none (caso a chave não exista).

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

append

Se a chave existir e for uma string, APPEND acrescenta o valor à chave existente e retorna o comprimento da string resultante.

Se a chave não existir, APPEND cria a chave com o valor especificado e retorna o comprimento da string.
Se a chave existir, mas não for uma string, retorna 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

Obtém uma subcadeia de uma string armazenada em uma chave. Retorna uma string vazia se a chave não existir e false se a chave não for uma string.

$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

Substitui uma parte de uma string por outra a partir da posição especificada. Se a chave não existir, ela é criada e definida com a string especificada.
Retorna o comprimento da string após a modificação.

$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

Retorna o comprimento da string armazenada em uma chave. Retorna false se a chave não armazenar uma string.

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

getBit

Retorna o valor de um bit em uma posição específica de uma string armazenada em uma chave.

$redis->set('key', "\x7f"); // isso é 0111 1111
$redis->getBit('key', 0, function ($result) {
    var_dump($result); // 0
});

setBit

Define ou limpa o valor de um bit em uma posição específica de uma string armazenada em uma chave. Retorna 0 ou 1, representando o valor antes da modificação.

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

bitOp

Realiza operações bitwise em uma ou mais chaves e armazena o resultado em uma chave de destino.
As operações suportadas são AND, OR, XOR e NOT.
Retorna o tamanho da string armazenada na chave de destino, que é igual ao tamanho da string mais longa de entrada.

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

bitCount

Calcula o número de bits setados (população) em uma string.
Por padrão, verifica todos os bytes na string. A contagem só pode ser especificada passando os parâmetros adicionais inicio e fim.
Assim como no comando GETRANGE, inicio e fim podem conter valores negativos para indexar bytes a partir do final da string, onde -1 é o último byte, -2 é o penúltimo byte, e assim por diante.
Retorna o número de bits com valor 1 na string.
Chaves inexistentes são tratadas como strings vazias, portanto o comando retornará zero.

$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

A ordenação pode ser realizada nos elementos de listas, conjuntos e conjuntos ordenados.
O protótipo é sort($key, $options, $callback).

O parâmetro de opções é um array que pode conter os seguintes valores:

$options = [
    'by' => 'some_pattern_*',
    'limit' => [0, 1],
    'get' => 'some_other_pattern_*', // or an array of patterns
    'sort' => 'asc', // or '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

Retorna o tempo restante para expirar uma chave, em segundos ou milissegundos.

Se a chave não tiver tempo para viver, retorna -1. Se a chave não existir, retorna -2.

$redis->set('key', 'value', 10);
// em segundos
$redis->ttl('key', function ($result) {
    var_dump($result); // 10
});
// em milissegundos
$redis->pttl('key', function ($result) {
    var_dump($result); // 9999
});
// chave não existe
$redis->pttl('key-not-exists', function ($result) {
    var_dump($result); // -2
});

persist

Remove o tempo de vida de uma chave, tornando-a com tempo de vida indefinido.

Retorna 1 se o tempo de vida for removido com sucesso, 0 se a chave não existir ou não tiver tempo de vida, e false em caso de erro.

$redis->persist('key');

mSet, mSetNx

Define diversos pares chave-valor em um único comando atômico. mSetNx apenas retorna 1 se todos os pares de chaves forem definidos.
Retorna 1 em caso de sucesso, 0 em caso de falha e false em caso de erro.

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

hSet

Atribui um valor a um campo específico no hash.

Se o campo é novo e foi atribuido com sucesso, retorna 1. Se o campo já existir no hash e o valor antigo foi sobrescrito com sucesso, retorna 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

Atribui um valor a um campo no hash somente se o campo não existir.

Se o hash não existir, um novo hash é criado e a operação é realizada.
Se o campo já existir no hash, a operação é inválida.

Se a chave não existir, um novo hash é criado e o comando HSETNX é executado.

$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

Retorna o valor de um campo específico no hash.

Se o campo ou a chave não existirem, retorna null.

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

hLen

Usado para obter a quantidade de campos em uma tabela hash.

Retorna 0 se a chave não existir.

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

hDel

Comando usado para excluir um ou mais campos específicos da tabela hash. Os campos inexistentes serão ignorados.

Retorna a quantidade de campos excluídos com sucesso, sem contar os campos ignorados. Retorna false se a chave não for uma hash.

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

hKeys

Obtém todos os campos da tabela hash em um array.

Retorna um array vazio se a chave não existir ou false se a chave não for uma hash.

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

hVals

Retorna os valores de todos os campos da tabela hash em um array.

Retorna um array vazio se a chave não existir ou false se a chave não for uma hash.

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

hGetAll

Retorna um array associativo contendo todos os campos e valores da tabela hash.

Retorna um array vazio se a chave não existir, ou false se a chave não for do tipo hash.

$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); 
});

Retorno

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

hExists

Verifica se um campo específico existe na tabela hash. Retorna 1 se existir, 0 se o campo ou a chave não existirem, e false em caso de erro.

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

hIncrBy

Usado para incrementar o valor de um campo na tabela hash por um valor especificado. O incremento pode ser um número negativo para subtrair do campo.

Se a chave da hash não existir, uma nova hash será criada e o comando HINCRBY será executado.

Se o campo especificado não existir, o valor do campo será inicializado como 0 antes da execução do comando.

Ao executar o comando HINCRBY em um campo que armazena um valor de string, ele retorna false.

O valor resultante é limitado a um número inteiro de 64 bits.

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

hIncrByFloat

Similar ao hIncrBy, mas o valor do incremento é do tipo float.

hMSet

Define múltiplos pares campo-valor na tabela hash.

Este comando substituirá os campos existentes na tabela hash.

Se a tabela hash não existir, uma nova tabela hash será criada e o comando HINCRBY será executado.

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

hMGet

Retorna um array associativo contendo os valores de um ou mais campos especificados da tabela hash.

Se o campo especificado não existir na tabela hash, o valor correspondente no array será null. Se a chave não for do tipo hash, retorna 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);
});

Saída

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

blPop, brPop

Remove e obtém o primeiro/último elemento da lista, bloqueando se a lista estiver vazia até que um elemento possa ser removido ou um tempo limite seja atingido.

$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

Remove o último elemento da lista e o insere no início de outra lista; bloqueia se a lista estiver vazia até que um elemento possa ser removido ou um tempo limite seja atingido. Retorna null se houver um tempo limite.

$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

Obtém o elemento da lista por índice. Índices negativos podem ser usados, -1 representa o último elemento da lista, -2 o penúltimo, e assim por diante.

Retorna null se o índice estiver fora do intervalo da lista ou false se a chave não for uma lista.

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

lInsert

Insere um elemento antes ou depois de um elemento específico na lista. Não faz nada se o elemento especificado não existir na lista ou se a lista não existir.

Retorna 0 se não realizar nenhuma inserção, o número de elementos na lista após a inserção em outros casos. Retorna false se a chave não for do tipo lista.

$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

Remove e retorna o primeiro elemento da lista.

Retorna null se a lista key não existir.

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

lPush

Insere um ou mais valores no início da lista. Se a chave não existir, uma lista vazia será criada e o comando será executado. Retorna false se a chave existir mas não for do tipo lista.

Nota: Antes da versão 2.4 do Redis, o comando LPUSH só aceitava um único valor.

$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

Insere um valor no início de uma lista existente, operação inválida se a lista não existir. Retorna 0 se a operação não for realizada, o comprimento da lista após a inserção em outros casos. Retorna false se a chave não for do tipo lista.

$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

Retorna os elementos da lista dentro do intervalo especificado pelos índices START e END. O índice 0 representa o primeiro elemento, 1 o segundo e assim por diante. Índices negativos podem ser usados, -1 representa o último elemento da lista, -2 o penúltimo, e assim por diante.

Retorna um array contendo os elementos dentro do intervalo especificado. Retorna false se a chave não for do tipo lista.

$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

Remove os elementos da lista que são iguais ao valor especificado. A quantidade de elementos removidos depende do parâmetro COUNT. Se a contagem for 0, todos os elementos com o valor especificado serão removidos.

Retorna a quantidade de elementos removidos. Se a lista não existe, retorna 0. Retorna false se a chave não for do tipo lista.

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

lSet

Define o valor de um elemento na lista por um índice específico. Retorna true em caso de sucesso, retorna false se o índice estiver fora do intervalo da lista ou se a lista estiver vazia.

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

lTrim

Trim sobre uma lista significa que apenas os elementos dentro do intervalo especificado serão mantidos na lista, e os elementos fora desse intervalo serão excluídos.

O índice 0 representa o primeiro elemento da lista, 1 representa o segundo elemento e assim por diante. Você também pode usar índices negativos, onde -1 indica o último elemento da lista, -2 indica o penúltimo elemento e assim por diante.

Retorna true em caso de sucesso e false em caso de falha.

$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

Usado para remover o último elemento de uma lista e retorna o valor removido.

Quando a lista não existe, retorna null.

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

rPopLPush

Remove o último elemento de uma lista e o adiciona a outra lista, retornando o valor removido.

$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

Insere um ou mais valores no final de uma lista e retorna o comprimento da lista após a inserção.

Se a lista não existir, uma lista vazia será criada e a operação RPUSH será executada. Se a lista existir, mas não for do tipo lista, retorna false.

Observação: Na versão do Redis anterior à 2.4, o comando RPUSH aceitava apenas um valor.

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

rPushX

Insere um valor no final de uma lista existente e retorna o comprimento da lista. Se a lista não existir, a operação falha e retorna 0. Se a lista existir, mas não for do tipo lista, retorna false.

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

lLen

Retorna o comprimento da lista. Se a chave da lista não existir, é considerada como uma lista vazia e retorna 0. Se a chave não for do tipo lista, retorna 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

Adiciona um ou mais membros a um conjunto, ignorando os membros que já estão presentes.

Se a chave do conjunto não existir, cria um conjunto com os membros adicionados.

Se a chave do conjunto não for do tipo conjunto, retorna false.

Observação: Na versão do Redis anterior à 2.4, o comando SADD aceitava apenas um membro por vez.

$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

Retorna a quantidade de elementos do conjunto. Se a chave do conjunto não existir, retorna 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

Retorna os elementos que estão presente no primeiro conjunto e não em outros conjuntos, ou seja, os elementos que são exclusivos do primeiro conjunto. Os conjuntos ausentes são tratados como conjuntos vazios.

$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

Armazena a diferença entre os conjuntos fornecidos em um novo conjunto e retorna a quantidade de elementos armazenados.

Se o conjunto especificado já existir, ele será substituído.

$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

Retorna a interseção de todos os conjuntos fornecidos. Os conjuntos ausentes são tratados como conjuntos vazios.

$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

Armazena a interseção dos conjuntos fornecidos em um novo conjunto e retorna a quantidade de elementos armazenados.

Se o conjunto especificado já existir, ele será substituído.

$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

Verifica se o membro dado pertence ao conjunto especificado.

Retorna 1 se o membro pertence ao conjunto, 0 se não pertence ou se a chave não existir, e false se a chave não for do tipo conjunto.

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

sMembers

Retorna todos os membros do conjunto. Se a chave do conjunto não existir, retorna um conjunto vazio.

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

sMove

Move um membro de um conjunto de origem para um conjunto de destino.

SMOVE é uma operação atômica. Se o conjunto de origem não existir ou não contiver o membro especificado, a operação SMOVE não é executada e retorna 0. Caso contrário, o membro é removido do conjunto de origem e adicionado ao conjunto de destino.

Se o conjunto de origem ou de destino não for do tipo conjunto, retorna false.

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

sPop

Remove um ou mais elementos aleatórios do conjunto especificado e retorna os elementos removidos.

Se o conjunto não existir ou estiver vazio, retorna 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

O comando Srandmember do Redis é usado para retornar um elemento aleatório do conjunto.

A partir da versão 2.6 do Redis, o comando Srandmember aceita um parâmetro count opcional:

  • Se count for um número positivo e menor que o número de membros do conjunto, o comando retornará um array de count membros, onde cada membro é exclusivo. Se count for maior ou igual ao número de membros do conjunto, o comando retornará todo o conjunto.
  • Se count for um número negativo, o comando retornará um array onde os membros podem ser repetidos várias vezes, com o comprimento do array sendo o valor absoluto de count.

Essa operação é semelhante ao SPOP, mas enquanto o SPOP remove e retorna um elemento aleatório do conjunto, o Srandmember apenas retorna o elemento aleatório, sem alterar o conjunto.

$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

Remove um ou mais membros de um conjunto, os membros que não existem serão ignorados.

Retorna a quantidade de membros removidos com sucesso, excluindo os membros ignorados.

Retorna falso se a chave não for do tipo conjunto.

Antes da versão 2.4 do Redis, o comando SREM aceitava apenas um valor de membro.

$redis->sRem('chave1', ['membro2', 'membro3'], function ($r) {
    var_dump($r); 
});

sUnion

O comando retorna a união dos conjuntos fornecidos. Os conjuntos que não existem são tratados como conjuntos vazios.

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

sUnionStore

Armazena a união dos conjuntos fornecidos no conjunto de destino especificado e retorna a quantidade de elementos. Se o conjunto de destino já existir, ele será substituído.

$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']
});