Entrevistador de Meituan: ¿Cómo realizar la función de que el pedido se cerrará automáticamente si el pedido no se paga durante un período de tiempo después de que se genera el pedido? Cuanto más detallado, mejor ~

Escena 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 de los pares clave-valor de Redis para cerrar automáticamente el pedido. Compile un PDF completo de la colección de entrevistas de Java

Idea de realización

Al generar un pedido, agregue un par clave-valor KV a Redis, donde K es el número de pedido, para asegurarse 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, se puede enviar una notificación al programa o Implemente 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 KV en Redis vence, se enviará un mensaje al oyente y el oyente puede obtener el K del par clave-valor. Nota , V no se puede obtener porque ha caducado, por eso es necesario asegurar 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 teclas, el evento se publica con espacio de teclas @ como prefijo

  • E: evento keyevent, el evento se publica con keyevent @ como prefijo

  • g: comandos generales, no específicos, como del, expire, renombrar, etc.

  • $: comandos específicos de cadena

  • l: lista de comandos específicos

  • s: establecer comandos específicos

  • h: comandos específicos de hash

  • z: comandos específicos del conjunto ordenado

  • x: evento de caducidad, que se generará cuando una clave caduque y se elimine

  • e: evento de desalojo, cuando se elimina una clave debido a la estrategia de maxmemore, se genera este evento

  • R: alias de g $ lshzxe, entonces "AKE" significa todos los eventos

Introducir dependencias

Agregue la dependencia org.springframework.boot: 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 " Completó una versión completa del PDF del Libro de entrevistas de Java

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);
    }
}

Supongo que te gusta

Origin blog.51cto.com/14975073/2596535
Recomendado
Clasificación