Lab Redis
Lab Redis
Lab Redis
Redis, que significa Remote Dictionary Server (servidor de diccionarios remoto), es un rápido almacén de
datos clave-valor en memoria de código abierto que se puede utilizar como base de datos, caché, agente de
mensajes y cola. El proyecto se inició cuando Salvatore Sanfilippo, el desarrollador original de Redis, trataba
de mejorar la escalabilidad de su startup italiana.
Redis ofrece ahora tiempos de respuesta inferiores al milisegundo, lo que permite que se realicen millones
de solicitudes por segundo para aplicaciones en tiempo real de videojuegos, tecnología publicitaria, servicios
financieros, sanidad e IoT. Redis es una opción muy habitual en aplicaciones de almacenamiento en caché,
administración de sesiones, videojuegos, tablas de clasificación, análisis en tiempo real, datos geoespaciales,
servicios de vehículos compartidos, chat/mensajería, streaming de contenido multimedia y
publicación/suscripción.
Todos los datos de Redis residen en la memoria, a diferencia de las bases de datos que almacenan datos en
discos o SSD. Como no hay ninguna necesidad de obtener acceso al disco, los almacenes de datos en
memoria, como Redis, evitan los retrasos y pueden obtener acceso a los datos en cuestión de milisegundos.
Redis incluye estructuras de datos versátiles, alta disponibilidad, datos geoespaciales, scripts Lua,
transacciones, persistencia en disco y soporte de clúster, lo que simplifica la creación de aplicaciones a escala
de Internet en tiempo real.
Conjuntos: una colección desordenada de cadenas con la capacidad para intercalarse, unirse y
diferenciarse de otros tipos de conjuntos
Hashes: una estructura de datos para almacenar una lista de campos y valores
HyperLogLogs: una estructura de datos probabilísticos para estimar los elementos únicos en un
conjunto de datos
Replicación y persistencia
Redis utiliza una arquitectura con servidor principal y réplica y admite la replicación asíncrona en la que los
datos se replican en numerosos servidores de réplicas. De este modo, se logra un mejor nivel de rendimiento
de lectura (ya que las solicitudes se pueden repartir entre varios servidores) y menores tiempos de
recuperación cuando el servidor principal sufre un corte. Por una cuestión de persistencia, Redis admite
copias de seguridad puntuales (copia el conjunto de datos Redis en el disco).
Beneficios
Excepcionalmente rápido: Redis es muy rápido y puede realizar aproximadamente 110000 SETS por segundo,
aproximadamente 81000 GETs por segundo.
Admite tipos de datos enriquecidos: Redis admite de forma nativa la mayoría de los tipos de datos que la
mayoría de los desarrolladores ya conocen como lista, conjunto, conjunto ordenado, hashes. Esto hace que
sea muy fácil resolver una variedad de problemas porque sabemos qué problema puede manejarse mejor
por qué tipo de datos.
Las operaciones son atómicas: todas las operaciones de Redis son atómicas, lo que garantiza que si dos
clientes acceden simultáneamente al servidor de Redis obtendrán el valor actualizado.
Redis no garantiza que todas las escrituras se guarden en caso de un error grave, pero en el peor de los casos
solo se perderían unos segundos de datos. Recuerde que una memoria caché no está diseñada para actuar
como un origen de datos crítico o core de negocio y que es responsabilidad de las aplicaciones que usan la
memoria caché asegurarse de que los datos críticos se guardan correctamente en un almacén de datos
adecuado.
Agrupación en clústeres y replicación de Redis
En el caso de una partición de red, los subordinados pueden continuar sirviendo datos y luego volver a
sincronizar de manera transparente con el maestro cuando se restablece la conexión. Para obtener más
información, visite la página Replicación en el sitio web de Redis.
Redis también ofrece agrupación en clústeres, lo que le permite particionar los datos de manera
transparente en particiones entre servidores y distribuir la carga. Esta característica mejora la escalabilidad,
puesto que se pueden agregar nuevos servidores de Redis y se pueden volver a particionar los datos
conforme aumenta el tamaño de la caché.
Una caché de Redis tiene un tamaño limitado que depende de los recursos disponibles en el equipo host. Al
configurar un servidor de Redis, puede especificar la cantidad máxima de memoria que puede usar. También
puede configurar una clave en una caché de Redis para que tenga un tiempo de expiración, tras lo cual se
quita automáticamente de la caché. Esta característica puede ayudar a impedir que la caché en memoria se
rellene con datos obsoletos o antiguos.
Conforme se rellena la memoria, Redis puede expulsar automáticamente las claves y sus valores siguiendo
varias directivas. El valor predeterminado es LRU (menos usados recientemente), pero también puede
seleccionar otras directivas como expulsar las claves de manera aleatoria o desactivar completamente la
expulsión (en cuyo caso, los intentos de agregar elementos a la caché generarán error si se llena).
Redis habilita una aplicación cliente para que envíe una serie de operaciones que leer y escriben datos en la
memoria caché como una transacción atómica. Se tiene la garantía de que todos los comandos de la
transacción se ejecutan secuencialmente y de que ninguno de los comandos emitidos por otros clientes
simultáneos se entrelazará entre ellos.
Sin embargo, estas no son verdaderas transacciones como las realizaría una base de datos relacional. El
procesamiento de transacciones consta de dos fases: la primera es cuando los comandos se ponen en cola y
la segunda es cuando los comandos se ejecutan. Durante la fase de puesta en cola de comandos, el cliente
envía los comandos que componen la transacción. Si se produce algún tipo de error en este momento (por
ejemplo, un error de sintaxis o un número incorrecto de parámetros), Redis rechaza el procesamiento de
toda la transacción y la descarta.
Durante la fase de ejecución, Redis ejecuta cada comando en cola en secuencia. Si se produce un error de
un comando durante esta fase, Redis continuará con el siguiente comando en cola y no revertirá los efectos
de los comandos que ya se hayan ejecutado. Esta forma simplificada de transacción ayuda a mantener el
rendimiento y a evitar los problemas de rendimiento provocados por la contención.
Redis no implementa una forma de bloqueo optimista para ayudar a mantener la coherencia.
Seguridad de Redis
Redis se centra exclusivamente en ofrecer un acceso rápido a los datos y está diseñado para ejecutarse
dentro de un entorno de confianza al que solo puedan acceder los clientes de confianza. Redis admite un
modelo de seguridad limitada basado en la autenticación mediante contraseña. (Aunque es posible quitar la
autenticación completamente, no se recomienda).
Todos los clientes autenticados comparten la misma contraseña global y tienen acceso a los mismo recursos.
Si necesita una seguridad de inicio de sesión más completa, debe implementar su propia capa de seguridad
delante del servidor de Redis y todas las solicitudes de cliente deben pasar por esta capa adicional. Redis no
debe exponerse directamente a clientes que no sean de confianza o sin autenticar.
Puede restringir el acceso a los comandos deshabilitándolos o cambiándolos de nombre (y ofreciendo solo a
los clientes con privilegios los nuevos nombres).
Redis no admite directamente ninguna forma de cifrado de datos, por lo que toda la codificación debe
realizarse por las aplicaciones cliente. Además, Redis no proporciona ninguna forma de seguridad de
transporte. Si necesita proteger los datos que fluyen a través de la red, se recomienda implementar un proxy
SSL.
La creación de una caché que es mucho mayor de lo que se puede almacenar en un servidor único.
La colocación geográfica de los datos cerca de los usuarios que acceden a ellos, lo que reduce la
latencia.
Para una memoria caché, la forma más común de crear particiones es mediante el particionamiento. En esta
estrategia, cada partición es una caché de Redis por derecho propio. Los datos se dirigen a una partición
específica mediante el uso de lógica de particionamiento, que puede usar una variedad de enfoques para
distribuir los datos.
Para implementar la creación de particiones en una caché de Redis, puede adoptar uno de los enfoques
siguientes:
Enrutamiento de consultas del lado servidor. En esta técnica, una aplicación cliente envía una
solicitud a cualquiera de los servidores de Redis que componen la memoria caché (probablemente,
el servidor más cercano). Cada servidor Redis almacena metadatos que describen la partición que
contiene y también incluye información acerca de qué claves particiones se encuentran en otros
servidores. El servidor Redis examina la solicitud del cliente. Si se puede resolver localmente, realiza
la operación solicitada. De lo contrario, reenvía la solicitud al servidor apropiado.
Creación de particiones del lado cliente. En este modelo, la aplicación cliente contiene lógica
(posiblemente en forma de una biblioteca) que enruta solicitudes al servidor de Redis adecuado.
Creación de particiones asistida por proxy. En este esquema, las aplicaciones cliente envían
solicitudes a un servicio proxy intermediario que comprende cómo se particionan los datos y luego
enruta la solicitud al servidor de Redis adecuado.
REDIS - INSTALL
https://github.com/dmajkic/redis/downloads
5. In the above prompt 127.0.0.1 is your machine's IP address and 6379 is port on which redis server
is running. Now type the PING command as shown below.
PONG
This shows that you have successfully installed redis on your machine.
REDIS - CONFIGURATION
In Redis, there is a configuration file (redis.conf) available at the root directory of Redis. Although you can
get and set all Redis configurations by Redis CONFIG command.
Following is the basic syntax of Redis CONFIG command: CONFIG GET CONFIG_SETTING_NAME
6. To know the log level of Redis, type the command:
7. We can also update the loglevel by using the commando CONGIG SET:
10. Redis supports 5 types of data types, which are described below:
Strings
Redis string is a sequence of bytes. Strings in Redis are binary safe, meaning they have a known length not
determined by any special terminating characters, so you can store anything up to 512 megabytes in one
string.
11. Hashes Datatype: A Redis hash is a collection of key value pairs. Redis Hashes are maps between
string fields and string values, so they are used to represent objects
In the above example hash data type is used to store user's object which contains basic information of user.
Here HMSET, HEGTALL are commands for redis while user:1 is the key.
12. Lists Datatype: Redis Lists are simply lists of strings, sorted by insertion order. You can add elements
to a Redis
The max length of a list is 232 - 1 elements (4294967295, more than 4 billion of elements per list).
13. Sets Datatype: Redis Sets are an unordered collection of strings. In Redis, you can add, remove, and test for
the existence of members in O(1) time complexity.
Note − In the above example, rabitmq is added twice, however due to unique property of
the set, it is added only once.
The max number of members in a set is 2 32 - 1 (4294967295, more than 4 billion of
members per set).
14. Sorted Datatype: Redis Sorted Sets are similar to Redis Sets, non-repeating
collections of Strings. The difference is, every member of a Sorted Set is associated
with a score, that is used in order to take the sorted set ordered, from the smallest
to the greatest score. While members are unique, the scores may be repeated.
15. Redis keys commands are used for managing keys in Redis. Following is the syntax for using
redis keys commands.
Syntax: COMMAND KEY_NAME
In the above example, DEL is the command, while example is the key. If the key is deleted, then
the output of the command will be (integer) 1, otherwise it will be (integer) 0.
1 DEL key
This command returns a serialized version of the value stored at the specified key.
3 EXISTS key
Sets the expiry of the key after the specified time. Here time is in Unix timestamp format.
8 KEYS pattern
9 MOVE key db
10 PERSIST key
11 PTTL key
12 TTL key
13 RANDOMKEY
16 TYPE key
17. Gets the remaining time in keys expiry in milliseconds with PEXPIRE
What happened?
Redis – Strings commands
19. Redis strings commands are used for managing string values in Redis. Following is the syntax
for using Redis string commands.
2 GET key
Sets the string value of a key and return its old value.
Returns the bit value at the offset in the string value stored at the key.
Sets or clears the bit at the offset in the string value stored at the key
Sets the value of a key, only if the key does not exist
Overwrites the part of a string at the key starting at the specified offset
11 STRLEN key
Sets multiple keys to multiple values, only if none of the keys exist
15 INCR key
18 DECR key
Redis - Hashes
21. Redis Hashes are maps between the string fields and the string values. Hence, they
are the perfect data type to represent objects. In Redis, every hash can store up to
more than 4 billion field-value pairs.
4 HGETALL key
Gets all the fields and values stored in a hash at the specified key
7 HKEYS key
8 HLEN key
Sets the value of a hash field, only if the field does not exist
13 HVALS key
When we add items to a hash, again we get a return value that tells whether the item is
new in the hash.
We can fetch all of the items in the HASH, which gets translated into a dictionary on the
Python side of things.
When we delete items from the hash, the command returns whether the item was there
before we tried to remove it.
23. In the following example, poet:Verlaine is the hash key. Dots, dashes, and colons
are commonly used to make multi-word keys and fields more readable. It’s helpful
to make sure that your keys follow a consistent and easily readable format.
Also, note that hset will overwrite the contents of the hash if it already exists:
hset poet:Verlaine nationality Francais
If the field already exists and its value was updated successfully, hset will return (integer)
0:
Output
(integer) 0
You can also use hsetnx to add fields to hashes, but it will only work if the field does not
yet exist. If the specified field does already exist, the hsetnx won’t have any effect and will
return (integer) 0:
Output
(integer) 0
Redis – Lists
24. Redis Lists are simply lists of strings, sorted by insertion order. You can add
elements in Redis lists in the head or the tail of the list. Maximum length of a list is
232 - 1 elements (4294967295, more than 4 billion of elements per list).
In the above example, three values are inserted in Redis list named ‘tutorials’ by the
command LPUSH.
Removes and gets the first element in a list, or blocks until one is available
Removes and gets the last element in a list, or blocks until one is available
Pops a value from a list, pushes it to another list and returns it; or blocks until one is
available
4 LINDEX key index
6 LLEN key
7 LPOP key
14 RPOP key
Removes the last element in a list, appends it to another list and returns it
25. A key can only hold one list, although any list can hold over four billion elements. Redis
reads lists from left to right, and you can add new list elements to the head of a list (the
“left” end) with the lpush command or the tail (the “right” end) with rpush. You can also
use lpush or rpush to create a new list:
26. The lpushx and rpushx commands are also used to add elements to lists, but will only work
if the given list already exists. If either command fails, it will return (integer) 0:
27. To retrieve a range of items in a list, use the lrange command followed by a start offset and
a stop offset. Each offset is a zero-based index, meaning that 0 represents the first element
in the list, 1 represents the next, and so on.
The following command will return all the elements from the example list created in the
previous section:
lrange key_philosophy1 0 7
Redis - Sets
28. Redis Sets are an unordered collection of unique strings. Unique means sets does
not allow repetition of data in a key.
In Redis set add, remove, and test for the existence of members in O(1) (constant time
regardless of the number of elements contained inside the Set). The maximum length of a
list is 232 - 1 elements (4294967295, more than 4 billion of elements per set).
2 SCARD key
10 SPOP key
Redis – HyperLogLog
Following example explains how Redis HyperLogLog works. The demo version that is
being used for the laboratory does not support this algorithm.
redis 127.0.0.1:6379> PFADD tutorials "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD tutorials "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD tutorials "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT tutorials
(integer) 3
30. Redis Pub/Sub implements the messaging system where the senders (in redis terminology
called publishers) sends the messages while the receivers (subscribers) receive them. The
link by which the messages are transferred is called channel.
In Redis, a client can subscribe any number of channels. Following example explains how
publish subscriber concept works. In the following example, one client subscribes a channel
named ‘redisChat’.
31. Open a new Redis Client terminal. Now, two clients are publishing the messages on
the same channel named ‘redisChat’ and the above subscribed client is receiving
messages.
Redis - Connections
Redis connection commands are basically used to manage client connections with Redis
server.
1 AUTH password
2 ECHO message
3 PING
4 QUIT
5 SELECT index
Changes the selected database for the current connection
Redis – Server
32. Redis server commands are basically used to manage Redis server.
Following example explains how we can get all statistics and information about the server.
redis 127.0.0.1:6379> INFO
# Server
redis_version:2.8.13
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:c2238b38b1edb0e2
redis_mode:standalone
os:Linux 3.5.0-48-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.7.2
process_id:3856
run_id:0e61abd297771de3fe812a3c21027732ac9f41fe
tcp_port:6379
uptime_in_seconds:11554
uptime_in_days:0 hz:10
lru_clock:16651447
config_file:
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:589016
used_memory_human:575.21K
used_memory_rss:2461696
used_memory_peak:667312
used_memory_peak_human:651.67K
used_memory_lua:33792
mem_fragmentation_ratio:4.18
mem_allocator:jemalloc-3.6.0
# Persistence
loading:0
rdb_changes_since_last_save:3
rdb_bgsave_in_progress:0
rdb_last_save_time:1409158561
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:24
total_commands_processed:294
instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:41
keyspace_misses:82
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:264
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:10.49
used_cpu_user:4.96
used_cpu_sys_children:0.00
used_cpu_user_children:0.01
# Keyspace
db0:keys = 94,expires = 1,avg_ttl = 41638810
db1:keys = 1,expires = 0,avg_ttl = 0
db3:keys = 1,expires = 0,avg_ttl = 0
Redis – Backup
33. Redis SAVE command is used to create a backup of the current Redis database.
This command will create a dump.rdb file in your Redis directory. To restore Redis data,
move Redis backup file (dump.rdb) into your Redis directory and start the server. To get
your Redis directory, use CONFIG command of Redis as shown below.
Redis – Security
34. Redis database can be secured, such that any client making a connection needs to
authenticate before executing a command. To secure Redis, you need to set the
password in the config file.
By default, this property is blank, which means no password is set for this instance. You
can change this property by executing the following command.
127.0.0.1:6379> CONFIG set requirepass "mypassword"
OK
After setting the password, if any client runs the command without authentication,
then (error) NOAUTH Authentication required. error will return. Hence, the client needs
to use AUTH command to authenticate himself.
CONGRATULATIONS!!!