ホームページ データベース Redis Redis は期限切れのキーをどのように監視しますか?

Redis は期限切れのキーをどのように監視しますか?

Jun 06, 2019 pm 03:15 PM

Redis は期限切れのキーをどのように監視しますか?

最初に質問を見てみましょう:

注文が 30 ドル支払われない場合に注文ステータスを自動的に変更するなど、期限切れによる注文の自動キャンセルを処理する方法分?

解決策:

Redis のナチュラル キーの自動有効期限メカニズムを使用できます。注文するときに、注文 ID を Redis に書き込みます。有効期限は 30 分です。 30 分後の注文ステータス。支払いが行われていない場合は処理されますが、キーの有効期限が切れています。redis から通知はありますか?答えは「はい」です。

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

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

K:keyspace事件,事件以__keyspace@<db>__为前缀进行发布;         
E:keyevent事件,事件以__keyevent@<db>__为前缀进行发布;         
g:一般性的,非特定类型的命令,比如del,expire,rename等;        
$:字符串特定命令;         
l:列表特定命令;         
s:集合特定命令;         
h:哈希特定命令;         
z:有序集合特定命令;         
x:过期事件,当某个键过期并删除时会产生该事件;         
e:驱逐事件,当某个键因maxmemore策略而被删除时,产生该事件;         
A:g$lshzxe的别名,因此”AKE”意味着所有事件。
ログイン後にコピー

redis テスト:

redis-cli を開き、db0のキー有効期限イベントを監視します

127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
ログイン後にコピー

別の redis-cli を開き、スケジュールされた有効期限キーを送信します

127.0.0.1:6379> setex test_key 3 test_value
ログイン後にコピー

前の redis-cli を観察すると、期限切れの keytest_key を受信して​​いることがわかりますが、期限切れの値 test_value

127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__keyevent@0__:expired"
3) (integer) 1
1) "pmessage"
2) "__keyevent@0__:expired"
3) "__keyevent@0__:expired"
4) "test_key"
ログイン後にコピー

Use in springboot

依存関係を pom に追加します

<!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
ログイン後にコピー

構成 RedisListenerConfig

import edu.zut.ding.listener.RedisExpiredListener;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.PatternTopic;import org.springframework.data.redis.listener.RedisMessageListenerContainer;/**
 * @Author lsm
 * @Date 2018/10/27 20:56
 */@Configurationpublic class RedisListenerConfig {    @Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);//        container.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired"));
        return container;
    }
}
ログイン後にコピー

定義しますリスナーを定義し、KeyExpirationEventMessageListener インターフェイスを実装します。ソース コードを確認して、このインターフェイスが存在することを確認します。すべての DB 有効期限イベントを監視します keyevent@*:expired"

import edu.zut.ding.constants.SystemConstant;import edu.zut.ding.enums.OrderState;import edu.zut.ding.service.OrderService;import org.springframework.beans.factory.annotation.Autowired;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"
 * @author lsm
 */@Componentpublic class RedisKeyExpirationListener extends KeyExpirationEventMessageListener {    public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {        super(listenerContainer);
    }    /**
     * 针对redis数据失效事件,进行数据处理
     * @param message
     * @param pattern
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {        // 用户做自己的业务处理即可,注意message.toString()可以获取失效的key
        String expiredKey = message.toString();        if(expiredKey.startsWith("Order:")){            //如果是Order:开头的key,进行处理
        }
    }
}
ログイン後にコピー

または、RedisListenerConfig のcontainer.addMessageListener(new RedisExpiredListener(), new PatternTopic("__keyevent@0__:expired")); コメントを開き、リスナーを作成し、db0 有効期限イベントである __keyevent@0__:expired イベントを監視します。この場所の定義は比較的柔軟で、監視するイベントを定義できます。

以上がRedis は期限切れのキーをどのように監視しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Redisでキャッシュ無効化戦略を実装するにはどうすればよいですか? Redisでキャッシュ無効化戦略を実装するにはどうすればよいですか? Mar 17, 2025 pm 06:46 PM

Redisでキャッシュ無効化戦略を実装するにはどうすればよいですか?

Redisバージョンを表示するためのショートカットはありますか? Redisバージョンを表示するためのショートカットはありますか? Mar 04, 2025 pm 05:59 PM

Redisバージョンを表示するためのショートカットはありますか?

コマンドライン経由でRedisからバージョンを表示する方法 コマンドライン経由でRedisからバージョンを表示する方法 Mar 04, 2025 pm 06:00 PM

コマンドライン経由でRedisからバージョンを表示する方法

Redisのさまざまなバージョンの互換性はどのようにありますか Redisのさまざまなバージョンの互換性はどのようにありますか Mar 04, 2025 pm 05:57 PM

Redisのさまざまなバージョンの互換性はどのようにありますか

Redisクラスターでシャードキーを選択するにはどうすればよいですか? Redisクラスターでシャードキーを選択するにはどうすればよいですか? Mar 17, 2025 pm 06:55 PM

Redisクラスターでシャードキーを選択するにはどうすればよいですか?

ジョブキューとバックグラウンド処理にRedisを使用するにはどうすればよいですか? ジョブキューとバックグラウンド処理にRedisを使用するにはどうすればよいですか? Mar 17, 2025 pm 06:51 PM

ジョブキューとバックグラウンド処理にRedisを使用するにはどうすればよいですか?

Redisクラスターのパフォーマンスを監視するにはどうすればよいですか? Redisクラスターのパフォーマンスを監視するにはどうすればよいですか? Mar 17, 2025 pm 06:56 PM

Redisクラスターのパフォーマンスを監視するにはどうすればよいですか?

Redisバージョン番号は何ですか Redisバージョン番号は何ですか Mar 04, 2025 pm 06:01 PM

Redisバージョン番号は何ですか

See all articles