¿Cómo realizar la función de cerrar órdenes automáticamente?

Escenario empresarial
Tomemos la función de pedido como ejemplo para ilustrar: el pedido se cerrará automáticamente si no se paga durante un período de tiempo después de que se genera el pedido. La idea más simple es configurar el sondeo para las tareas cronometradas, pero el tiempo de creación de cada orden es diferente y las reglas para las tareas cronometradas no se pueden establecer. Si el intervalo de ejecución cronometrada de la tarea es demasiado corto, afectará demasiado la eficiencia . Otra idea es juzgar el tiempo para realizar operaciones relacionadas cuando el usuario ingresa a la interfaz de pedidos. Puede haber muchas formas, aquí hay una forma de monitorear el tiempo de vencimiento del par clave-valor de Redis para realizar el cierre automático de la orden

Ideas de implementación
Al generar un pedido, agregue un par clave-valor KV a Redis, donde K es el número de pedido, y asegúrese de que un pedido en la base de datos se pueda ubicar a través de K, y V puede ser cualquier valor. Supongamos que cuando se genera el pedido, K es el número de pedido y V es el par clave-valor del número de pedido, y el tiempo de vencimiento se establece en 30 minutos. Si el par clave-valor vence después de 30 minutos, una notificación puede enviarse al programa, o implementar un método, entonces se puede resolver el problema de cierre de la orden. Implementación: Se implementa monitoreando la cola de vencimiento proporcionada por Redis. Después de monitorear la cola de vencimiento, si un par clave-valor de KV en Redis vence, se enviará un mensaje al oyente y el oyente puede obtener la K del par clave-valor. Tenga en cuenta que V no se puede obtener porque ha expirado. Esta es la razón mencionada anteriormente, por la que es necesario asegurarse de que la orden se pueda ubicar a través de K, y V puede ser cualquier valor. Después de obtener K, ubique el pedido a través de K y determine su estado. Si no está pagado, actualícelo a cerrado o cancele el estado.

Habilitar el recordatorio de caducidad de la clave de Redis
Modificar la configuración de eventos relacionados con Redis. Busque el archivo de configuración de redis redis.conf, marque el elemento de configuración notificar-espacio-claves-eventos, si no, agregar notificar-espacio-claves-eventos Ex, si hay un valor, agregar Ex, los parámetros relacionados se describen a continuación:

K: evento de espacio de claves, el evento se emite con keyspace @ como prefijo
E: evento de keyevent, el evento se emite con el prefijo keyevent @
g: comandos generales, no específicos, como del, expire, rename, etc
.: cadena comandos específicos l: Enumerar comandos específicos s: Establecer comandos específicos h: Comandos específicos de hash z: Ordenar establecer comandos específicos x: Evento de expiración, este evento se generará cuando una clave expire y se borre e: Evento de desalojo, cuando un factor clave Cuando se elimina la política maxmemore, se genera el evento A: g: comando específico de la cadena l: comando específico de la lista s: comando específico establecido h: comando específico hash z: comando específico establecido ordenado x: evento de expiración, cuando una determinada clave Este evento Se generará cuando caduque y se elimine. e: Evento de desalojo. Cuando se elimina una clave debido a la estrategia maxmemore, el evento A: g: Carácter carácter cadena Laid especificada comando comando L : aparece en la Tabla nostálgiocos especificada comando comando S : conjunto de compromiso Laid especificada comando comando H : Ha griega Patente especifica comando comando Z : No secuencia conjunto compromiso Laid especificada comando comando X : por encima de las cosas miembro , cuando un solo botón sobre periodo y elimina excepto cuando la voluntad de producciónSalud la materia miembro de E : unidad por cosas miembro , cuando un número clave debido a m A X m E m O & lt R E política de estrategia y se suprime , además de la hora , la producción de crudo este asunto miembro A : G lshzxe alias, entonces "AKE" significa Seguir todos los eventos,
introducir dependencias
, agregar org.springframework.boot: dependencias spring-boot-starter-data-redis en pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
复制代码

Configuración relacionada
Definir y configurar RedisListenerConfig para monitorear el tiempo de vencimiento de la clave de Redis

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisListenerConfig {

    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        return container;
    }
}
复制代码

Defina el oyente RedisKeyExpirationListener, implemente la interfaz KeyExpirationEventMessageListener, verifique el código fuente y descubra que la interfaz escucha todos los eventos de db expired keyevent @ *: expired "

import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.stereotype.Component;

/**
 * 监听所有db的过期事件__keyevent@*__:expired"
 */
@Component
public class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {

    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
        super(listenerContainer);
    }

    /**
     * 针对 redis 数据失效事件,进行数据处理
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {

        // 获取到失效的 key,进行取消订单业务处理
        String expiredKey = message.toString();
        System.out.println(expiredKey);
    }
}

Referencia: "¡Los últimos conceptos básicos de Java de 2020 y tutoriales en video detallados y rutas de aprendizaje!

Enlace original: https://juejin.cn/post/6919095552835584008

Supongo que te gusta

Origin blog.csdn.net/weixin_46699878/article/details/112832641
Recomendado
Clasificación