2. whoami
Desenvolvedor/Líder Técnico em
projetos voltados para Gestão de
Conteúdo e Portais
Bacharel em Sistemas de Informação – FIC
Twitter: fjunior87
Linkedin: br.linkedin.com/in/fribeiro
Blog: http://xicojunior.wordpress.com
Email: fjunior87@gmail.com
3. Redis
• Criado por Salvatore Sanfilippo(@antirez)
• Primeira Release em março de 2009
• Patrocinado pela VM Ware
• Atualmente na versão 2.4.17
4. Redis
• REmote DIctionary Server
• Key-Value Store - Dicionário(hash) Remoto
• Suporta outras estruturas de dados
– List, set, hash, ordered set
• DataStructure Server
• Publish/Subscribe
• Expires
5. Redis
• Em memória... Muito, muito rápido!!!!
– Mas persiste os dados em disco – Snapshoting
– Requer bastante RAM dependendo da quantidade
de dados
• Non-Blocking I/O
• Single-Threaded
• 100.000+ operações de leitura e
escrita/segundo[1]
[1]http://simonwillison.net/static/2010/redis-tutorial/
7. Redis
• Por onde iniciar?
– http://try.redis-db.com/
• Instalação
– Download e unzip
– Iniciar o server: ./redis-server ou redis-
server.exe(WIN)
– Iniciar o client: ./redis-cli ou redis-cli.exe(Win)
• Muito simples!!!
8. Chaves e Valores
• Chaves são utilizadas para identificar dados no
Redis(String)
– Ex: server:name, user:1
• Valores estão associados com as chaves
– String, Integer, Estrutura de Dado
– JSON, XML, whatever...
– Strings são byte arrays
9. Chaves e Valores
• Associando valores a chaves
set server:name myhostname
set user:1
„{“nome”:”junior”,”username”:”fjunior87”}‟
10. Chaves e Valores
• Obtendo o valor de uma chave
get server:name
get user:1
11. Comandos
• GET • TYPE
• SET • EXISTS
• SETNX • DEL
• GETSET • EXPIRE
• MGET
• EXPIREAT
• MSET
• TTL
• INCR/INCRBY
• DECR/DECRBY
12. Comandos
setnx foo bar //OK!
setnx foo bar2 //NoK!
//setar varias chaves
mset dia 06 mes 10 ano 2012
//obter varias chaves
mget dia mes ano
13. Comandos
//setar novo valor e obter o antigo
set var valor
getset var novovalor //retorna
„valor‟
//Contador
incr user:ids
decr user:1:convites
14. Comandos
//checando o tipo da chave
type ano
//deletando uma chave
del ano
//checando existencia de um chave
exists blah
15. Caching
• Redis como um Cache store
– EXPIRE, EXPIREAT, TTL
SET last_page <html></html>
EXPIRE last_page 60
TTL last_page
18. Listas
//adicionando elementos ao inicio
lpush linguagem python
//adicionando ao final
rpush linguagem java
rpush linguagem ruby
//obtendo todos os elementos
lrange linguagem 0 -1
26. Set
//Amigos em comum
sinter friends:junior friends:manolo
//armazenar o resultado em outra chave
sinterstore chave_destino friends:junior
friends:manolo
27. Set
//amigos do manolo que não são amigos do jr
SDIFF friends:manolo friends:junior
//todos os amigos do manolo e junior
SUNION friends:manolo friends:junior
28. Sorted Set
• zset
• Similar ao SET
• Cada elemento possui um score
• Podemos consultar pelo score ou intervalo de
scores em qualquer direção (bottom/top)
32. Sorted Set
//obter os 3 menos votados
ZRANGE urna:1 0 2
//obter os 3 menos votados com score
ZRANGE urna:1 0 2 WITHSCORES
//obter os 3 mais votados
ZREVRANGE urna:1 0 2 WITHSCORES
33. Sorted Set
//candidatos com numero de votos entre 20 e
50
zrangebyscore urna:1 20 50
zrangebyscore urna:1 20 50 WITHSCORES
35. Sorted Set
//total de votos dos candidatos
zunionstore urnatotal 2 urna:1 urna:2
zrevrange urnatotal 0 -1 withscores
36. Hash
• Como o nome já diz
• Fields
• Ideal para armazenar objetos
– Mais flexibilidade do que objetos serializados
– Podendo obter/atualizar valores de campos
específicos
38. Hash
//Armazenando um usuario
hset user:1 nome junior
hset user:1 username fjunior87
//setando varios fields
hmset user:1 password 1234 idade 25
39. Hashes
//obtendo o nome
hget user:1 nome
//obtendo mais de um campo
hmget user:1 idade password
//obtendo todos
hgetall user:1
40. Pipeline
• A cada comando o cliente aguarda a resposta
sadd users junior
sadd users manolo
smembers users
• Acima temos 3 trips
• RTT – Round Trip Time
• Redis suporta pipelining
• Vários comandos enviados sem esperar por suas
respostas – batch de comandos
• Minimiza overhead de rede
41. Pipeline
• Exemplo usando a biblioteca redis-py
r=redis.Redis()
pipe=r.pipe ()
for i in range(10000):
pipe.ping()
pipe.execute()
42. Transaction
• Permitem a execução de um grupo de
comandos de forma atômica
• 2 garantias
– Comandos executados sequencialmente sem
interferência
– Tudo ou nada – Ou todos são executados ou
nenhum
48. Casos de Uso
• Contador
– Quando bloquear um IP
– Page Views
– Podemos utilizar o comando INCR
incr acess:127.0.0.1:06-10-2012
url = md5(url)
incr views:url:06-10-2012
Incr views:06-10-2012
49. Casos de Uso
• Sessões Web
– Redis para armazenar os dados de sessão
hset session:as242dsd user fjunior87
displayname junior
Expire session:as242dsd 1800
– django-redis-sessions
50. Casos de Uso
• Caching
– Podendo ser usado da mesma forma que o
memcache
– django-redis-cache