Slide 1

Slide 1 text

Redis What? Why? When? How? segunda-feira, 27 de agosto de 12

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 segunda-feira, 27 de agosto de 12

Slide 3

Slide 3 text

Redis • Memcached segunda-feira, 27 de agosto de 12

Slide 4

Slide 4 text

Obrigado segunda-feira, 27 de agosto de 12

Slide 5

Slide 5 text

Dafuck Redis? What segunda-feira, 27 de agosto de 12

Slide 6

Slide 6 text

Dafuck Redis? • Remote Dictionary Server What segunda-feira, 27 de agosto de 12

Slide 7

Slide 7 text

Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor What segunda-feira, 27 de agosto de 12

Slide 8

Slide 8 text

Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor • ... lista e executa operações What segunda-feira, 27 de agosto de 12

Slide 9

Slide 9 text

Dafuck Redis? • Remote Dictionary Server • Armazenamento chave-valor • ... lista e executa operações • Um servidor de estrutura de dados What segunda-feira, 27 de agosto de 12

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 What segunda-feira, 27 de agosto de 12

Slide 11

Slide 11 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 What segunda-feira, 27 de agosto de 12

Slide 12

Slide 12 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 What segunda-feira, 27 de agosto de 12

Slide 13

Slide 13 text

Um canivete suíço What segunda-feira, 27 de agosto de 12

Slide 14

Slide 14 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 What segunda-feira, 27 de agosto de 12

Slide 15

Slide 15 text

Breve histórico • Breve mesmo... What segunda-feira, 27 de agosto de 12

Slide 16

Slide 16 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 ) What segunda-feira, 27 de agosto de 12

Slide 17

Slide 17 text

Agenda! • Como funciona • Tipos de dados • Utilidade • PHP • Úteis What segunda-feira, 27 de agosto de 12

Slide 18

Slide 18 text

Inicio de tudo! $ git clone git://github.com/antirez/redis $ cd redis $ make $ ./redis-server What segunda-feira, 27 de agosto de 12

Slide 19

Slide 19 text

What segunda-feira, 27 de agosto de 12

Slide 20

Slide 20 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 What segunda-feira, 27 de agosto de 12

Slide 21

Slide 21 text

Tipos de dados What segunda-feira, 27 de agosto de 12

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

Os tipos de dados propriamente ditos!!! What segunda-feira, 27 de agosto de 12

Slide 24

Slide 24 text

Strings SET name Kinn SET age 23 MGET name age > Kinn >23 GETSET name Kinncj > Kinn What segunda-feira, 27 de agosto de 12

Slide 25

Slide 25 text

Strings SETEX age 3 20 GET age > 20 // .. 3 segundos após GET age > null What segunda-feira, 27 de agosto de 12

Slide 26

Slide 26 text

Inteiros INCR count > 1 INCR count > 2 INCRBY count 3 > 5 What segunda-feira, 27 de agosto de 12

Slide 27

Slide 27 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] What segunda-feira, 27 de agosto de 12

Slide 28

Slide 28 text

Listas RPUSH admins Kinn > 1 RPUSH admins Manolo > 2 LINDEX admins 0 > Kinn LLEN admins > 2 RPOP admins > Manolo What segunda-feira, 27 de agosto de 12

Slide 29

Slide 29 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 What segunda-feira, 27 de agosto de 12

Slide 30

Slide 30 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 What segunda-feira, 27 de agosto de 12

Slide 31

Slide 31 text

Conjuntos sortidos ZADD highscores 2930 Kinn ZADD highscores 1500 Manolo ZREVRANGE highscores 0 10 WITHSCORES > Kinn > 2930 > Manolo > 1500 What segunda-feira, 27 de agosto de 12

Slide 32

Slide 32 text

Exemplo Listas array(‘foo’, ‘bar’); Conjuntos suffle(array(‘foo’, ‘bar’)); Conjuntos sortidos ksort(array(3 => ‘foo’, 1 => ‘bar’)); What segunda-feira, 27 de agosto de 12

Slide 33

Slide 33 text

Os tipos básicos de cada linguagem existem no redis Why segunda-feira, 27 de agosto de 12

Slide 34

Slide 34 text

Processe dados no redis ao invés do PHP Why segunda-feira, 27 de agosto de 12

Slide 35

Slide 35 text

“SQL” no redis Why segunda-feira, 27 de agosto de 12

Slide 36

Slide 36 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 Why segunda-feira, 27 de agosto de 12

Slide 37

Slide 37 text

Pub/Sub Why segunda-feira, 27 de agosto de 12

Slide 38

Slide 38 text

Pub/Sub • Redis faz BroadCast!!!!!! Why segunda-feira, 27 de agosto de 12

Slide 39

Slide 39 text

Pub/Sub SUBSCRIBE mensagem SUBSCRIBE chan1 chan2 chan3 PUBLISH mensagem “Ola Mundo” PSUBSCRIBE chat.* Why segunda-feira, 27 de agosto de 12

Slide 40

Slide 40 text

Goodies Why segunda-feira, 27 de agosto de 12

Slide 41

Slide 41 text

Goodies • Replicação Master/Slave • Transações: MULTI / EXEC / DISCARD Why segunda-feira, 27 de agosto de 12

Slide 42

Slide 42 text

Future Goodies Why segunda-feira, 27 de agosto de 12

Slide 43

Slide 43 text

Future Goodies • Lua Scripting: EVAL Why segunda-feira, 27 de agosto de 12

Slide 44

Slide 44 text

Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 45

Slide 45 text

• Redis Cluster ( Tão atrasado quanto o PHP 6 ) Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 46

Slide 46 text

Velocidade Redis é rápido É muito improvável que CPU seja gargalo Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 47

Slide 47 text

Velocidade Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 48

Slide 48 text

Redis é rápido Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 49

Slide 49 text

É muito improvável que CPU seja gargalo Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 50

Slide 50 text

O que você faz quando está sem RAM? Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 51

Slide 51 text

Esperar pelo cluster Redis? Se você puder... o Cluster é parece ser ótimo Why Future Goodies : Cluster segunda-feira, 27 de agosto de 12

Slide 52

Slide 52 text

Goodie! Armazena em memória. Backup em disco. Why segunda-feira, 27 de agosto de 12

Slide 53

Slide 53 text

2 centavos Armazene em disco. Carregue hot-data na memória. When segunda-feira, 27 de agosto de 12

Slide 54

Slide 54 text

Uso • WEB SCALE • THE CLOUD • NOSQL • ELASTIC • HORIZONTAL SCALING • VERTICAL TOO When segunda-feira, 27 de agosto de 12

Slide 55

Slide 55 text

Uso • WEB SCALE • THE CLOUD • NOSQL • ELASTIC • HORIZONTAL SCALING • VERTICAL TOO When segunda-feira, 27 de agosto de 12

Slide 56

Slide 56 text

BULLSHIT When segunda-feira, 27 de agosto de 12

Slide 57

Slide 57 text

Caia na real Se você precisa escalar, sua base de dados não vai magicamente fazer isso por você When segunda-feira, 27 de agosto de 12

Slide 58

Slide 58 text

Uso Então para que realmente ele é bom? When segunda-feira, 27 de agosto de 12

Slide 59

Slide 59 text

Uso • Armazenamento de sessões • Cache • Qualquer outra coisa que o memcached faça When segunda-feira, 27 de agosto de 12

Slide 60

Slide 60 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 When segunda-feira, 27 de agosto de 12

Slide 61

Slide 61 text

Uso • Cache: Site de noticias Cacheando resultados genéricos: SETEX :content 600 When segunda-feira, 27 de agosto de 12

Slide 62

Slide 62 text

Uso • Fila BRPOP fila LPUSH fila “descrição do job” ex: Lib resque do GitHub https://github.com/defunkt/resque/ When segunda-feira, 27 de agosto de 12

Slide 63

Slide 63 text

Aplicações • Ajax pooling / Long pooling • Serviço de compartilhamento de diretório ( GitHub) • CSRF tokens • Tokens temporários de OAuth • Cache • Chat When segunda-feira, 27 de agosto de 12

Slide 64

Slide 64 text

Aplicações • Github • Flickr • PHPad ;) When segunda-feira, 27 de agosto de 12

Slide 65

Slide 65 text

E o PHP? Entra aonde? How segunda-feira, 27 de agosto de 12

Slide 66

Slide 66 text

PHP + Redis Extensão phpredis http://github.com/nicolasff/phpredis How segunda-feira, 27 de agosto de 12

Slide 67

Slide 67 text

phpredis • Session handler • up to date How segunda-feira, 27 de agosto de 12

Slide 68

Slide 68 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’); How segunda-feira, 27 de agosto de 12

Slide 69

Slide 69 text

PHP + Redis Extensão phpiredis http://github.com/seppo0010/phpiredis How segunda-feira, 27 de agosto de 12

Slide 70

Slide 70 text

phpiredis • Parsing de protocolo • Baixo nível How segunda-feira, 27 de agosto de 12

Slide 71

Slide 71 text

phpiredis $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’); How segunda-feira, 27 de agosto de 12

Slide 72

Slide 72 text

PHP + Redis Extensão Predis http://github.com/nrk/predis How segunda-feira, 27 de agosto de 12

Slide 73

Slide 73 text

Predis • Master/Slave auto select • Pode fazer uso do phpiredis para parsing • Symfony bundle How segunda-feira, 27 de agosto de 12

Slide 74

Slide 74 text

PHP + Redis Doctrine cache layer How segunda-feira, 27 de agosto de 12

Slide 75

Slide 75 text

Doctrine • Cache de query results diretamente no redis. How segunda-feira, 27 de agosto de 12

Slide 76

Slide 76 text

Redis • É rápido! • É divertido! • Try-it try.redis-db.com How segunda-feira, 27 de agosto de 12

Slide 77

Slide 77 text

Obrigado @kinncj [email protected] How segunda-feira, 27 de agosto de 12