O documento discute Redis, um sistema de armazenamento de dados chave-valor em memória. Ele fornece um resumo de três frases sobre:
1) Redis é um servidor de estrutura de dados flexível e rápido que pode ser usado como cache, banco de dados ou fila de mensagens.
2) Redis suporta vários tipos de dados, incluindo strings, hashes, listas e conjuntos, e oferece operações como publicação/assinatura.
3) A extensão PHP phpredis facilita o uso de Redis no PHP para aplicações como cache,
5. Wha
t
Dafuck Redis?
segunda-feira, 27 de agosto de 12
6. Wha
t
Dafuck Redis?
• Remote Dictionary Server
segunda-feira, 27 de agosto de 12
7. Wha
t
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
segunda-feira, 27 de agosto de 12
8. Wha
t
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
• ... lista e executa operações
segunda-feira, 27 de agosto de 12
9. Wha
t
Dafuck Redis?
• Remote Dictionary Server
• Armazenamento chave-valor
• ... lista e executa operações
• Um servidor de estrutura de dados
segunda-feira, 27 de agosto de 12
10. Wha
t
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
segunda-feira, 27 de agosto de 12
11. Wha
t
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
segunda-feira, 27 de agosto de 12
12. Wha
t
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
segunda-feira, 27 de agosto de 12
13. Wha
t
Um canivete suíço
segunda-feira, 27 de agosto de 12
14. Wha
t
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
segunda-feira, 27 de agosto de 12
15. Wha
t
Breve histórico
• Breve mesmo...
segunda-feira, 27 de agosto de 12
16. Wha
t
Breve histórico
• Criado por Salvatore Sanfilippo
( antirez )
• Primeiro release: Março/2009
• “Adquirido” pela VMWare em Março
de 2010
• Open Source ( BSD )
segunda-feira, 27 de agosto de 12
17. Wha
t
Agenda!
• Como funciona
• Tipos de dados
• Utilidade
• PHP
• Úteis
segunda-feira, 27 de agosto de 12
18. Wha
t
Inicio de tudo!
$ git clone git://github.com/antirez/redis
$ cd redis
$ make
$ ./redis-server
segunda-feira, 27 de agosto de 12
20. Wha
t
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
segunda-feira, 27 de agosto de 12
21. Wha
t
Tipos de dados
segunda-feira, 27 de agosto de 12
22. Wha
t
Tipos de dados
• Binary-safe strings ( até 10GB )
• listas
• conjuntos
• Conjuntos sortidos
• (Cada chave possuí uma pontuação)
• hashes
• Canais pub/sub
segunda-feira, 27 de agosto de 12
23. t
Wha
Os tipos de dados propriamente ditos!!!
segunda-feira, 27 de agosto de 12
24. Wha
t
Strings
SET name Kinn
SET age 23
MGET name age
> Kinn
>23
GETSET name Kinncj
> Kinn
segunda-feira, 27 de agosto de 12
25. Wha
t
Strings
SETEX age 3 20
GET age
> 20
// .. 3 segundos após
GET age
> null
segunda-feira, 27 de agosto de 12
26. Wha
t
Inteiros
INCR count
>1
INCR count
>2
INCRBY count 3
>5
segunda-feira, 27 de agosto de 12
27. Wha
t
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
segunda-feira, 27 de agosto de 12
28. Wha
t
Listas
RPUSH admins Kinn
>1
RPUSH admins Manolo
>2
LINDEX admins 0
> Kinn
LLEN admins
>2
RPOP admins
> Manolo
segunda-feira, 27 de agosto de 12
29. Wha
t
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
segunda-feira, 27 de agosto de 12
30. Wha
t
Conjuntos
SADD page:6:visitors 253
SADD page:6:visitors 923
SADD page:6:visitors 13
SINTER page:3:visitors page:6:visitors
> 253
segunda-feira, 27 de agosto de 12
31. Wha
t
Conjuntos sortidos
ZADD highscores 2930 Kinn
ZADD highscores 1500 Manolo
ZREVRANGE highscores 0 10 WITHSCORES
> Kinn
> 2930
> Manolo
> 1500
segunda-feira, 27 de agosto de 12
32. Wha
t
Exemplo
Listas
array(‘foo’, ‘bar’);
Conjuntos
suffle(array(‘foo’, ‘bar’));
Conjuntos sortidos
ksort(array(3 => ‘foo’, 1 => ‘bar’));
segunda-feira, 27 de agosto de 12
33. Why
Os tipos básicos de cada
linguagem existem no redis
segunda-feira, 27 de agosto de 12
34. Why
Processe dados no redis ao
invés do PHP
segunda-feira, 27 de agosto de 12
35. Why
“SQL” no redis
segunda-feira, 27 de agosto de 12
36. Why
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
segunda-feira, 27 de agosto de 12
41. Why
Goodies
• Replicação Master/Slave
• Transações: MULTI / EXEC / DISCARD
segunda-feira, 27 de agosto de 12
42. Why
Future Goodies
segunda-feira, 27 de agosto de 12
43. Why
Future Goodies
• Lua Scripting: EVAL
segunda-feira, 27 de agosto de 12
44. Why
Future Goodies : Cluster
segunda-feira, 27 de agosto de 12
45. Why
Future Goodies : Cluster
• Redis Cluster ( Tão atrasado quanto o
PHP 6 )
segunda-feira, 27 de agosto de 12
46. Why
Future Goodies : Cluster
Velocidade
Redis é rápido
É muito improvável que CPU seja gargalo
segunda-feira, 27 de agosto de 12
47. Why
Future Goodies : Cluster
Velocidade
segunda-feira, 27 de agosto de 12
48. Why
Future Goodies : Cluster
Redis é rápido
segunda-feira, 27 de agosto de 12
49. Why
Future Goodies : Cluster
É muito improvável que CPU seja gargalo
segunda-feira, 27 de agosto de 12
50. Why
Future Goodies : Cluster
O que você faz quando está sem RAM?
segunda-feira, 27 de agosto de 12
51. Why
Future Goodies : Cluster
Esperar pelo cluster Redis?
Se você puder... o Cluster é parece ser
ótimo
segunda-feira, 27 de agosto de 12
52. Why
Goodie!
Armazena em memória.
Backup em disco.
segunda-feira, 27 de agosto de 12
53. Whe
n
2 centavos
Armazene em disco.
Carregue hot-data na memória.
segunda-feira, 27 de agosto de 12
54. Whe
n
Uso
• WEB SCALE
• THE CLOUD
• NOSQL
• ELASTIC
• HORIZONTAL SCALING
• VERTICAL TOO
segunda-feira, 27 de agosto de 12
55. Whe
n
Uso
• WEB SCALE
• THE CLOUD
• NOSQL
• ELASTIC
• HORIZONTAL SCALING
• VERTICAL TOO
segunda-feira, 27 de agosto de 12
56. n
Whe
BULLSHIT
segunda-feira, 27 de agosto de 12
57. Whe
n
Caia na real
Se você precisa escalar, sua base de dados
não vai magicamente fazer isso por você
segunda-feira, 27 de agosto de 12
58. Whe
n
Uso
Então para que realmente ele é bom?
segunda-feira, 27 de agosto de 12
59. Whe
n
Uso
• Armazenamento de sessões
• Cache
• Qualquer outra coisa que o
memcached faça
segunda-feira, 27 de agosto de 12
60. Whe
n
Uso
• Cache: Site de noticias
• Leituras caras
• Mudança rápida de páginas
• Tracking dinâmico do que o usuário
está fazendo
segunda-feira, 27 de agosto de 12
61. Whe
n
Uso
• Cache: Site de noticias
Cacheando resultados genéricos:
SETEX <id da página>:content 600 <dados>
segunda-feira, 27 de agosto de 12
62. Whe
n
Uso
• Fila
BRPOP fila
LPUSH fila “descrição do job”
ex: Lib resque do GitHub https://github.com/defunkt/resque/
segunda-feira, 27 de agosto de 12
63. Whe
n
Aplicações
• Ajax pooling / Long pooling
• Serviço de compartilhamento de
diretório ( GitHub)
• CSRF tokens
• Tokens temporários de OAuth
• Cache
• Chat
segunda-feira, 27 de agosto de 12
64. Whe
n
Aplicações
• Github
• Flickr
• PHPad ;)
segunda-feira, 27 de agosto de 12
65. How
E o PHP?
Entra aonde?
segunda-feira, 27 de agosto de 12
66. How
PHP + Redis
Extensão phpredis
http://github.com/nicolasff/phpredis
segunda-feira, 27 de agosto de 12
67. How
phpredis
• Session handler
• up to date
segunda-feira, 27 de agosto de 12
68. How
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’);
segunda-feira, 27 de agosto de 12
69. How
PHP + Redis
Extensão phpiredis
http://github.com/seppo0010/phpiredis
segunda-feira, 27 de agosto de 12
70. How
phpiredis
• Parsing de protocolo
• Baixo nível
segunda-feira, 27 de agosto de 12
71. How
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’);
segunda-feira, 27 de agosto de 12
72. How
PHP + Redis
Extensão Predis
http://github.com/nrk/predis
segunda-feira, 27 de agosto de 12
73. How
Predis
• Master/Slave auto select
• Pode fazer uso do phpiredis para
parsing
• Symfony bundle
segunda-feira, 27 de agosto de 12
74. How
PHP + Redis
Doctrine cache layer
segunda-feira, 27 de agosto de 12
75. How
Doctrine
• Cache de query results diretamente
no redis.
segunda-feira, 27 de agosto de 12
76. How
Redis
• É rápido!
• É divertido!
• Try-it try.redis-db.com
segunda-feira, 27 de agosto de 12
77. How
Obrigado
@kinncj
kinncj@php.net
segunda-feira, 27 de agosto de 12