注文を自動的に閉じる機能を実現するにはどうすればよいですか?

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

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

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

K:キースペースイベント、イベントはキースペース@をプレフィックスとして発行されます
E :キーイベントイベント、イベントはキーイベント@プレフィックスを使用して発行されます
g:一般的な非特定コマンド(del、expire、renameなど)。:
文字列特定のコマンドl:特定のコマンドを一覧表示しますs:特定のコマンドを設定しますh:特定のコマンドをハッシュしますz:特定のコマンドを設定しますx:有効期限イベント、このイベントはキーの有効期限が切れて削除されたときに生成されますe:エビクションイベント、キーファクターの場合maxmemoreポリシーが削除され、イベントAが生成されます。g:文字列固有のコマンドl:リスト固有のコマンドs:セット固有のコマンドh:ハッシュ固有のコマンドz:順序付きセット固有のコマンドx:有効期限イベント、特定のキーの場合このイベントは有効期限が切れて削除されると生成されます。e:エビクションイベント。maxmemore戦略のためにキーが削除されると、イベントA:g文字文字指定されたコマンドのコマンドのL リストされた表にLaid-は、指定されたコマンドのコマンドS セット婚約指定されたコマンドのコマンドHをギリシャの特許は、指定されたコマンドのコマンドZをそこシーケンスセット婚約指定されたコマンドのコマンドX 以上もののメンバーとき1つのボタンを超える期間削除を除くとき意志の生産健康問題の部材E ドライブによって物事のメンバー数字キーによるM A X M Eは、mはO 、R&LT Eポリシー戦略をされ、削除に加えて、時間生産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インターフェイスを実装し、ソースコードを確認して、インターフェイスがすべてのデータベースの期限切れイベント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);
    }
}

参照:「2020年の最新のJavaの基本と詳細なビデオチュートリアルおよび学習ルート!

元のリンク:https://juejin.cn/post/6919095552835584008

おすすめ

転載: blog.csdn.net/weixin_46699878/article/details/112832641