Slide 1

Slide 1 text

Redis A Key-Value datastore

Slide 2

Slide 2 text

About • Software Engineer: Dafiti • Developer: About 10 • php.net, MeeGo, phpsp, fedora project, NoSQL BR, * • Zend Certified Engineer, Husband and Daddy

Slide 3

Slide 3 text

Dafuck Redis?

Slide 4

Slide 4 text

Dafuck Redis? • Remote Dictionary Server

Slide 5

Slide 5 text

Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor

Slide 6

Slide 6 text

Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor • ... lista e executa operações

Slide 7

Slide 7 text

Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor • ... lista e executa operações • Um servidor de estrutura de dados

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Um canivete suíço

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Breve histórico • Breve mesmo...

Slide 14

Slide 14 text

Breve histórico • Criado por Salvatore Sanfilippo ( antirez ) • Primeiro release: Março/2009 • “Adquirido” pela VMWare em Março de 2010 • Open Source ( BSD )

Slide 15

Slide 15 text

Agenda

Slide 16

Slide 16 text

Agenda?

Slide 17

Slide 17 text

é... agora que ta começando a parada!

Slide 18

Slide 18 text

Agenda! • Como funciona • Comandos • Tipos de dados • Utilidade • PHP • Úteis

Slide 19

Slide 19 text

Inicio de tudo! $ git clone git://github.com/antirez/redis $ cd redis $ make $ ./redis-server

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Tipos de dados

Slide 23

Slide 23 text

Tipos de dados • Binary-safe strings ( até 10GB ) • listas • conjuntos • Conjuntos sortidos • (Cada chave possuí uma pontuação) • hashes • Canais pub/sub

Slide 24

Slide 24 text

Comandos da base de dados • SELECT • MOVE • FLUSHDB • FLUSHALL • SHUTDOWN • SLAVEOF • DBSIZE • INFO • MONITOR • SAVE / BGSAVE • LASTSAVE • BGREWRITEAOF

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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]

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Os tipos de dados!!!

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

Hashes HMSET user name Kinn email [email protected] HGET user email > [email protected] HKEYS user > name > email HGETALL user > name > Kinn > email > [email protected]

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Conjuntos sortidos ZADD highscores 2930 Kinn ZADD highscores 1500 Manolo ZREVRANGE highscores 0 10 WITHSCORES > Kinn > 2930 > Manolo > 1500

Slide 39

Slide 39 text

Exemplo Listas array(‘foo’, ‘bar’); Conjuntos suffle(array(‘foo’, ‘bar’)); Conjuntos sortidos ksort(array(3 => ‘foo’, 1 => ‘bar’));

Slide 40

Slide 40 text

Os tipos básicos de cada linguagem existem no redis

Slide 41

Slide 41 text

Processe dados no redis ao invés do PHP

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Pub/Sub

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

Pub/Sub SUBSCRIBE mensagem SUBSCRIBE chan1 chan2 chan3 PUBLISH mensagem “Ola Mundo” PSUBSCRIBE chat.*

Slide 46

Slide 46 text

Goodies

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Future Goodies

Slide 49

Slide 49 text

Future Goodies • Lua Scripting: EVAL

Slide 50

Slide 50 text

Future Goodies : Cluster

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

Future Goodies : Cluster Velocidade

Slide 54

Slide 54 text

Future Goodies : Cluster Redis é rápido

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

Future Goodies : Cluster Esperar pelo cluster Redis? Se você puder... o Cluster é parece ser ótimo

Slide 58

Slide 58 text

2 centavos Armazene em disco. Carregue hot-data na memória.

Slide 59

Slide 59 text

Uso • WEB SCALE • THE CLOUD • NOSQL • ELASTIC • HORIZONTAL SCALING • VERTICAL TOO

Slide 60

Slide 60 text

Uso • WEB SCALE • THE CLOUD • NOSQL • ELASTIC • HORIZONTAL SCALING • VERTICAL TOO

Slide 61

Slide 61 text

BULLSHIT

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

Uso Então para que realmente ele é bom?

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

Uso • Cache: Site de noticias Cacheando resultados genéricos: SETEX :content 600

Slide 67

Slide 67 text

Uso • Lista de jobs BRPOP fila LPUSH fila “descrição do job” ex: Lib resque do GitHub https://github.com/defunkt/resque/

Slide 68

Slide 68 text

Aplicações • Ajax pooling • Serviço de compartilhamento de diretório ( GitHub) • CSRF tokens • Tokens temporários de OAuth • Cache • Chat

Slide 69

Slide 69 text

E o PHP? Entra aonde?

Slide 70

Slide 70 text

PHP + Redis Extensão phpredis http://github.com/nicolasff/phpredis

Slide 71

Slide 71 text

phpredis • Session handler • up to date

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

PHP + Redis Extensão phpiredis http://github.com/seppo0010/phpiredis

Slide 74

Slide 74 text

phpiredis • Parsing de protocolo • Baixo nível

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

PHP + Redis Doctrine cache layer

Slide 79

Slide 79 text

Doctrine • Cache de query results diretamente no redis.

Slide 80

Slide 80 text

Redis • É rápido! • É divertido! • Try-it try.redis-db.com

Slide 81

Slide 81 text

Obrigado • 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 @kinncj [email protected]