Redis: no solo una caché

Post on 17-Jul-2015

185 views 2 download

Transcript of Redis: no solo una caché

Fernando Escolar@fernandoescolar

Alex Casquete@acasquete

¿Qué vamos a ver hoy?

• ¿Qué es Redis?

• Operaciones / Tipos de datos

• Transacciones

• Ejemplo Red Social

Algunos datos

• Redis = REmote DIctionary Server

• La primera release fue en 2009

• La versión más reciente: 2.8.19

• Escrito en C

• Tiene librerías para más de 30 lenguajes de programación

• Una buena documentación

Redis

“Redis es un Sistema de almacenamiento y caché avanzado, que usadatos de tipo clave-valor, open source y con licencia BSD.

Usualmente se le denomina servidor de estructura de datos ya queuna clave puede contener:

strings, hashes, lists, sets, sorted sets, bitmaps y hyperloglogs.”

Redis

• Redis trabaja in-memory pero persiste en disco

• 1 Millón de pequeñas “Key -> String” usan ~ 100 MB de memoria

• Un solo hilo de ejecución – pero la CPU no será un cuello de botella

• Un sistema normal Linux puede enviar 500k requests/segundo

• El límite de almacenamiento es la memoria disponible

• max. 232 keys

Diferencias con Memcached

• Memcached es un “Sistema de cache en memoria distribuido”

• Redis persiste los datos en el disco de forma eventual

• Memcached es un sistema caché LRU (Least Recently Used)

• Redis tiene diferentes tipos de datos y features

• Memcached es multi hilo

• Velocidad similar (en local)

Memcached

Redis

Demo: Consola

Operaciones / Tipos de datos

BASIC

• SET key value [EX seconds] [PX milliseconds] [NX|XX]

• GET key

• DEL key

BASIC

• EXISTS key

• KEYS pattern

• EXPIRE key seconds

• MGET key [key …]

• MSET key value [key value …]

STRINGS

• STRLEN KEY

• APPEND key value

ENTEROS

• INCR key / INCRBY key increment

• DECR key / DECRBY key increment

HASHES

• HSET key field value

• HGET key field

• HGETALL key

• HDEL key field [field …]

LISTAS

• LSET key index value

• LPUSH key value [value …] / RPUSH key value [value …]

• LPOP key / RPOP key

• LRANGE key start stop

• LREM key count value

SETS

• SADD key member [member …]

• SMEMBERS key / SRANDMEMBER key [count]

• SSCAN key cursor [MATCH pattern] [COUNT count]

• SISMEMBER key member

• SPOP key

• SREM key member [member …]

OPERACIONES CON SETS

• SINTER key [key …] / SINTERSTORE destination key [key …]

• SDIFF key [key …] / SDIFFSTORE destination key [key …]

• SUNION key [key …] / SUNIONSTORE destination key [key …]

SORTED SETS

• ZADD key score member [score member …]

• ZSCORE key member

• ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset

• count]

• ZREM key member [member ...]

• ZREMRANGEBYLEX key min max

• ZINCRBY key increment member

HYPERLOGLOG

“Hyperloglog es una técnica aproximada para calcular el número de entradas distintas en un conjunto (cardinalidad). Esto se consigueutilizando poca memoria. Por ejemplo, para conseguir el 99% de

precision, se necesitan solo 16 Kb.”

PUB/SUB

• SUBSCRIBE channel [channel …]

• UNSUBSCRIBE [channel [channel …]]

• PUBLISH channel message

TRANSACCIONES

• MULTI

• EXEC

• DISCARD

TRANSACCIONES

WATCH mykey

val = GET mykey

val = val + 1

MULTI

SET mykey $val

EXEC

HyperLogLog

• PFADD key element [element …]

• PFCOUNT key [key …]

• PFMERGE destkey sourcekey [sourcekey ...]

• Caso de uso: Track Unique Visitors

SCRIPTING

Ejecutar scripts LUA en lado servidor

• EVAL script numkeys key [key ...] arg [arg …]

• SCRIPT LOAD script

• EVALSHA sha1 numkeys key [key ...] arg [arg ...]

CASOS DE USO

• Listados de últimos xxx: LPUSH y LTRIM

• Tablas de top o de rankings: ZADD, ZREVRANGE y ZREVRANGEBYSCORE

• Cálculos de tipo “karma”: ZADD, ZRANK, ZINCRBY

• Contadores usuarios activos: INCR y EXPIRE

• Publicación y suscripción: mediator

• QUEUE’s (colas): BLPOP y LPUSH

• Textos auto-completables: ZADD, ZRANK y ZRANGE

• Almacenar información que caduca: EXPIRE

• …

Demo: Retwis

EN RESUMEN

• Maneja cadenas de texto (o byte arrays)

• 5 tipos de datos:• Keys

• Hashes

• Lists

• Sets

• Sorted Sets

• Pub/Sub

• Operaciones con datos

• Scripts en LUA

• En memoria, pero persiste en forma de snapshots

MÁS INFORMACIÓN

• https://github.com/fernandoescolar/Tokiota.Redis

• http://redis.io/documentation

• https://servicestack.net/

• Redis Bitmapshttp://blog.getspool.com/2011/11/29/fast-easy-realtime-metrics-using-redis-bitmaps/