Meituanインタビュアー:注文が生成された後、一定期間注文が支払われない場合、注文が自動的にクローズされる機能を実現するにはどうすればよいですか?細かいほど良い〜

ビジネスシーン

例として注文機能を見てみましょう。注文が生成されてから一定期間支払われない場合、注文は自動的に閉じられます。最も簡単な方法は、時限タスクのポーリングを設定することですが、各注文の作成時間は異なり、時限タスクのルールを設定できません。時限タスクの実行間隔を短く設定しすぎると、効率に大きな影響を与えます。別のアイデアは、ユーザーが注文インターフェースに入ったときに関連する操作を実行する時間を判断することです。多くの方法があります。これは、Redisのキーと値のペアの有効期限を監視して注文を自動的に閉じる方法です。Javaインタビューコレクションの完全なPDFをコンパイルします

実現アイデア

注文を生成するときは、KVキーと値のペアをRedisに追加します。ここで、Kは注文番号であり、データベース内の注文がKを介して特定され、Vが任意の値になるようにします。注文が生成されたときに、Kが注文番号、Vが注文番号のキーと値のペアであり、有効期限が30分に設定されているとします。キーと値のペアが30分後に期限切れになった場合は、プログラムに通知を送信するか、またはメソッドを実装すると、注文処理の問題を解決できます。実装:Redisが提供する有効期限キューを監視することで実装されます。有効期限キューを監視した後、RedisのKVキーと値のペアが期限切れになると、メッセージがリスナーに送信され、リスナーはキーと値のペアのKを取得できます。注、Vは有効期限が切れているため取得できません。これが上記の理由であり、Kを介して注文を特定できるようにする必要があり、Vは任意の値にすることができます。Kを取得したら、Kから注文を見つけてステータスを確認します。未払いの場合は、注文をクローズに更新するか、ステータスをキャンセルします。

Redisキーの有効期限のリマインダーを有効にする

redis関連のイベントの構成を変更します。redis構成ファイルredis.confを見つけ、notify-keyspace-events構成項目を確認します。そうでない場合は、notify-keyspace-events Exを追加します。値がある場合は、Exを追加します。関連するパラメーターは、次のとおりです。

  • K:キースペースイベント、イベントはkeyspace @をプレフィックスとして公開されます

  • E:keyeventイベント、イベントはkeyevent @をプレフィックスとして公開されます

  • g:del、expire、renameなどの一般的な非特定のコマンド。

  • $:文字列固有のコマンド

  • l:特定のコマンドを一覧表示します

  • s:特定のコマンドを設定する

  • h:ハッシュ固有のコマンド

  • z:注文されたセット固有のコマンド

  • x:有効期限イベント。キーの有効期限が切れて削除されたときに生成されます。

  • e:evictionイベント、maxmemore戦略のためにキーが削除されると、このイベントが生成されます

  • A:g $ lshzxeのエイリアスなので、「AKE」はすべてのイベントを意味します

依存関係を導入する

pom.xmlにorg.springframework.boot:spring-boot-starter-data-redis依存関係を追加します

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

関連する構成

Redisキーの有効期限を監視するようにRedisListenerConfigを定義および構成します

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

リスナーRedisKeyExpirationListenerを定義し、KeyExpirationEventMessageListenerインターフェイスを実装し、ソースコードを確認して、インターフェイスがすべてのdb有効期限イベントをリッスンしていることを確認しますkeyevent @ *:expired " JavaインタビューブックPDFのフルバージョンを完了しました

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

おすすめ

転載: blog.51cto.com/14975073/2596535