Implementar cola de retraso basada en Redisson
Supongamos que tenemos un pedido u orden de trabajo, etc. Debe apagarse después de un tiempo de espera de 30 minutos. Lo primero que me viene a la mente en este momento es usar tareas programadas para juzgar por turnos, pero en este momento el tiempo de creación de cada orden no es el mismo. Cómo juzgar este tiempo es de 5 minutos. 1 minuto. Ejecutar una vez. Esto puede afectar significativamente el rendimiento. Y el error de tiempo es muy grande. Con base en las necesidades comerciales anteriores, hemos propuesto las siguientes soluciones.
Primero analizamos la cola de retraso de JDK
Basándonos en la cola de retraso, implementamos la interfaz Delayed e implementamos el método getDelay y el método compareTo.
La entidad del pedido, en orden. Varios campos se definen en base a él para simplificar.
Para simplificar, definamos el tiempo de retardo como 10 s.
Salida
2022-07-01T15:00
Hora actual: 2022-07-01T15:10:37.375
Por supuesto, el protagonista de hoy es él, y nos centramos principalmente en la cola de retraso basada en Redisson.
De hecho, la cola de retraso interna de Redisson también se implementa en base a redis. Primero integrémosla y usémosla para ver el efecto. Basado en springboot
1. Dependencias:
2. Cree redisson.yml
3. Cree la clase de configuración RedissonConfig, aquí está la configuración que acabamos de leer. creó yml en el archivo
4. Pruebe
Salida de la consola:
Hora de generación del pedido 2022-07-01T15:22:10.304
Hora de cierre del pedido 2022-07-01T15:22:20.414
Comencemos entendiendo estas dos API
Entonces, ¿por qué hay dos colas involucradas y para qué se utilizan? ?
En primer lugar, lo que realmente operamos es la cola de bloqueo RBlockingQueue, no la cola RDelayedQueue. El acoplamiento de RDelayedQueue es principalmente para proporcionar un reenvío intermedio de la cola, similar al significado de un intermediario.
Dibuja una pequeña imagen Entiende
No es difícil ver aquí que estamos consumiendo en función de la cola de destino RBlockingQueue, y RDelayedQueue coloca mensajes caducados en nuestra cola de destino
Solo Necesita obtenerlos de la cola RBlockingQueue Solo datos.
Como si esto no fuera lo suficientemente profundo, sigamos adelante.
Sabemos que Redisson se basa en redis, así que veamos qué sucede dentro
Abra el cliente redis, ejecute el comando de monitoreo y vea qué comandos ejecutó redis durante la operación del comando anterior
El comando monitor muestra qué comandos se ejecutan durante la operación de redis
El comando monitor muestra qué comandos se ejecutan durante la operación de redis
¿Qué comandos se ejecutan durante la operación de redis
? p>La siguiente es una referencia: /p/343811173
Sabemos que Zset está ordenado en orden ascendente de puntajes, lo que significa que el que tiene el puntaje más pequeño está al frente. Con esta característica, podemos entender aproximadamente que si coloca las puntuaciones en Zset utilizando la marca de tiempo del tiempo de vencimiento, entonces las puntuaciones que están a punto de expirar estarán al frente.
Mostrar directamente en el gráfico