docu compression redis

compression - docu - Comprimir cadenas antes de ponerlas en redis, ¿tiene sentido?



api redis (3)

Un poco más de detalle: ya estamos tratando de aprovechar al máximo los zipmaps, ziplists, etc., y me pregunto si estas representaciones ya están comprimidas, o solo son hashes y listas serializadas; ¿La compresión reduce significativamente el uso de la memoria?

Además, ¿la sobrecarga de compresión en la capa del servidor de aplicaciones se compensa con un menor uso de la red? La experiencia de StackOverflow sugiere que sí, ¿alguna otra opinión?

En resumen, ¿tiene sentido, para cuerdas cortas y más largas?


Hay una forma práctica de obtener una buena compresión, incluso para cadenas muy pequeñas (50 bytes) -

Si sus valores son algo similares entre sí, por ejemplo, son representaciones JSON de algunas clases de objetos relacionados, puede precomputar un diccionario de compresor / descompresor basado en algún texto de ejemplo.

Suena complicado, pero es simple en la práctica, y aún más simple con el código de envoltura correcto para manejarlo.

Aquí hay una implementación de Python:

https://github.com/internetarchive/openlibrary/blob/master/openlibrary/utils/compress.py

y aquí hay un contenedor para comprimir una clase específica de cadenas: (registros JSON cortos)

https://github.com/internetarchive/openlibrary/blob/master/openlibrary/utils/olcompress.py

Una pega: para hacer esto de manera eficiente, su biblioteca de compresión debe admitir la "clonación" del estado interno. (La biblioteca de Python sí) Puede implementar algo similar anteponiendo el texto de ejemplo al comprimir, pero esto significa pagar un costo de cálculo adicional.

Gracias a solrize por este increíble truco.


Redis no comprime sus valores, y si debe comprimirlos usted mismo depende mucho del tamaño de las cadenas que va a almacenar. Para cadenas grandes, cientos de K''s y más, probablemente valga la pena los ciclos extra de CPU en el lado del cliente, al igual que cuando se prestan servicios a páginas web, pero para cadenas más cortas es probable que sea una pérdida de tiempo. Las cuerdas cortas generalmente no comprimen mucho, por lo que la ganancia sería demasiado pequeña.


Redis y los clientes suelen estar vinculados a IO y los costos de IO son típicamente de al menos 2 órdenes de magnitud con respecto al resto de la secuencia de solicitud / respuesta. Las cargas más pequeñas le proporcionarán un mayor rendimiento y menores latencias.

No creo que haya otras reglas duras y rápidas: el cost of compression << IO gains . Debes ponerlo en un banco y encontrar el punto de sudor al establecer el límite inferior, pero el MTU de tu red no es un mal punto de partida para el límite inferior.