Redis
A Key-Value datastore
About

• Software Engineer: Dafiti
• Developer: About 10
• php.net, MeeGo, phpsp, fedora project,
  NoSQL BR, *
• Zend Certified Engineer, Husband and
  Daddy
Dafuck Redis?
Dafuck Redis?
• Remote Dictionary Server
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
  • ... lista e executa operações
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
  • ... lista e executa operações
• Um servidor de estrutura de dados
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
  • ... lista e executa operações
• Um servidor de estrutura de dados
  • ... tem pub/sub e notificações
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
  • ... lista e executa operações
• Um servidor de estrutura de dados
  • ... tem pub/sub e notificações
• Um bus de evento sem bloqueio
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
  • ... lista e executa operações
• Um servidor de estrutura de dados
  • ... tem pub/sub e notificações
• Um bus de evento sem bloqueio
• Uma memória compartilhada acessível via
  rede
Um canivete suíço
Seja o que for...
• Mothafuckamente rápido!
  • Non-blocking I/O, um único segmento
  • 100,000+ escrita/leitura por segundo
• Pequeno: ~16,000 linhas de código C
• Escala para “baixo”: Amigável até mesmo com um
  simples VPS
• Faz um novo tipo de recurso - em particular para
  escritas pesadas - viável para pequenas aplicações
• Complementa sua camada de armazenamento
Breve histórico



• Breve mesmo...
Breve histórico

• Criado por Salvatore Sanfilippo
  ( antirez )
• Primeiro release: Março/2009
• “Adquirido” pela VMWare em Março
  de 2010

• Open Source ( BSD )
Agenda
Agenda?
é... agora que ta
começando a parada!
Agenda!
• Como funciona
• Comandos
• Tipos de dados
• Utilidade
• PHP
• Úteis
Inicio de tudo!
$ git clone git://github.com/antirez/redis

$ cd redis

$ make

$ ./redis-server
Chaves

• Chaves não devem conter espaços em
  branco!
 • ( essa restrição foi removida na versão 1.2)
• Chaves curtas performam melhor
• Convenção comum: tipo-de-objeto:id:campo
 • user:23:username = manolo
• SHA1(data) Pode ser uma chave útil também
Tipos de dados
Tipos de dados
• Binary-safe strings ( até 10GB )
  • listas
  • conjuntos
• Conjuntos sortidos
  • (Cada chave possuí uma pontuação)
• hashes
• Canais pub/sub
Comandos da base de
          dados
•   SELECT
•   MOVE
•   FLUSHDB

•   FLUSHALL
•   SHUTDOWN
•   SLAVEOF

•   DBSIZE
•   INFO
•   MONITOR

•   SAVE / BGSAVE
•   LASTSAVE
•   BGREWRITEAOF
Comandos da base de
          dados
•   SELECT
•   MOVE
•   FLUSHDB          16 bases
•   FLUSHALL        numeradas
•   SHUTDOWN
•   SLAVEOF

•   DBSIZE
•   INFO
•   MONITOR

•   SAVE / BGSAVE
•   LASTSAVE
•   BGREWRITEAOF
Comandos da base de
          dados
•   SELECT
•   MOVE
•   FLUSHDB         Exclusão em
•   FLUSHALL          massa
•   SHUTDOWN
•   SLAVEOF

•   DBSIZE
•   INFO
•   MONITOR

•   SAVE / BGSAVE
•   LASTSAVE
•   BGREWRITEAOF
Comandos da base de
          dados
•   SELECT
•   MOVE
•   FLUSHDB           Útil para
•   FLUSHALL         debugging e
•   SHUTDOWN        monitoramento
•   SLAVEOF

•   DBSIZE
•   INFO
•   MONITOR

•   SAVE / BGSAVE
•   LASTSAVE
•   BGREWRITEAOF
Comandos
• SET [chave valor]
• SETEX [chave tempo valor]
• GET [chave]
• MGET [chave1 chave2 ...]
• MSET [chave1 valor1 chave2 valor2 ...]
• INCR / INCRBY
• DECR / DECRBY
• APPEND [chave valor]
• SUBSTR [chave 0 1]
Comandos atomicos

• GETSET [chave valor]
  • Seta o novo valor e retorna o anterior
• SETNX [chave valor]
  • Falha se a chave já está setada
• MSETNX [ c1 v1 c2 v2 c3 v3 ... ]
  • Falha se ALGUMA chave já existir
Os tipos de dados!!!
Strings

SET name Kinn
SET age 23
MGET name age
> Kinn
>23
GETSET name Kinncj
> Kinn
Strings


SETEX age 3 20
GET age
> 20
// .. 3 segundos após
GET age
> null
Inteiros


INCR count
>1
INCR count
>2
INCRBY count 3
>5
Hashes

HMSET user name Kinn email kinncj@php.net

HGET user email
> kinncj@php.net

HKEYS user
> name
> email

HGETALL user
> name
> Kinn
> email
> kinncj@php.net
Listas

RPUSH admins Kinn
>1
RPUSH admins Manolo
>2
LINDEX admins 0
> Kinn
LLEN admins
>2
RPOP admins
> Manolo
Conjuntos

SADD page:3:visitors 134
>1
SADD page:3:visitors 253
>1
SADD page:3:visitors 253
>0
SCARD page:3:visitors
>2
SMEMBERS page:3:visitors
> 134
> 253
SISMEMBER page:3:visitors 349
>0
Conjuntos


SADD page:6:visitors 253
SADD page:6:visitors 923
SADD page:6:visitors 13
SINTER page:3:visitors page:6:visitors
> 253
Conjuntos sortidos


ZADD highscores 2930 Kinn
ZADD highscores 1500 Manolo
ZREVRANGE highscores 0 10 WITHSCORES
> Kinn
> 2930
> Manolo
> 1500
Exemplo


Listas
  array(‘foo’, ‘bar’);

Conjuntos
  suffle(array(‘foo’, ‘bar’));

Conjuntos sortidos
  ksort(array(3 => ‘foo’, 1 => ‘bar’));
Os tipos básicos de cada
linguagem existem no redis
Processe dados no redis ao
      invés do PHP
SORT - SQL em seu
           NoSQL


SORT chave
SORT chave LIMIT 0 10 DESC
SORT chave ALPHA
SORT page:6:visitors BY user_*->rank
GET user_* DESC
Pub/Sub
Pub/Sub



• Redis faz BroadCast!!!!!!
Pub/Sub



SUBSCRIBE mensagem
SUBSCRIBE chan1 chan2 chan3
PUBLISH mensagem “Ola Mundo”
PSUBSCRIBE chat.*
Goodies
Goodies



• Replicação Master/Slave
• Transações: MULTI / EXEC / DISCARD
Future Goodies
Future Goodies



• Lua Scripting: EVAL
Future Goodies : Cluster
Future Goodies : Cluster



• Redis Cluster ( Tão atrasado quanto o
  PHP 6 )
Future Goodies : Cluster

             Velocidade
            Redis é rápido
É muito improvável que CPU seja gargalo
Future Goodies : Cluster


        Velocidade
Future Goodies : Cluster


       Redis é rápido
Future Goodies : Cluster


É muito improvável que CPU seja gargalo
Future Goodies : Cluster


O que você faz quando está sem RAM?
Future Goodies : Cluster

      Esperar pelo cluster Redis?
 Se você puder... o Cluster é parece ser
                  ótimo
2 centavos


     Armazene em disco.
Carregue hot-data na memória.
Uso
• WEB SCALE
• THE CLOUD
• NOSQL
• ELASTIC
• HORIZONTAL SCALING
• VERTICAL TOO
Uso
• WEB SCALE
• THE CLOUD
• NOSQL
• ELASTIC
• HORIZONTAL SCALING
• VERTICAL TOO
BULLSHIT
Caia na real


Se você precisa escalar, sua base de dados
não vai magicamente fazer isso por você
Uso


Então para que realmente ele é bom?
Uso


• Armazenamento de sessões
• Cache
• Qualquer outra coisa que o
  memcached faça
Uso

• Cache: Site de noticias
  • Leituras caras
  • Mudança rápida de páginas
  • Tracking dinâmico do que o usuário
    está fazendo
Uso
• Cache: Site de noticias

Cacheando resultados genéricos:
  SETEX <id da página>:content 600 <dados>
Uso

• Lista de jobs
 BRPOP fila
 LPUSH fila “descrição do job”


 ex: Lib resque do GitHub https://github.com/defunkt/resque/
Aplicações
• Ajax pooling
• Serviço de compartilhamento de
  diretório ( GitHub)

• CSRF tokens
• Tokens temporários de OAuth
• Cache
• Chat
E o PHP?


Entra aonde?
PHP + Redis


     Extensão phpredis
http://github.com/nicolasff/phpredis
phpredis



• Session handler
• up to date
phpredis
$redis = new Redis();
$redis->connect(‘127.0.0.1’, 6379);
$redis->watch(‘user’);
$result = $redis->multi()
   ->set(‘user’, ‘manolo’)
   ->exec();

echo $result !== false ? ‘Success’ : ‘Shit happens’;

echo $redis->get(‘user’);
PHP + Redis


     Extensão phpiredis
http://github.com/seppo0010/phpiredis
phpiredis



• Parsing de protocolo
• Baixo nível
phpredis

$redis = phpiredis_connect(‘127.0.0.1’, 6379);
phpiredis_command($redis, ‘WATCH user’);
phpiredis_command($redis, ‘MULTI’);
$user = “manolo”;
phpiredis_command($redis, ‘SET user ‘.$user);
$result = phpiredis_command($redis, ‘EXEC’);
echo $result !== false ? ‘Success’ : ‘Shit happens’;
echo phpiredis_command($redis, ‘GET user’);
PHP + Redis


  Extensão Predis
http://github.com/nrk/predis
Predis


• Master/Slave auto select
• Pode fazer uso do phpiredis para
  parsing

• Symfony bundle
PHP + Redis


Doctrine cache layer
Doctrine



• Cache de query results diretamente
  no redis.
Redis


• É rápido!
• É divertido!
• Try-it try.redis-db.com
Obrigado
                                     @kinncj
                                  kinncj@php.net
•   http://rediscookbook.org/pubsub_for_synchronous_communication.html - The chat application


•   http://redis.io/topics/twitter-clone/ - A micro-blogging application


•   http://docs.doctrine-project.org/en/latest/reference/caching.html - Doctrine cache


•   http://highscalability.com/blog/2011/7/6/11-common-web-use-cases-solved-in-redis.html - Use cases


•   http://redis.io/


•   https://github.com/kinncj/Redis---PHPMSCONF2012

Redis um banco chave valor

  • 1.
  • 2.
    About • Software Engineer:Dafiti • Developer: About 10 • php.net, MeeGo, phpsp, fedora project, NoSQL BR, * • Zend Certified Engineer, Husband and Daddy
  • 3.
  • 4.
    Dafuck Redis? • RemoteDictionary Server
  • 5.
    Dafuck Redis? • RemoteDictionary Server • Armazenamento chave-valor
  • 6.
    Dafuck Redis? • RemoteDictionary Server • Armazenamento chave-valor • ... lista e executa operações
  • 7.
    Dafuck Redis? • RemoteDictionary Server • Armazenamento chave-valor • ... lista e executa operações • Um servidor de estrutura de dados
  • 8.
    Dafuck Redis? • RemoteDictionary Server • Armazenamento chave-valor • ... lista e executa operações • Um servidor de estrutura de dados • ... tem pub/sub e notificações
  • 9.
    Dafuck Redis? • RemoteDictionary Server • Armazenamento chave-valor • ... lista e executa operações • Um servidor de estrutura de dados • ... tem pub/sub e notificações • Um bus de evento sem bloqueio
  • 10.
    Dafuck Redis? • RemoteDictionary Server • Armazenamento chave-valor • ... lista e executa operações • Um servidor de estrutura de dados • ... tem pub/sub e notificações • Um bus de evento sem bloqueio • Uma memória compartilhada acessível via rede
  • 11.
  • 12.
    Seja o quefor... • Mothafuckamente rápido! • Non-blocking I/O, um único segmento • 100,000+ escrita/leitura por segundo • Pequeno: ~16,000 linhas de código C • Escala para “baixo”: Amigável até mesmo com um simples VPS • Faz um novo tipo de recurso - em particular para escritas pesadas - viável para pequenas aplicações • Complementa sua camada de armazenamento
  • 13.
  • 14.
    Breve histórico • Criadopor Salvatore Sanfilippo ( antirez ) • Primeiro release: Março/2009 • “Adquirido” pela VMWare em Março de 2010 • Open Source ( BSD )
  • 15.
  • 16.
  • 17.
    é... agora queta começando a parada!
  • 18.
    Agenda! • Como funciona •Comandos • Tipos de dados • Utilidade • PHP • Úteis
  • 19.
    Inicio de tudo! $git clone git://github.com/antirez/redis $ cd redis $ make $ ./redis-server
  • 21.
    Chaves • Chaves nãodevem conter espaços em branco! • ( essa restrição foi removida na versão 1.2) • Chaves curtas performam melhor • Convenção comum: tipo-de-objeto:id:campo • user:23:username = manolo • SHA1(data) Pode ser uma chave útil também
  • 22.
  • 23.
    Tipos de dados •Binary-safe strings ( até 10GB ) • listas • conjuntos • Conjuntos sortidos • (Cada chave possuí uma pontuação) • hashes • Canais pub/sub
  • 24.
    Comandos da basede dados • SELECT • MOVE • FLUSHDB • FLUSHALL • SHUTDOWN • SLAVEOF • DBSIZE • INFO • MONITOR • SAVE / BGSAVE • LASTSAVE • BGREWRITEAOF
  • 25.
    Comandos da basede dados • SELECT • MOVE • FLUSHDB 16 bases • FLUSHALL numeradas • SHUTDOWN • SLAVEOF • DBSIZE • INFO • MONITOR • SAVE / BGSAVE • LASTSAVE • BGREWRITEAOF
  • 26.
    Comandos da basede dados • SELECT • MOVE • FLUSHDB Exclusão em • FLUSHALL massa • SHUTDOWN • SLAVEOF • DBSIZE • INFO • MONITOR • SAVE / BGSAVE • LASTSAVE • BGREWRITEAOF
  • 27.
    Comandos da basede dados • SELECT • MOVE • FLUSHDB Útil para • FLUSHALL debugging e • SHUTDOWN monitoramento • SLAVEOF • DBSIZE • INFO • MONITOR • SAVE / BGSAVE • LASTSAVE • BGREWRITEAOF
  • 28.
    Comandos • SET [chavevalor] • SETEX [chave tempo valor] • GET [chave] • MGET [chave1 chave2 ...] • MSET [chave1 valor1 chave2 valor2 ...] • INCR / INCRBY • DECR / DECRBY • APPEND [chave valor] • SUBSTR [chave 0 1]
  • 29.
    Comandos atomicos • GETSET[chave valor] • Seta o novo valor e retorna o anterior • SETNX [chave valor] • Falha se a chave já está setada • MSETNX [ c1 v1 c2 v2 c3 v3 ... ] • Falha se ALGUMA chave já existir
  • 30.
    Os tipos dedados!!!
  • 31.
    Strings SET name Kinn SETage 23 MGET name age > Kinn >23 GETSET name Kinncj > Kinn
  • 32.
    Strings SETEX age 320 GET age > 20 // .. 3 segundos após GET age > null
  • 33.
  • 34.
    Hashes HMSET user nameKinn email kinncj@php.net HGET user email > kinncj@php.net HKEYS user > name > email HGETALL user > name > Kinn > email > kinncj@php.net
  • 35.
    Listas RPUSH admins Kinn >1 RPUSHadmins Manolo >2 LINDEX admins 0 > Kinn LLEN admins >2 RPOP admins > Manolo
  • 36.
    Conjuntos SADD page:3:visitors 134 >1 SADDpage:3:visitors 253 >1 SADD page:3:visitors 253 >0 SCARD page:3:visitors >2 SMEMBERS page:3:visitors > 134 > 253 SISMEMBER page:3:visitors 349 >0
  • 37.
    Conjuntos SADD page:6:visitors 253 SADDpage:6:visitors 923 SADD page:6:visitors 13 SINTER page:3:visitors page:6:visitors > 253
  • 38.
    Conjuntos sortidos ZADD highscores2930 Kinn ZADD highscores 1500 Manolo ZREVRANGE highscores 0 10 WITHSCORES > Kinn > 2930 > Manolo > 1500
  • 39.
    Exemplo Listas array(‘foo’,‘bar’); Conjuntos suffle(array(‘foo’, ‘bar’)); Conjuntos sortidos ksort(array(3 => ‘foo’, 1 => ‘bar’));
  • 40.
    Os tipos básicosde cada linguagem existem no redis
  • 41.
    Processe dados noredis ao invés do PHP
  • 42.
    SORT - SQLem seu NoSQL SORT chave SORT chave LIMIT 0 10 DESC SORT chave ALPHA SORT page:6:visitors BY user_*->rank GET user_* DESC
  • 43.
  • 44.
    Pub/Sub • Redis fazBroadCast!!!!!!
  • 45.
    Pub/Sub SUBSCRIBE mensagem SUBSCRIBE chan1chan2 chan3 PUBLISH mensagem “Ola Mundo” PSUBSCRIBE chat.*
  • 46.
  • 47.
    Goodies • Replicação Master/Slave •Transações: MULTI / EXEC / DISCARD
  • 48.
  • 49.
    Future Goodies • LuaScripting: EVAL
  • 50.
  • 51.
    Future Goodies :Cluster • Redis Cluster ( Tão atrasado quanto o PHP 6 )
  • 52.
    Future Goodies :Cluster Velocidade Redis é rápido É muito improvável que CPU seja gargalo
  • 53.
    Future Goodies :Cluster Velocidade
  • 54.
    Future Goodies :Cluster Redis é rápido
  • 55.
    Future Goodies :Cluster É muito improvável que CPU seja gargalo
  • 56.
    Future Goodies :Cluster O que você faz quando está sem RAM?
  • 57.
    Future Goodies :Cluster Esperar pelo cluster Redis? Se você puder... o Cluster é parece ser ótimo
  • 58.
    2 centavos Armazene em disco. Carregue hot-data na memória.
  • 59.
    Uso • WEB SCALE •THE CLOUD • NOSQL • ELASTIC • HORIZONTAL SCALING • VERTICAL TOO
  • 60.
    Uso • WEB SCALE •THE CLOUD • NOSQL • ELASTIC • HORIZONTAL SCALING • VERTICAL TOO
  • 61.
  • 62.
    Caia na real Sevocê precisa escalar, sua base de dados não vai magicamente fazer isso por você
  • 63.
    Uso Então para querealmente ele é bom?
  • 64.
    Uso • Armazenamento desessões • Cache • Qualquer outra coisa que o memcached faça
  • 65.
    Uso • Cache: Sitede noticias • Leituras caras • Mudança rápida de páginas • Tracking dinâmico do que o usuário está fazendo
  • 66.
    Uso • Cache: Sitede noticias Cacheando resultados genéricos: SETEX <id da página>:content 600 <dados>
  • 67.
    Uso • Lista dejobs BRPOP fila LPUSH fila “descrição do job” ex: Lib resque do GitHub https://github.com/defunkt/resque/
  • 68.
    Aplicações • Ajax pooling •Serviço de compartilhamento de diretório ( GitHub) • CSRF tokens • Tokens temporários de OAuth • Cache • Chat
  • 69.
  • 70.
    PHP + Redis Extensão phpredis http://github.com/nicolasff/phpredis
  • 71.
  • 72.
    phpredis $redis = newRedis(); $redis->connect(‘127.0.0.1’, 6379); $redis->watch(‘user’); $result = $redis->multi() ->set(‘user’, ‘manolo’) ->exec(); echo $result !== false ? ‘Success’ : ‘Shit happens’; echo $redis->get(‘user’);
  • 73.
    PHP + Redis Extensão phpiredis http://github.com/seppo0010/phpiredis
  • 74.
    phpiredis • Parsing deprotocolo • Baixo nível
  • 75.
    phpredis $redis = phpiredis_connect(‘127.0.0.1’,6379); phpiredis_command($redis, ‘WATCH user’); phpiredis_command($redis, ‘MULTI’); $user = “manolo”; phpiredis_command($redis, ‘SET user ‘.$user); $result = phpiredis_command($redis, ‘EXEC’); echo $result !== false ? ‘Success’ : ‘Shit happens’; echo phpiredis_command($redis, ‘GET user’);
  • 76.
    PHP + Redis Extensão Predis http://github.com/nrk/predis
  • 77.
    Predis • Master/Slave autoselect • Pode fazer uso do phpiredis para parsing • Symfony bundle
  • 78.
  • 79.
    Doctrine • Cache dequery results diretamente no redis.
  • 80.
    Redis • É rápido! •É divertido! • Try-it try.redis-db.com
  • 81.
    Obrigado @kinncj kinncj@php.net • http://rediscookbook.org/pubsub_for_synchronous_communication.html - The chat application • http://redis.io/topics/twitter-clone/ - A micro-blogging application • http://docs.doctrine-project.org/en/latest/reference/caching.html - Doctrine cache • http://highscalability.com/blog/2011/7/6/11-common-web-use-cases-solved-in-redis.html - Use cases • http://redis.io/ • https://github.com/kinncj/Redis---PHPMSCONF2012