Compresión GZIP y Redis

En mi antiguo trabajo hacíamos muchas peticiones a proveedores externos. De media eran unas 2K peticiones por segundo. Unos 170M peticiones al día. Cada una de éstas peticiones tenía su correspondiente respuesta, que acostumbraba a ser un JSON, pero podía ser un XML. El peso dependía mucho de la respuesta, pero variaba entre pocos KB hasta casi 1MB.

Guardábamos la respuesta en Redis, durante un breve periodo de tiempo (segundos). Al principio, guardábamos los datos «tal cual» y, obviamente, era un error.

GZIP

Comprimir texto es asquerosamente rápido. Hay muchos algoritmos de compresión, pero normalmente conseguiremos un 80% de compresión con respecto al tamaño original, y podemos comprimir entre 15 hasta 60MB/segundo.

En nuestro caso, no sólo era el tamaño en RAM que ocupaba éstos datos en el cluster de Redis, sino la transferencia de datos para guardar las claves en Redis, y leerlas seguidamente. Simplemente guardando información comprimida reducíamos dicho tráfico al 10-20% del original.

Sigue leyendo Compresión GZIP y Redis

Redis Benchmark

¿Cuán rápido puede Reddit Correr?

Redis es muy rápido, ¿pero cuánto? Realmente si no medimos la capacidad de nuestro nodo o cluster no podemos saber en qué cifras nos movemos y por tanto saber cuánto aguantará nuestra aplicación.

Pista: seguramente Redis no sea tu cuello de botella.

Velocidad de los comandos

En mi caso, desde un MacBook Pro (Retina, 15-inch, Mid 2015) con un 2,2 GHz Quad-Core Intel Core i7, y usando redis en Docker (redis:5) los resultados son los siguientes:

$ docker exec -it myredis redis-benchmark -q
PING_INLINE: 31847.13 requests per second
PING_BULK: 33411.29 requests per second
SET: 31377.47 requests per second
GET: 31816.74 requests per second
INCR: 31017.37 requests per second
LPUSH: 32520.32 requests per second
RPUSH: 30731.41 requests per second
LPOP: 32362.46 requests per second
RPOP: 33760.97 requests per second
SADD: 32499.19 requests per second
HSET: 32905.56 requests per second
SPOP: 32123.36 requests per second
LPUSH (needed to benchmark LRANGE): 31515.91 requests per second
LRANGE_100 (first 100 elements): 20942.41 requests per second
LRANGE_300 (first 300 elements): 12217.47 requests per second
LRANGE_500 (first 450 elements): 9434.85 requests per second
LRANGE_600 (first 600 elements): 7601.09 requests per second
MSET (10 keys): 29559.56 requests per second

En un servidor de DigitalOcean (Droplet 1GB) los resultados son:

Sigue leyendo Redis Benchmark