Redis - Instalación y Configuración
Tags: redis, database, cache, caching
Published: 2020-10-26 02:22:44

<h2 id="redis-que-es">¿Qué es?</h2>

<p>Redis es un almacén de estructura de datos en memoria y es de código abierto (licencia BSD), que se utiliza como agente de base de datos, caché o bróker de mensajería. Admite estructuras de datos como cadenas, hashes, listas, conjuntos o conjuntos ordenados.</p>

![redis318x260_1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603519527691/A0Vr68m6G.png)

<h2 id="redis-vs-memcached">Redis vs Memcached</h2>

<p><a href="https://redis.io">Redis</a> y <a href="https://memcached.org">Memcached</a> son sistemas de almacenamiento de datos en memoria.</p>

<p>Tanto Memcached como Redis sirven como almacén de datos clave-valor en memoria, aunque Redis se describe con mayor precisión como un almacén de estructura de datos.</p>

<p>Tanto Memcached como Redis pertenecen a la familia de soluciones de gestión de datos NoSQL, y ambas se basan en un modelo de datos clave-valor. Ambos mantienen todos los datos en la RAM, lo que, por supuesto, los hace sumamente útiles como capa de almacenamiento en caché.</p>

<p>Las principales características de Redis frente a Memcached son:</p>

<ul><li>Redis admite operaciones de datos más completas que Memcached. Posee más estructura de datos (sorted set, hash, list, etc).</li><li>Eficiencia de uso de memoria. Memcached tiene una tasa de utilización de memoria más alta para un simple almacenamiento de clave-valor. Redis utiliza un modo de compresión de data en memoria.</li><li>Redis solo usa núcleos individuales, mientras que Memcached utiliza múltiples núcleos. Entonces, en promedio, Redis cuenta con un rendimiento más alto que Memcached en el almacenamiento de datos pequeños cuando se mide en términos de núcleos.</li><li>Memcached solo usa una política de vaciado de cache, con el algoritmo LRU (menos recientemente usado). Redis soporta 6 diferentes tipos de política (con algoritmo LRU y LFU).</li><li>Redis <a rel="noreferrer noopener" href="https://docs.oracle.com/cd/E17952_01/mysql-5.6-en/ha-memcached-faq.html#faq-memcached-max-object-size" target="_blank">soporta valores de hasta 512 MB</a> de tamaño. Memcached limitada a 1 MB por clave-valor.</li></ul>

<h2 id="instalacion-redis-server">Instalación de Redis Server</h2>

<h3 id="redis-server-windows">Redis Server en Windows</h3>

<p>Para Windows existe una versión no oficial de la aplicación donde un usuario ha tomado los compilados y los ha puesto a disposición para trabajar en el sistema operativo Windows.</p>

<p>El instalador se obtiene del siguiente enlace según recomendaciones del sitio RedisLab:</p>

<p><a href="https://github.com/dmajkic/redis/downloads" target="_blank" rel="noreferrer noopener">https://github.com/dmajkic/redis/downloads</a></p>

<p>Luego de descargar el archivo, descomprimir el zip que contiene todos los binarios de la aplicación.</p>

<p>Abrir consola de Windows, y ubicarse en la carpeta donde se encuentran los archivos de Redis. Para iniciar el servidor Redis se ejecuta el comando:</p>

<pre><code><em>redis-server.exe</em></code></pre>


![image-33.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603519614470/4RpHu3nwX.png)

<p>Para verificar que está corriendo correctamente el servidor Redis, en otra consola de comandos, nos ubicamos nuevamente en la carpeta donde se encuentran los archivos de Redis y se ejecuta el cliente:</p>

<pre><code><em>redis-cli.exe</em></code></pre>


![image-34.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603519629499/n4Ug4iP5j.png)

<p>Una vez se ingresa en la consola cliente, se puede usar el comando PING y el servidor nos debe contestar con PONG.</p>


![image-35.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603519643140/stR4DOzYG.png)

<h3 id="redis-server-linux">Redis Server en Linux</h3>

<h4 id="redis-server-linux-binaries">Por medio de binarios</h4>

<p>Descargar la versión de Redis para Linux del siguiente enlace:</p>

<p><a href="https://redis.io/download" target="_blank" rel="noreferrer noopener">https://redis.io/download</a></p>

<p>o con el comando:</p>

<pre><code>$ <em>wget https://download.redis.io/releases/redis-6.0.8.tar.gz</em></code></pre>

<p>Luego, descomprimir el tar.gz que contiene todos los binarios de la aplicación.</p>

<pre><code>$ <em>tar xzf redis-6.0.8.tar.gz</em></code></pre>

<p>Ingresar a la carpeta, y compilar los binarios:</p>

<pre><code>$ <em>cd redis-6.0.8</em><br>$ <em>make</em></code></pre>

<p>Una vez compilada la solución se usa el siguiente comando para ejecutar Redis server:</p>

<pre><code>$ <em>src/redis-server</em></code></pre>

<p>Una vez verificado que corre, se puede seguir con la creación del archivo <em>.service</em> para dejar la aplicación como servicio.</p>

<h4 id="redis-server-linux-repository">Por medio del repositorio</h4>

<p>Descargar el rpm del siguiente enlace:</p>

<pre><code>$ <em>wget http://rpms.remirepo.net/enterprise/7/remi/x86_64/redis-devel-6.0.8-1.el7.remi.x86_64.rpm</em></code></pre>

<p>Instalar el rpm con el siguiente comando:</p>

<pre><code>$ <em>sudo yum install redis-6.0.8-1.el7.remi.x86_64.rpm</em></code></pre>

<p>Para iniciar el servicio:</p>

<pre><code>$ <em>sudo systemctl start redis.service</em></code></pre>

<h2 id="redis-conf">Configuración</h2>

<p>La configuración de Redis se realiza por medio del archivo <em><strong>/etc/redis.conf</strong></em> y está dividido en diferentes secciones. Los parámetros de configuración más más importantes corresponden a los siguientes:</p>

<h3 id="redis-conf-includes">INCLUDES</h3>

<p>Permite incluir uno o más archivos adicionales de configuración. Ejemplo:</p>

<pre><code># include /path/to/local.conf<br># include /path/to/other.conf</code></pre>

<h3 id="redis-conf-modules">MODULES</h3>

<p>Permite cargar modulos al inicio de la aplicación. Ejemplo:</p>

<pre><code># loadmodule /path/to/my_module.so<br># loadmodule /path/to/other_module.so</code></pre>

<h3 id="redis-conf-network">NETWORK</h3>

<p>Permite configurar las directivas de red de la aplicación, tales como interfaces por las que debe escuchar conexiones. Si no se especifica ningún enlace, la aplicación escucha por todas las interfaces de red disponibles en el servidor. Por defecto el modo protección se encuentra habilitado, escuchando solo por la interfaz de red local 127.0.0.1. Para permitir conexiones desde otros servidores se deben especificar en esta sección. El puerto por defecto de la aplicación es 6379. El tiempo timeout por defecto es 0, quiere decir que esta deshabilitado. Para mantener viva a conexión TCP por defecto está en 300 segundos donde la aplicación envía ACKs para saber si los clientes están con conexión activa. Ejemplo:</p>

<pre><code># bind 192.168.1.100 10.0.0.1<br># bind 127.0.0.1 ::1<br># protected-mode yes<br># port 6379<br># timeout 0<br># tcp-keepalive 300</code></pre>

<h3 id="redis-conf-general">GENERAL</h3>

<p>Por defecto, Redis no corre como un deamon</p>

<pre><code># daemonize no</code></pre>

<p>Por defecto, Redis corre sin modo de supervisado, de modo que si el servicio se detiene, no se informa al sistema del estado del servicio. Se puede especificar: <em>upstart</em>, <em>systemd</em> o <em>auto</em>.</p>

<pre><code># supervised no</code></pre>

<p>Se puede especificar el archivo donde va a estar registrado el id del proceso de la máquina.</p>

<pre><code># pidfile /var/run/redis_6379.pid</code></pre>

<p>Se puede especificar el nivel de logger que tendrá la aplicación. Maneja los niveles: <em>debug</em>, <em>verbose</em>, <em>notice</em> y <em>warning</em>. Por defecto está en <em>notice</em>, que es moderado y especializado para ambientes productivos.</p>

<pre><code># loglevel notice</code></pre>

<p>Se puede especificar el nombre del archivo log del servicio.</p>

<pre><code># logfile /var/log/redis/redis.log</code></pre>

<p>Se puede especificar logging en el logger del sistema.</p>

<pre><code># syslog-enabled no</code></pre>

<p>Se puede especificar la cantidad de base de datos que el servicio va a emplear.</p>

<pre><code># databases 16</code></pre>

<h3 id="redis-conf-snapshotting">SNAPSHOTTING</h3>

<p>Permite guardar cambios en la base de datos después del tiempo especificado. Ejemplo:</p>

<p>Guarda si:</p>

<ul><li>Después de 900 segundos si al menos hay un cambio</li><li>Después de 300 segundos si al menos hay 10 cambios</li><li>Después de 60 segundos si al menos hay 10000 cambios.</li></ul>

<pre><code># save &lt;seconds&gt; &lt;changes&gt;<br>save 900 1<br>save 300 10<br>save 60 10000</code></pre>

<p>Se puede especificar el nombre de archivo de la base de datos y el sitio donde estará ubicado.</p>

<pre><code># dbfilename dump.rdb<br># dir /var/lib/redis</code></pre>

<h3 id="redis-conf-replication">REPLICATION</h3>

<p>Permite configurar replicación de la información entre un servidor maestro y un esclavo. La replicación en redis es asíncrona. La réplica de redis tiene la capacidad de resincronizar parcialmente con la master si se llega a perder una pequeña cantidad de tiempo en el enlace de conexión. La replicación es automática y no requiere de intervención del usuario. Para indicar la máquina donde se va a realizar la réplica se debe habilitar lo siguiente:</p>

<pre><code># replicaof &lt;masterip&gt; &lt;masterport&gt;</code></pre>

<p>Si la máquina master está protegida por contraseña se puede indicar en esta sección:</p>

<pre><code># masterauth &lt;master-password&gt;</code></pre>

<p>Si la réplica pierde conexión con la master, por defecto, redis puede seguir contestando a las peticiones pero tal vez con data obsoleta o vacía. Se puede habilitar por configuración que redis trabaje siempre sincronizado con la master ajustando el parámetro de data obsoleta en no.</p>

<pre><code># replica-serve-stale-data yes</code></pre>

<p>Redis permite configurar para que la réplica sea de solo lectura:</p>

<pre><code># replica-read-only yes</code></pre>

<p>Redis permite configurar que las réplicas se realizan mediante un proceso de full sincronización donde se transmite toda la información a copiar creando un proceso dedicado en la maquina a escribir un archivo en el disco para pasar toda la información. Si se requiere que no se use el disco para evitar latencia de escritura de disco, se puede habilitar otra opción para que la sincronización sea por medio de sockets. Si la sincronización por sockets está habilitada se puede indicar el tiempo de espera en segundos entre transferencia de datos.</p>

<pre><code># repl-diskless-sync no<br># repl-diskless-sync-delay 5</code></pre>

<p>Las réplicas envían un comando PING hacia master cada cierto tiempo para validar conexión. Este valor por defecto está en 10 segundos.</p>

<pre><code># repl-ping-replica-period 10</code></pre>

<p>Redis permite configurar un tiempo de <em>timeout</em> en segundos, entre la réplica y la master.</p>

<pre><code># repl-timeout 60</code></pre>

<p>Redis permite configurar latencia de trafico TCP, por defecto esta deshabilitado, lo que indica que los paquetes TCP van a viajar con toda la información y ocupando todo el ancho de banda disponible. Si esta opción se habilita, se usan paquetes TCP más pequeños de información, usando menos ancho de banda, pero añadiendo una latencia en la transferencia de información.</p>

<pre><code># repl-disable-tcp-nodelay no</code></pre>

<p>Redis permite configurar prioridad entre las réplicas, indicando un valor entre 0 y 100. Entre mayor sea el número, más prioridad tiene sobre esa replica. Si tiene un valor de cero, nunca va a ser tenido en cuenta para realizar replica. Por defecto el valor está en 100.</p>

<pre><code># replica-priority 100</code></pre>

<p>Redis permite configurar la cantidad mínima de réplicas que se requiera para escribir data, y el tiempo máximo de latencia entre las réplicas. Si no se cumple con alguno de los escenarios, la master detiene las escrituras. Por defecto la cantidad mínima de réplicas esta deshabilitada y el tiempo de latencia está en 10 segundos.</p>

<pre><code># min-replicas-to-write 3<br># min-replicas-max-lag 10</code></pre>

<h3 id="redis-conf-security">SECURITY</h3>

<p>Redis permite configurar un password de autenticación para la conexión de los clientes al servidor redis.</p>

<pre><code># requirepass foobared</code></pre>

<p>Redis permite configurar renombramiento de los comandos, en especial de los más vulnerables como el comando CONFIG. Con esto se podría renombrar a algo que sea difícil de adivinar.</p>

<pre><code># rename-command CONFIG b840fc02d524045429941cc15</code></pre>

<h3 id="redis-conf-clients">CLIENTS</h3>

<p>Redis permite configurar el máximo número de clientes conectados al mismo tiempo. Por defecto, el número máximo es 10.000 clientes. Cuando se sobrepasa la cantidad, redis cierra todas las nuevas conexiones y envía un mensaje de error indicando que el número máximo de clientes ha sido alcanzado.</p>

<pre><code># maxclients 10000</code></pre>

<h3 id="redis-conf-memory-management">MEMORY MANAGEMENT</h3>

<p>Redis permite configurar el límite de cantidad de memoria disponible en bytes. Cuando se alcanza el límite, redis va a intentar remover llaves de acuerdo a la política de expulsión de data seleccionada.</p>

<pre><code># maxmemory &lt;bytes&gt;</code></pre>

<p>Las políticas disponibles para indicar el comportamiento que debe tener redis cuando se alcanza el límite máximo de memoria son las siguientes:</p>

<ul><li><em>volatile-lru</em>: Expulsa usando la cantidad de llaves LRU entre un conjunto de llaves a expirar.</li><li><em>allkeys-lru</em>: Expulsa cualquier llave entre LRU.</li><li><em>volatile-lfu</em>: Expulsa usando la cantidad de llaves LFU entre un conjunto de llaves a expirar.</li><li><em>allkeys-lfu</em>: Expulsa cualquier llave entre LFU.</li><li><em>volatile-random</em>: Remueve llaves aleatoriamente entre un conjunto que tengan definido expiración.</li><li><em>allkeys-random</em>: Remueve aleatoriamente cualquier tipo de llave.</li><li><em>volatile-ttl</em>: Remueve llaves con el tiempo más cercano de expiracion. (menor TTL)</li><li><em>noeviction</em>: No expulsa nada. Retorna un error para las operaciones de escritura.<ul><li>LRU significa Least Recently Used – Menos usado reciemente.</li></ul><ul><li>LFU significa Least Frequently Used – Menos usado frecuentemente.</li></ul></li></ul>

<p>Por defecto, redis está configurado con la política <em>noeviction</em></p>

<pre><code># maxmemory-policy noeviction</code></pre>

<p>Redis toma muestras de la data para calcular los LRU y LFU. Redis permite configurar la cantidad de muestras a tomar. Por defecto está en 5 para dar buenos resultados. Un valor de 10 mejora notablemente la estadística pero consume mucha CPU, un valor de 3 hace que sea mucho más rápido pero la estadística no sea tan acertada.</p>

<pre><code>maxmemory-samples 5</code></pre>

### Otros artículos que te podrían interesar...

* [AWS S3 Batch Operations](https://juanc4milo.dev/aws-s3-batch-operations)
* [AWS S3 Inventory](https://juanc4milo.dev/inventario-aws-s3)
* [Qué ofrece y cómo se configura AWS Elasticache?](https://juanc4milo.dev/aws-elasticache)
* [Qué ofrece y cómo se configura Elasticache en AWS?](https://juanc4milo.dev/aws-elasticache)
*  [How to use Redis with Spring in Java](https://juanc4milo.dev/redis-with-spring-in-java)

**Do you like it?** You can [buy me a beer](https://buymeacoffee.com/juanc4milo) if you want.

> _Originally published at [juanc4milo.dev](https://juanc4milo.dev)_