¿Redis es solo un caché?

255

He estado leyendo algunos documentos de Redis y probando el tutorial en http://try.redis-db.com/ . Hasta ahora, no puedo ver ninguna diferencia entre Redis y las tecnologías de almacenamiento en caché como Velocity o el Enterprise Library Caching Framework

Efectivamente, solo está agregando objetos a un almacén de datos en memoria utilizando una clave única. No parece haber ninguna semántica relacional ...

¿Qué me estoy perdiendo?

Matt Evans
fuente
3
De redis.io : Redis es un almacén de clave-valor avanzado de código abierto. A menudo se lo conoce como un servidor de estructura de datos ya que las claves pueden contener cadenas, hashes, listas, conjuntos y conjuntos ordenados. Dicho esto, voté para cerrar su pregunta ya que no se ajusta al formato de StackOverflow.
Linus Thiel el
29
Estoy de acuerdo con que no es un formato SO. ¿Dónde crees que sería más apropiado?
Matt Evans

Respuestas:

631

No, Redis es mucho más que un caché.

Como una caché, Redis almacena pares clave = valor. Pero a diferencia de un caché, Redis le permite operar con los valores. Hay 5 tipos de datos en Redis: cadenas, conjuntos, hash, listas y conjuntos ordenados. Cada tipo de datos expone varias operaciones.

La mejor manera de entender Redis es modelar una aplicación sin pensar en cómo la va a almacenar en una base de datos.

Digamos que queremos construir StackOverflow.com. Para que sea simple, necesitamos preguntas, respuestas, etiquetas y usuarios.

Preguntas de modelado, usuarios y respuestas

Cada objeto se puede modelar como un mapa. Por ejemplo, una Pregunta es un mapa con campos {id, título, fecha_preguntas, votos, preguntas_por, estado}. Del mismo modo, una respuesta es un mapa con campos {id, question_id, answer_text, respondido_por, votos, estado}. Del mismo modo, podemos modelar un objeto de usuario.

Cada uno de estos objetos se puede almacenar directamente en Redis como Hash. Para generar identificadores únicos, puede usar el comando de incremento atómico. Algo como esto -

$ HINCRBY unique_ids question 1
(integer) 1
$ HMSET question:1 title "Is Redis just a cache?" asked_by 12 votes 0
OK

$ HINCRBY unique_ids answer 1
(integer) 1
$ HMSET answer:1 question_id 1 answer_text "No, its a lot more" answered_by 15 votes 1
OK

Manejo de votos

Ahora, cada vez que alguien vota una pregunta o una respuesta, solo necesita hacer esto

$ HINCRBY question:1 votes 1
(integer) 1
$ HINCRBY question:1 votes 1
(integer) 2

Lista de preguntas para la página de inicio

A continuación, queremos almacenar las preguntas más recientes para mostrar en la página de inicio. Si estuviera escribiendo un programa .NET o Java, almacenaría las preguntas en una Lista. Resulta que esa es la mejor manera de almacenar esto también en Redis.

Cada vez que alguien hace una pregunta, agregamos su identificación a la lista.

$ lpush questions question:1
(integer) 1
$ lpush questions question:2
(integer) 1

Ahora, cuando desea renderizar su página de inicio, le pregunta a Redis las 25 preguntas más recientes.

$ lrange questions 0 24
1) "question:100"
2) "question:99"
3) "question:98"
4) "question:97"
5) "question:96"
...
25) "question:76"

Ahora que tiene los identificadores, recupere los elementos de Redis utilizando la canalización y muéstrelos al usuario.

Preguntas por etiquetas, ordenadas por votos

A continuación, queremos recuperar preguntas para cada etiqueta. Pero SO le permite ver las preguntas más votadas, nuevas preguntas o preguntas sin respuesta debajo de cada etiqueta.

Para modelar esto, utilizamos la función Conjunto clasificado de Redis. Un conjunto ordenado le permite asociar una puntuación con cada elemento. Luego puede recuperar elementos en función de sus puntajes.

Vamos a seguir adelante y hacer esto para la etiqueta Redis

$ zadd questions_by_votes_tagged:redis 2 question:1 
(integer) 1
$ zadd questions_by_votes_tagged:redis 10 question:2 
(integer) 1
$ zadd questions_by_votes_tagged:redis 5 question:613 
(integer) 1
$ zrange questions_by_votes_tagged:redis 0 5 
1) "question:1"
2) "question:613"
3) "question:2"
$ zrevrange questions_by_votes_tagged:redis 0 5 
1) "question:2"
2) "question:613"
3) "question:1"

¿Qué hicimos por aquí? Agregamos preguntas a un conjunto ordenado y asociamos un puntaje (número de votos) a cada pregunta. Cada vez que se vota una pregunta, incrementaremos su puntaje. Y cuando un usuario hace clic en "Preguntas etiquetadas Redis, ordenadas por votos", simplemente hacemos una zrevrangey recuperamos las preguntas principales.

Preguntas en tiempo real sin actualizar la página

Y finalmente, una característica adicional. Si mantiene abierta la página de preguntas, SO le notificará cuando se agregue una nueva pregunta. ¿Cómo puede ayudar Redis aquí?

Redis tiene un modelo pub-sub. Puede crear canales, por ejemplo "channel_questions_tagged_redis". Luego, los subscribeusuarios a un canal en particular. Cuando se agrega una nueva pregunta, le enviaría publishun mensaje a ese canal. Todos los usuarios recibirían el mensaje. Tendrá que usar una tecnología web como tomas web o cometas para entregar el mensaje al navegador, pero Redis lo ayuda con toda la tubería en el lado del servidor.

Persistencia, fiabilidad, etc.

A diferencia de un caché, Redis conserva los datos en el disco duro. Puede tener una configuración maestro-esclavo para proporcionar una mayor confiabilidad. Para obtener más información, consulte los temas de Persistencia y Replicación aquí: http://redis.io/documentation

Sripathi Krishnan
fuente
15
También es un bus de servicio extremadamente simple que utiliza los comandos relacionados con PUB / SUB.
Jim Dennis el
3
¿Como puedo recuperar una pregunta por usuario? ¿Debo crear una lista para cada usuario con sus preguntas, como preguntas: usuario: 1 o debo usar etiquetas?
Diogo Alves
2
explicación muy útil y detallada que vi en SO
Trong Vu
5

No solo un caché.

  • En la memoria de almacenamiento de valores clave
  • Admite múltiples tipos de datos (cadenas, hashes, listas, conjuntos, conjuntos ordenados, mapas de bits e hiperloglogs)
  • Proporciona la capacidad de almacenar datos de caché en almacenamiento físico (si es necesario).
  • Soporte pub-sub modelo
  • Redis cache proporciona replicación para alta disponibilidad (maestro / esclavo)
Pankaj Rawat
fuente
4

Redis tiene habilidades únicas como sua-scripts ultrarrápidos. Su tiempo de ejecución es igual a la ejecución de los comandos C. Esto también brinda atomicidad para la sofisticada manipulación de datos de Redis requerida para el trabajo de muchos objetos avanzados como cerraduras y semáforos.

Hay un Redis basado en la cuadrícula de datos de memoria llamado Redisson que permite construir fácilmente aplicaciones distribuidas en Java . Gracias a distribuidos Lock, Semaphore, ReadWriteLock, CountDownLatch, ConcurrentMapobjetos y muchos otros.

Perfectamente trabaja en la nube y es compatible con AWS ElastiCache , AWS ElastiCache Cluster y Azure Redis Caché de apoyo

Nikita Koksharov
fuente
1

En realidad, no hay dependencia entre la representación de datos relativos (o cualquier tipo de representación de datos) y el rol de la base de datos (caché, persistencia permanente, etc.).

Redis es bueno para el caché, es cierto, pero es mucho más que solo un caché. Es una base de datos de alta velocidad totalmente en memoria. Sí persiste los datos en el disco. No es relacional, es almacenamiento de valor clave.

Lo usamos en producción. Redis nos ayuda a crear software que maneja miles de solicitudes por segundo y mantener los datos comerciales de los clientes durante todo el ciclo de vida natural.

Denys
fuente
0

Redis es una memoria caché que se adapta mejor al entorno distribuido / arquitectura de microservicios.

Es rápido, confiable, proporciona atomicidad y consistencia y tiene una variedad de tipos de datos como conjuntos, hashes, listas, etc.

Lo estoy usando desde el año pasado y realmente viene como un salvador cuando necesita proporcionar una solución lista para producción muy rápido y para cualquier problema relacionado con el rendimiento, ya que siempre puede usarlo para almacenar datos en caché.

Manvendra Jina
fuente
0

Además de ser un servidor de caché, Redis es específicamente un servidor de estructura de datos. Ser un caché en la forma de un servidor de estructura de datos significa mucho, porque las estructuras de datos son fundamentales de los programas o aplicaciones . Considere que está utilizando bases de datos SQL como tecnología de almacenamiento y necesita construir una lista, un mapa hash, un conjunto de clasificación o cosas por el estilo, es un dolor en el cuello. Redis puede proporcionarle estas funcionalidades directamente de una manera muy simple, lo que simplifica enormemente el desarrollo.

Por otro lado, un servidor de estructura de datos no tiene que estar en forma de caché. Hay proyectos compatibles con Redis pero tienen motores de almacenamiento persistentes.

不辞 长 做 岭南 人
fuente
0

Redis admite estructuras de datos como cadenas, hashes, listas, conjuntos, conjuntos ordenados con consultas de rango, mapas de bits, hiperloglogs, índices geoespaciales con consultas de radio y flujos. Redis tiene replicación integrada, secuencias de comandos Lua, desalojo de LRU, transacciones y diferentes niveles de persistencia en el disco, y proporciona alta disponibilidad a través de Redis Sentinel y particionamiento automático con Redis Cluster.

implementación con python

https://beyondexperiment.com/vijayravichandran06/redis-data-structure-with-python/

vijay
fuente