Galería de mapas mentales Aprendizaje del marco de conocimiento de la estructura de datos de Redis
Debido a que hay muchos tipos de datos de Redis y diferentes tipos de datos tienen los mismos metadatos para registrar, Redis utilizará una estructura RedisObject para registrar estos metadatos de manera uniforme. Al guardar el tipo Long, el puntero de RedisObject se asigna directamente a un número entero.
Editado a las 2022-11-14 13:53:00,Este es un mapa mental sobre una breve historia del tiempo. "Una breve historia del tiempo" es una obra de divulgación científica con una influencia de gran alcance. No sólo presenta los conceptos básicos de cosmología y relatividad, sino que también analiza los agujeros negros y la expansión. del universo. temas científicos de vanguardia como la inflación y la teoría de cuerdas.
¿Cuáles son los métodos de fijación de precios para los subcontratos de proyectos bajo el modelo de contratación general EPC? EPC (Ingeniería, Adquisiciones, Construcción) significa que el contratista general es responsable de todo el proceso de diseño, adquisición, construcción e instalación del proyecto, y es responsable de los servicios de operación de prueba.
Los puntos de conocimiento que los ingenieros de Java deben dominar en cada etapa se presentan en detalle y el conocimiento es completo, espero que pueda ser útil para todos.
Este es un mapa mental sobre una breve historia del tiempo. "Una breve historia del tiempo" es una obra de divulgación científica con una influencia de gran alcance. No sólo presenta los conceptos básicos de cosmología y relatividad, sino que también analiza los agujeros negros y la expansión. del universo. temas científicos de vanguardia como la inflación y la teoría de cuerdas.
¿Cuáles son los métodos de fijación de precios para los subcontratos de proyectos bajo el modelo de contratación general EPC? EPC (Ingeniería, Adquisiciones, Construcción) significa que el contratista general es responsable de todo el proceso de diseño, adquisición, construcción e instalación del proyecto, y es responsable de los servicios de operación de prueba.
Los puntos de conocimiento que los ingenieros de Java deben dominar en cada etapa se presentan en detalle y el conocimiento es completo, espero que pueda ser útil para todos.
Aprendizaje del marco de conocimiento de la estructura de datos de Redis
Problema de coherencia de caché
Primero actualice la base de datos, luego elimine el caché
(1) El caché acaba de expirar (2) Solicite A que consulte la base de datos y obtenga un valor anterior (3) Solicite a B que escriba el nuevo valor en la base de datos (4) Solicite a B que elimine el caché (5) Solicite a A que escriba el valor antiguo encontrado en el caché
Lo anterior provocará datos sucios.
Pero solo si 3 entre 2 y 3 es más rápido que 2, B eliminará el caché primero y A escribirá el caché con el valor anterior.
De hecho, escribir en la base de datos es mucho más lento que leer, así que evite SQL lento.
Primero elimine el caché y luego escriba en la base de datos
(1) Primero elimine el caché (2) Escriba la base de datos nuevamente (estos dos pasos son los mismos que antes) (3) Duerma durante 1 segundo y elimine el caché nuevamente
Utilice doble eliminación asincrónica
Operaciones básicas
Operaciones comunes
Comprueba el número y la longitud.
Si existe, contiene, agrega, aumenta o disminuye la clave o un determinado campo debajo de la clave
Eliminar, eliminar la ubicación especificada, eliminar y obtener
tema libre
tipo de datos
Llave
Eliminar, existir, ver, hacer coincidir por patrón (las colecciones grandes tendrán problemas de rendimiento),
El escaneo itera todas las claves,
Ordenar lista, establecer
Migrar de una instancia de Redis a otra instancia de Redis
Establecer, cancelar el tiempo de vencimiento y obtener el tiempo de vencimiento restante de la clave
Cómo Redis elimina las claves caducadas Hay dos formas de caducar las claves de Redis: pasiva y activa. Cuando algunos clientes intenten acceder a ella, la clave será descubierta y caducada activamente. Por supuesto, esto no es suficiente, porque nunca se podrá acceder a algunas claves caducadas. Estas claves deberían caducar de todos modos, por lo que una prueba aleatoria cronometrada establece el tiempo de caducidad de las claves. Todas estas claves caducadas se eliminarán del espacio de claves. En concreto, esto es lo que hace Redis 10 veces por segundo: Pruebe 20 claves aleatorias para la detección de caducidad relacionada. Elimine todas las claves caducadas. Si caducan más del 25% de las claves, repita el paso 1. Este es un algoritmo probabilístico trivial. La suposición básica es que nuestra muestra es el control de claves y seguimos repitiendo la detección de caducidad hasta que el porcentaje de claves caducadas sea inferior al 25%, lo que significa que en cualquier momento dado, en un momento determinado. Se borrará la mayoría de 1/4 de las claves caducadas.
Colocar
Sdiff obtiene los elementos que no existen en el conjunto SDiff a b es equivalente a a-b
Sdiff Store almacena la diferencia establecida en una clave
Encuentra la unión de varios conjuntos, que se pueden almacenar en una clave.
SInter toma la intersección SInterStore escribe la intersección en una clave
Lista
Operación BLOQUEAR, bloqueando un valor del principio y del final de la cola
Puede especificar obtener valores de varias colas.
Cuando la cola está vacía, el cliente será bloqueado hasta que se escriba. Puede especificar un tiempo de espera y devolver cero después del tiempo de espera.
Las operaciones de bloqueo garantizan la equidad
Redis 2.4 y 2.6 son diferentes. Cuando se escriben varios valores al mismo tiempo, como a, b, c, el cliente cuya clave está bloqueada recibirá a en 2.4 y c en 2.6.
Después de eliminar el valor del servidor, si el cliente cuelga antes de que se procese el valor, el mecanismo de confirmación de mensajes de RabbitMQ puede resolver este problema.
Puede utilizar la operación de bloqueo de List combinada con operaciones atómicas de otros tipos de datos en la misma transacción para proporcionar un comportamiento de bloqueo al cliente.
¿Es posible lograr candados distribuidos equitativamente?
De manera similar a las operaciones proporcionadas por List en Java, LTrim se agrega para interceptar valores en un rango determinado.
Elimina el último elemento de la lista y colócalo en otra lista.
tema libre
recogida ordenada
Puede realizar operaciones de reducción en la unión de varios conjuntos ordenados, admitiendo SUM, MIN y MAX.
Devuelve la clasificación de una clave en un conjunto ordenado
Puede obtener un cierto rango de valores en un conjunto ordenado, también puede especificar las puntuaciones mínimas y máximas para consultar el conjunto en este rango en páginas.
Iterar sobre una colección
Transacción
mirar
El comando WATCH puede monitorear una o más claves. Una vez que una de las claves se modifica (o elimina), las transacciones posteriores no se ejecutarán. La supervisión continúa hasta el comando EXEC. Siempre que se modifique el valor antes de ejecutar exec, la transacción no se ejecutará. Esto es equivalente a la verificación de redis durante la ejecución.
Dado que la función del comando WATCH es solo evitar la ejecución de una transacción posterior cuando se modifica el valor de la clave monitoreada, no puede garantizar que otros clientes no modifiquen el valor de la clave. Por lo tanto, en general, debemos volver a ejecutar el valor de la clave. Ejecución EXEC después de que falla toda la función. Garantizado con un bucle
Después de ejecutar el comando EXEC, se cancelará el monitoreo de todas las claves. Si no desea ejecutar los comandos en la transacción, también puede usar el comando UNWATCH para cancelar el monitoreo. En algunos escenarios comerciales, después de observar, es posible que no necesariamente realicemos operaciones de transacción.
El comando Watch es una tecnología de bloqueo optimista mientras se modifique este valor clave, las modificaciones válidas posteriores no tendrán efecto. Este método generalmente se puede usar para reducir las condiciones de carrera. Cuando exec devuelve una colección vacía, la operación se considera fallida.
Exec realmente ejecuta todas las instrucciones de la transacción y borra el comando de vigilancia.
La respuesta del comando Exec es una matriz, consistente con el orden de ejecución del comando.
Incluso si uno o algunos comandos de la transacción no se ejecutan, otros comandos de la cola de transacciones seguirán ejecutándose; Redis no dejará de ejecutar los comandos de la transacción.
Antes de que la transacción ejecute EXEC, pueden ocurrir errores en los comandos en cola. Por ejemplo, el comando puede producir errores de sintaxis (número incorrecto de parámetros, nombres de parámetros incorrectos, etc. En este caso, el cliente dejará de ejecutar la transacción
Todos los comandos ejecutados desde el comienzo del comando Mutil hasta el comando exec se ingresarán en la cola de transacciones.
Picadillo
Si existe, agregar, eliminar, obtener todas las claves, valores, iterar la colección de hash
Incrementa el valor hash de una clave. Si la clave no existe, configúrala en 0 valor de incremento.
tema libre
Errores de la estructura de datos
Cuando es necesario ampliar el tamaño de la cadena, si es inferior a 1 M, se duplicará. Si es superior a 1 M, solo se ampliará en 1 M cada vez. La longitud máxima es 512 M.
Si el valor de autoincremento excede el valor máximo, se informará un error.
Para estructuras de datos de tipo contenedor, si el contenedor no existe, créelo; si el elemento ya no existe, elimine el contenedor.
Cerradura distribuida
Solución de nodo único (candado no rojo)
obtener bloqueo
hash a un nodo del clúster
Si no existe, configure la ruta de bloqueo. Configure el tiempo de vencimiento.
El bloqueo es el valor que establece la identificación del cliente
Configure un perro guardián y actualice el bloqueo periódicamente. Esto se puede implementar mediante una cola de retraso.
Si no se adquiere el bloqueo, considere bloquearlo y esperar a que se adquiera.
desbloquear
Si no se establece el tiempo de vencimiento, se producirá un problema de interbloqueo.
a) Una vez que se produce un cambio maestro-esclavo en redis, es posible que se pierdan algunos bloqueos.
Comparar con zk
El bloqueo distribuido implementado por Zookeeper en realidad tiene una desventaja, es decir, el rendimiento puede no ser tan alto como el del servicio de caché. Porque cada vez durante el proceso de creación y liberación de un bloqueo, los nodos transitorios deben crearse y destruirse dinámicamente para implementar la función de bloqueo. La creación y eliminación de nodos en ZK solo se puede realizar a través del servidor Leader y luego los datos no se comparten con todas las máquinas Follower. Los problemas de concurrencia pueden incluir fluctuaciones en la red y la conexión de la sesión entre el cliente y el clúster ZK está interrumpida. El clúster ZK cree que el cliente está inactivo y eliminará el nodo temporal. En este momento, otros clientes pueden obtener el bloqueo distribuido.
Redis es difícil de lograr la equidad
candado rojo
En la versión distribuida del algoritmo, asumimos que tenemos N hosts Redis. Los nodos son completamente independientes, por lo que no utilizamos replicación ni ningún otro sistema de coordinación implícito. Hemos descrito cómo adquirir y liberar bloqueos de forma segura en una sola instancia. Damos por sentado que el algoritmo utilizará este método para adquirir y liberar bloqueos en una sola instancia. En nuestro ejemplo, configuramos N = 5, que es un valor razonable, por lo que necesitamos ejecutar 5 servidores maestros Redis en diferentes computadoras o máquinas virtuales para asegurarnos de que fallen de manera mayoritariamente independiente. Para adquirir el candado, el cliente realiza las siguientes operaciones: 1. Obtiene la hora actual en milisegundos. 2. Intenta adquirir el bloqueo en todas las N instancias en orden, utilizando el mismo nombre de clave y valor aleatorio en todas las instancias. Durante el paso 2, cuando se establece el bloqueo en cada instancia, el cliente utiliza un pequeño tiempo de espera en comparación con el tiempo total de liberación automática del bloqueo para adquirirlo. Por ejemplo, si el tiempo de liberación automática es de 10 segundos, el tiempo de espera puede estar en el rango de ~5-50 ms. Esto evita que los clientes permanezcan bloqueados durante largos períodos de tiempo, intentando y sin éxito comunicarse con un nodo de Redis: si una instancia no está disponible, debemos intentar hablar con la siguiente instancia lo más rápido posible. 3. El cliente calcula el tiempo necesario para adquirir el bloqueo restando la marca de tiempo obtenida en el paso 1 de la hora actual. Un candado se considera adquirido si y sólo si el cliente puede adquirir el candado en la mayoría de los casos (al menos 3) y el tiempo total transcurrido para adquirir el candado es menor que el tiempo de validez del candado. 4. Si se adquiere un candado, se considera que su tiempo de validez es el tiempo de validez inicial menos el tiempo transcurrido, según se calcula en el paso 3. 5. Si el cliente no logra adquirir el bloqueo por algún motivo (no puede bloquear N/2 1 instancias o tiempo de validez negativo), intentará desbloquear todas las instancias (incluso si cree que no puede bloquear).
Cuando se cuelga un nodo, no hay riesgo de que se anule el bloqueo.
cache
Inválido
Establezca un valor aleatorio para el tiempo de falla para evitar fallas colectivas
Implementación de estructura de datos
Escenarios de aplicación
zset
Registre la lista de identificación de publicaciones de usuarios.
Registre la lista de ID de publicaciones de la lista activa Lista activa general, lista activa de categorías.
Se utiliza para grabar uno a muchos y la fiesta con muchos no se puede repetir estrictamente.
Registre una determinada colección, que puede estar relacionada con el usuario o con el sistema en general.
picadillo
Registre la cantidad de me gusta, comentarios y clics en una publicación.
Registre el título de la publicación, el resumen, el autor, la información de la portada, etc.
Almacenar en caché el contenido de las publicaciones recientes (el contenido de la publicación es muy grande y no es adecuado para recuperarlo desde la base de datos).
lista
Registre la lista de artículos relacionados de la publicación. Recomiende publicaciones relacionadas según el contenido.
mapa de bits
Se utiliza como matriz bool o matriz de bits personalizada, principalmente para ahorrar memoria
HyperLogLog
Se utiliza para calcular aproximadamente valores estadísticos después de la deduplicación.
Por ejemplo, el sitio web UV necesita filtrar las visitas repetidas.
Solo puede sumar y obtener el número total, pero no puede obtener si existe un determinado valor o todos los elementos.
filtro de floración
Se utiliza para eliminar duplicados. Obtener si un elemento existe en la lista.
Si existe, no necesariamente existe realmente. Si no existe, definitivamente no existe.
Considere recomendar recursos no visitados a los usuarios
Considere no reutilizar los recursos varias veces.
Se debe tolerar una cierta tasa de fallas, es decir, no se puede acceder al recurso, pero se considera que se ha accedido a él.
Utilice múltiples algoritmos Hash y establezca los bits de la asignación de claves en 1.
¡Si no existe, definitivamente no existe!
Solo hay comandos para agregar y existir (se pueden verificar varios)
Puede utilizar parámetros iniciales para configurar el filtro. error_rate es la tasa de error. Cuanto menor sea el valor, mayor será la capacidad. tamaño_inicial es el monto total estimado. El monto total debe establecerse de acuerdo con el escenario real.
Redis-celda
Si el proyecto no es grande y el costo de mantenimiento no es alto, puede usar redsi-cell directamente. De lo contrario, puede considerar un control detallado de cada nodo de servicio para limitar el flujo e implementarlo con la estrategia de equilibrio de carga correspondiente.
Utilice zset y puntuación para rodear la ventana de tiempo y contar la cantidad de veces que ocurre el mismo comportamiento para el mismo usuario dentro de la ventana de tiempo. Si la cantidad de límites actuales es demasiado grande, es posible que no sea aplicable, como 1000 veces por segundo. .
Prueba CL.THROTTLE 100 400 60 3
Pruebe la capacidad de la clave 100 (concurrencia máxima) hasta 400 veces en 60 segundos. Esta vez, se solicitan 3 capacidades.
1: Si fue exitoso, 0: Éxito, 1: Rechazado 2: La capacidad del depósito de tokens, el tamaño es el valor inicial 1 3: Tokens disponibles en el depósito de tokens actual 4: Si se rechaza la solicitud, este valor indica cuánto tiempo pasará antes de que el token se vuelva a agregar al depósito de embudo. Unidad: segundos, que se puede usar como tiempo de reintento. 5: Indica cuánto tiempo tardarán en llenarse los tokens del depósito de tokens.
algoritmo de embudo
estructura de datos especial
Lista enlazada comprimida
Se compone de listas o matrices enlazadas comprimidas, para evitar la sobrecarga de memoria adicional de las listas enlazadas ordinarias.
Una lista doblemente enlazada diseñada para ahorrar la mayor cantidad de memoria posible
Almacenar cadena o número entero
Guarde la memoria en detalle mediante codificación de longitud variable para el almacenamiento de valores.
Cada elemento tendrá una cantidad separada de dígitos para marcar la longitud de los datos y el tipo del elemento.
Implementación de estructuras de datos subyacentes de hash, list y zset
Características
1) La representación interna es una matriz de memoria continua en la que los datos están organizados de forma compacta.
2) Puede simular una estructura de lista doblemente enlazada e ingresar y quitar la cola con una complejidad de tiempo O (1).
3) La nueva operación de eliminación implica reasignación o liberación de memoria, lo que aumenta la complejidad de la operación.
4) Las operaciones de lectura y escritura implican movimientos de puntero complejos y la complejidad temporal en el peor de los casos es O (n2).
5) Adecuado para almacenar objetos pequeños y datos de longitud limitada.
1) Cuando se utiliza ziplist para escenarios con requisitos de alto rendimiento, se recomienda que la longitud no supere los 1000 y que el tamaño de cada elemento se controle dentro de los 512 bytes.
mesa de salto
La lista de omisión admite la búsqueda promedio O(logN) y la búsqueda de complejidad O(N) en el peor de los casos.
¿Por qué no utilizar árboles o árboles equilibrados en lugar de mesas de salto?
La implementación de la tabla de salto es muy simple y puede alcanzar el nivel O (logN).
lista enlazada rápida
La lista vinculada comprimida se vincula mediante punteros para convertirse en una lista vinculada
El valor predeterminado de cada ziplist es 8k (configurable).
Operación y mantenimiento
monitor
2) Utilice el comando info Commandstats para obtener el tiempo promedio de comando, incluido el número de llamadas para cada comando. , el tiempo total empleado, el tiempo medio empleado, en microsegundos.
Maestro-esclavo
La función de replicación de Redis se divide en dos operaciones: sincronización (sync) y propagación de comandos (propagación de comandos):
Las operaciones de sincronización se utilizan para recuperar el estado de la base de datos del servidor. Actualizar al estado actual de la base de datos del servidor principal;
La operación de propagación de comandos se utiliza para modificar el estado de la base de datos en el servidor principal. Cuando el estado de la base de datos del servidor maestro-esclavo es inconsistente, deje que el servidor maestro-esclavo La base de datos del servidor vuelve a un estado consistente.
Separación de lectura y escritura.
La separación de lectura y escritura es adecuada para un acceso grande (tan grande que una sola máquina Redis se siente muy lenta), y la operación de escritura es mucho más pequeña que la operación de lectura.
Si la cantidad de solicitudes de lectura excede con creces las solicitudes de escritura, el costo de la copia de datos del clúster será mucho menor que el costo de la solicitud de lectura. Al mismo tiempo, si podemos aceptar la inconsistencia de los datos hasta cierto punto, podemos separar la lectura y la escritura.
grupo de redis
característica
1. Todos los nodos de Redis están interconectados entre sí (mecanismo PING-PONG) y se utiliza internamente un protocolo binario para optimizar la velocidad de transmisión y el ancho de banda.
2. La falla de un nodo surte efecto solo cuando más de la mitad de los nodos del clúster detectan fallas.
3. El cliente está conectado directamente al nodo redis, sin necesidad de una capa de proxy intermedia. El cliente no necesita conectarse a todos los nodos del clúster, simplemente se conecta a cualquier nodo disponible en el clúster.
4. redis-cluster asigna todos los nodos físicos a la ranura [0-16383] (no necesariamente distribuida uniformemente), y el clúster es responsable de mantener el valor del nodo <-> ranura <->.
Cada nodo de Redis necesita ejecutar un comando y declarar la ranura de la que es responsable.
el clúster agrega ranuras {slot_index1} {slot_index 2} {slot_index 3}
5. El clúster de Redis está predividido en 16384 depósitos. Cuando es necesario colocar un valor-clave en el clúster de Redis, se decide de acuerdo con el valor de CRC16(key) mod 16384 en qué depósito se debe colocar una clave.
Cada instancia de Redis es consciente de la existencia de otros nodos.
No se puede garantizar una consistencia fuerte
1. Su cliente escribe en el nodo B del servidor principal. 2. El nodo B del servidor principal responde a su cliente para confirmar. 3. El nodo del servidor maestro B propaga la escritura a sus servidores esclavos B1, B2 y B3.
Si después del paso 2, no se envían datos desde el servidor esclavo y B cuelga, la clave se perderá (la clave definitivamente se perderá durante la falla)
Tolerancia a fallos
El proceso de elección implica la participación de todos los nodos maestros del clúster. Si más de la mitad de los nodos maestros se comunican con el nodo fallido durante más de (tiempo de espera del nodo del clúster), el nodo se considera defectuoso y la operación de conmutación por error se realiza automáticamente. motivado.
(2): ¿Cuándo deja de estar disponible todo el clúster (cluster_state:fail)? a: Si algún maestro en el clúster muere y el maestro actual no tiene esclavo, el clúster ingresa al estado de falla, lo que también puede entenderse como ingresar al estado de falla cuando la asignación de ranuras del clúster [0-16383] no se completa. b: Si más de la mitad de los maestros en el clúster mueren, no importa si hay un clúster esclavo que ingresa al estado de falla.
Cuando el clúster no está disponible, todas las operaciones en el clúster no están disponibles y se recibe un error ((error) CLUSTERDOWN El clúster está inactivo).
conmutación por error
1. Todos los nodos esclavos del nodo maestro fuera de línea serán elegidos para elegir un nuevo nodo maestro. 2. El nodo esclavo seleccionado ejecutará el comando esclavo nadie y se convertirá en el nuevo nodo maestro. 3. El nuevo nodo maestro revocará todas las asignaciones de espacios al nodo maestro fuera de línea y se asignará estos espacios a sí mismo. 4. El nuevo nodo maestro transmite un mensaje pong al clúster. Este mensaje pong permite que otros nodos del clúster sepan inmediatamente que el nodo ha cambiado de nodo esclavo a nodo maestro y que el nodo maestro se ha hecho cargo del servidor. que originalmente estaba fuera de línea. La ranura que maneja el nodo. 5. El nuevo nodo maestro comienza a aceptar solicitudes de comando relacionadas con la ranura que es responsable de procesar y se completa la operación de conmutación por error.
elección amo-esclavo
1. Cuando el nodo esclavo descubre que el nodo maestro que replica se ha desconectado, el nodo esclavo (puede haber varios nodos esclavos realizando solicitudes aquí) transmitirá un mensaje cluster_type_failover_auth_request al clúster, requiriendo derechos de voto (responsable de procesar los espacios). El nodo maestro vota a este nodo. 2. El nodo maestro que recibe el mensaje cluster_type_failover_auth_request juzgará si está de acuerdo con el nodo esclavo para convertirse en el nuevo nodo maestro en función de sus propias condiciones (la época actual del nodo de votación que inicia no es inferior a la época actual del nodo de votación). ). Si está de acuerdo, devolverá un mensaje cluster_type_failover_auth_ack. 3. Cuando se recibe el mensaje cluster_type_failover_auth_ack del nodo, el número de votos aumentará en 1. 4. Si los votos de un nodo esclavo son mayores o iguales a la mitad de los nodos maestros en el clúster (mayores o iguales a N/2 1), este nodo se convertirá en el nuevo nodo maestro. Si ningún nodo esclavo recibe suficientes votos durante un ciclo de configuración, el clúster ingresará a un nuevo ciclo de configuración y se llevarán a cabo elecciones aquí hasta que se elija un nuevo nodo maestro.
Todos los nodos esclavos pueden buscar opiniones sobre si pueden convertirse en maestros (aquellos que voten solo votarán por sus propios nodos más grandes), y más de la mitad de ellos pueden ser (n 1)/2
Tal vez no puedo elegir
limitaciones
1. Actualmente, solo se admiten operaciones por lotes de claves en la misma ranura; 2. Actualmente, solo se admiten transacciones clave en la misma ranura; 3. Solo se puede utilizar la base de datos 0 (cada instancia de Redis tiene 16 bases de datos, que se pueden cambiar mediante el comando select {index}); 4. Una clave grande (como hash, lista) no se puede asignar a diferentes nodos; 5. Actualmente, la replicación maestro-esclavo del clúster solo admite un nivel y no admite estructuras de árbol anidadas;
Al expandirse
paso
1. Enviar al nodo de destino cluster setslot {slot_index} importando {source_node_id} 2. Enviar al nodo fuente cluster setslot {slot_index} migrando {target_node_id} 3. Ejecución del bucle del nodo fuente cluster getkeysinslot {slot_index} {count(número de claves)} 4. El nodo de origen ejecuta y migra la clave al nodo de destino a través de la canalización. migrar {target_ip} {target_port} "" 0 {timeout} claves {key1} {key2} {key3} 5. Repita los pasos 3 y 4. 6. Enviar notificaciones a todos los nodos maestros del clúster. clúster establece ranura {slot_index} nodo {target_nodeid}
Cada nodo conoce el nodo del clúster correspondiente a cada ranura.
Cuando el nodo recibe la solicitud de comando, pregunta si puede manejarla por sí mismo. Si es así, la maneja. De lo contrario, devuelve un error de movimiento. El error de movimiento lleva la IP del nodo y el número de puerto correctos. cliente para guiarlo para su ejecución. Y cada operación posterior del cliente. Una vez que se ejecuta la clave, irá al nodo proporcionado por el error movido.
Codis
Capa de acceso: el método de acceso puede ser VIP o llamar a jodis a través del código java, y luego conectarse y llamar a diferentes direcciones codis-proxy para lograr funciones LVS y HA de alta disponibilidad.
Capa de proxy: luego, la capa intermedia usa codis-proxy y zookeeper para procesar la dirección y distribución de los datos. A través del algoritmo crc32, las claves se distribuyen uniformemente en una determinada ranura de diferentes redis para lograr una división similar a raid0, en la versión anterior. En codis, las ranuras deben asignarse manualmente. Después de codis3.2, las ranuras se asignarán automáticamente, lo cual es bastante conveniente.
Capa de datos: finalmente, codis-proxy almacena los datos en el servidor principal real del servidor redis. Dado que el autor de codis, Huang Dongxu, concede gran importancia a la coherencia de los datos y no permite inconsistencias de datos causadas por retrasos en los datos, la arquitectura no lo era. Considerando desde el principio, la lectura y escritura maestro-esclavo están separadas. El servidor esclavo solo se usa como una arquitectura redundante para la conmutación por error, y el cuidador del zoológico llama a redis-sentinel para implementar la función de conmutación por error.
En Codis, Codis dividirá todas las claves en 1024 ranuras. Estas 1024 ranuras corresponden al clúster de Redis. En Codis, la relación de mapeo entre estas 1024 ranuras y la instancia de Redis se mantendrá en la memoria. Esta ranura es configurable y se puede configurar en 2048 o 4096. Depende de cuántos nodos tenga su Redis. Si son demasiados, puede configurar más ranuras.
Cuando el Codis Dashbord de Codis cambia la información de las ranuras, otros nodos de Codis monitorearán los cambios de las ranuras de ZooKeeper y los sincronizarán a tiempo. Como se muestra en la imagen:
zk es responsable de sincronizar la información de las ranuras.
cola de prioridad
conjunto ordenado
lista
Utilice varias colas para implementar colas prioritarias. Diferentes tareas prioritarias ingresan a diferentes colas.
Al mismo tiempo, cuando los consumidores obtienen datos de la cola, admiten la recuperación de datos de varias colas, con orden de prioridad.
obstruido
Iniciar varios consumidores significa iniciar varios clientes para recuperar datos.
cola de mensajes
pubsub
usar
Los suscriptores pueden suscribirse a uno o varios temas de suscripción coincidentes.
El editor publica un tema determinado y valor.
Los temas publicados se reenviarán inmediatamente a los consumidores que se suscriban al tema. Si no hay consumidores, el mensaje se descartará.
riesgo
Habrá riesgo de pérdida de mensajes (cuando la máquina no funciona, la red se desconecta o la red se interrumpe y los mensajes se pierden)
Debido a esta característica, un pubsub simple corre el riesgo de perder respuestas.
No se puede garantizar la confiabilidad de los datos
No hay garantía de que al menos una vez
La expansión no es flexible y no hay manera de acelerar el consumo sumando más consumidores.
Puede utilizar varios canales y escucharlos varias veces.
lista
lista
1. Cuando no hay ningún elemento en la lista dada para extraer, el comando BRPOP bloqueará la conexión hasta que se agote el tiempo de espera o se encuentre un elemento emergente. 2. Cuando se proporcionan varios parámetros clave, cada lista se verifica en secuencia de acuerdo con la clave del parámetro y aparece el elemento final de la primera lista que no está vacía. Además, BRPOP se comporta igual que BLPOP excepto por la posición del elemento emergente.
Si no hay tareas en la lista, la conexión se bloqueará Hay un tiempo de espera para el bloqueo de la conexión. Cuando el tiempo de espera se establece en 0, puede esperar de forma inalámbrica hasta que aparezca un mensaje.
Con pubsub, también puedes notificar a los consumidores que pueden consumir de la lista.
Es adecuado para suscripción y publicación entre dos empresas entre A y B. Es más difícil cuando varias líneas comerciales significan diferentes consumidores.
implementación de confirmación
Mantenga dos colas: cola pendiente y tabla de tareas (tabla hash).
Los trabajadores se definen como ThreadPool. Después de ser puestos en cola por la cola pendiente, los trabajadores asignan un hilo (trabajador único) para procesar el mensaje: agregan una marca de tiempo actual y el nombre del hilo actual al mensaje de destino, lo escriben en la tabla de tareas y luego el trabajador consume el mensaje. finalización Borre la información de la tabla de tareas usted mismo.
Habilite una tarea programada, escanee la cola en ejecución a intervalos regulares y verifique la marca de tiempo de cada elemento. Si se agota el tiempo de espera, el ThreadPoolExecutor del trabajador verificará si el hilo existe. Si existe, la ejecución de la tarea actual se cancelará y la transacción. será revertido. Finalmente, saque la tarea de la cola de tareas en ejecución y vuelva a colocarla en la cola de pendientes.
Puedes usar zset para ordenar.
Evite el uso excesivo de Redis. Utilice Redis únicamente para hacer las cosas en las que es mejor y haga las cosas en las que no es bueno. Cuanto más haga, más descubrirá. Cuantos más obstáculos haya, más difícil será darse por vencido al final. Un diseño incorrecto en la etapa inicial conduce a una alta tasa de fallas en la etapa posterior, a una mala estabilidad y a altos costos de transformación, etc. Rabbitmq no es muy complicado. La operación y el mantenimiento también son muy simples y se pueden combinar con el sistema empresarial.