¿Qué es?
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.
Redis vs Memcached
Redis y Memcached son sistemas de almacenamiento de datos en memoria.
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.
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é.
Las principales características de Redis frente a Memcached son:
- Redis admite operaciones de datos más completas que Memcached. Posee más estructura de datos (sorted set, hash, list, etc).
- 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.
- 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.
- 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).
- Redis soporta valores de hasta 512 MB de tamaño. Memcached limitada a 1 MB por clave-valor.
Instalación de Redis Server
Redis Server en Windows
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.
El instalador se obtiene del siguiente enlace según recomendaciones del sitio RedisLab:
https://github.com/dmajkic/redis/downloads
Luego de descargar el archivo, descomprimir el zip que contiene todos los binarios de la aplicación.
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:
redis-server.exe
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:
redis-cli.exe
Una vez se ingresa en la consola cliente, se puede usar el comando PING y el servidor nos debe contestar con PONG.
Redis Server en Linux
Por medio de binarios
Descargar la versión de Redis para Linux del siguiente enlace:
o con el comando:
$ wget https://download.redis.io/releases/redis-6.0.8.tar.gz
Luego, descomprimir el tar.gz que contiene todos los binarios de la aplicación.
$ tar xzf redis-6.0.8.tar.gz
Ingresar a la carpeta, y compilar los binarios:
$ cd redis-6.0.8
$ make
Una vez compilada la solución se usa el siguiente comando para ejecutar Redis server:
$ src/redis-server
Una vez verificado que corre, se puede seguir con la creación del archivo .service para dejar la aplicación como servicio.
Por medio del repositorio
Descargar el rpm del siguiente enlace:
$ wget http://rpms.remirepo.net/enterprise/7/remi/x86_64/redis-devel-6.0.8-1.el7.remi.x86_64.rpm
Instalar el rpm con el siguiente comando:
$ sudo yum install redis-6.0.8-1.el7.remi.x86_64.rpm
Para iniciar el servicio:
$ sudo systemctl start redis.service
Configuración
La configuración de Redis se realiza por medio del archivo /etc/redis.conf y está dividido en diferentes secciones. Los parámetros de configuración más más importantes corresponden a los siguientes:
INCLUDES
Permite incluir uno o más archivos adicionales de configuración. Ejemplo:
# include /path/to/local.conf
# include /path/to/other.conf
MODULES
Permite cargar modulos al inicio de la aplicación. Ejemplo:
# loadmodule /path/to/my_module.so
# loadmodule /path/to/other_module.so
NETWORK
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:
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
# protected-mode yes
# port 6379
# timeout 0
# tcp-keepalive 300
GENERAL
Por defecto, Redis no corre como un deamon
# daemonize no
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: upstart, systemd o auto.
# supervised no
Se puede especificar el archivo donde va a estar registrado el id del proceso de la máquina.
# pidfile /var/run/redis_6379.pid
Se puede especificar el nivel de logger que tendrá la aplicación. Maneja los niveles: debug, verbose, notice y warning. Por defecto está en notice, que es moderado y especializado para ambientes productivos.
# loglevel notice
Se puede especificar el nombre del archivo log del servicio.
# logfile /var/log/redis/redis.log
Se puede especificar logging en el logger del sistema.
# syslog-enabled no
Se puede especificar la cantidad de base de datos que el servicio va a emplear.
# databases 16
SNAPSHOTTING
Permite guardar cambios en la base de datos después del tiempo especificado. Ejemplo:
Guarda si:
- Después de 900 segundos si al menos hay un cambio
- Después de 300 segundos si al menos hay 10 cambios
- Después de 60 segundos si al menos hay 10000 cambios.
# save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
Se puede especificar el nombre de archivo de la base de datos y el sitio donde estará ubicado.
# dbfilename dump.rdb
# dir /var/lib/redis
REPLICATION
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:
# replicaof <masterip> <masterport>
Si la máquina master está protegida por contraseña se puede indicar en esta sección:
# masterauth <master-password>
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.
# replica-serve-stale-data yes
Redis permite configurar para que la réplica sea de solo lectura:
# replica-read-only yes
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.
# repl-diskless-sync no
# repl-diskless-sync-delay 5
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.
# repl-ping-replica-period 10
Redis permite configurar un tiempo de timeout en segundos, entre la réplica y la master.
# repl-timeout 60
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.
# repl-disable-tcp-nodelay no
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.
# replica-priority 100
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.
# min-replicas-to-write 3
# min-replicas-max-lag 10
SECURITY
Redis permite configurar un password de autenticación para la conexión de los clientes al servidor redis.
# requirepass foobared
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.
# rename-command CONFIG b840fc02d524045429941cc15
CLIENTS
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.
# maxclients 10000
MEMORY MANAGEMENT
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.
# maxmemory <bytes>
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:
- volatile-lru: Expulsa usando la cantidad de llaves LRU entre un conjunto de llaves a expirar.
- allkeys-lru: Expulsa cualquier llave entre LRU.
- volatile-lfu: Expulsa usando la cantidad de llaves LFU entre un conjunto de llaves a expirar.
- allkeys-lfu: Expulsa cualquier llave entre LFU.
- volatile-random: Remueve llaves aleatoriamente entre un conjunto que tengan definido expiración.
- allkeys-random: Remueve aleatoriamente cualquier tipo de llave.
- volatile-ttl: Remueve llaves con el tiempo más cercano de expiracion. (menor TTL)
-
noeviction: No expulsa nada. Retorna un error para las operaciones de escritura.
- LRU significa Least Recently Used – Menos usado reciemente.
- LFU significa Least Frequently Used – Menos usado frecuentemente.
Por defecto, redis está configurado con la política noeviction
# maxmemory-policy noeviction
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.
maxmemory-samples 5
Otros artículos que te podrían interesar...
- AWS S3 Batch Operations
- AWS S3 Inventory
- Qué ofrece y cómo se configura AWS Elasticache?
- Qué ofrece y cómo se configura Elasticache en AWS?
- How to use Redis with Spring in Java
Do you like it? You can buy me a beer if you want.
Originally published at juanc4milo.dev
Top comments (0)