SpringBootはRedis key失効イベントのリスニングを実現
12527 ワード
1.需要
注文の処理期限が切れて自動的にキャンセルされます.たとえば、注文の30分が支払われていない場合、自動的に注文のステータスが変更されます.
2.シナリオ
Redis天然のkey自動期限切れメカニズムを利用して、注文時に注文idをredisに書き込んで、期限切れ時間は30分、30分後に注文状態をチェックして、もし支払っていないならば、処理しますがkeyが期限切れたredisは通知がありますか?答えは肯定的だ.
3.試験手順
3.1.redis key有効期限切れアラート
redis関連イベント構成を変更します.redisプロファイルredisを見つけます.confは、「notify-keyspace-events」の構成項目を表示し、ない場合は「notify-keyspace-events Ex」を追加し、値がある場合はExを追加し、関連パラメータの説明は以下の通りです.
3.2.redisテスト
redis-cliを開き、db 0のkey期限切れイベントを監視します.
別のredis-cliを開き、送信タイミングが期限切れkey
前のredis-cliを観察すると、期限切れの
4.springbootでの使用
4.1.Listenerの定義
リスナーを定義し、
4.2.RedisListenerコンフィギュレーションの定義
4.3.キーを追加し、有効期限を設定
4.4.クエリーキーの有効期限
注文の処理期限が切れて自動的にキャンセルされます.たとえば、注文の30分が支払われていない場合、自動的に注文のステータスが変更されます.
2.シナリオ
Redis天然のkey自動期限切れメカニズムを利用して、注文時に注文idをredisに書き込んで、期限切れ時間は30分、30分後に注文状態をチェックして、もし支払っていないならば、処理しますがkeyが期限切れたredisは通知がありますか?答えは肯定的だ.
3.試験手順
3.1.redis key有効期限切れアラート
redis関連イベント構成を変更します.redisプロファイルredisを見つけます.confは、「notify-keyspace-events」の構成項目を表示し、ない場合は「notify-keyspace-events Ex」を追加し、値がある場合はExを追加し、関連パラメータの説明は以下の通りです.
E:keyevent , __keyevent@<db>__ ;
x: , ;
3.2.redisテスト
redis-cliを開き、db 0のkey期限切れイベントを監視します.
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を開き、送信タイミングが期限切れkey
127.0.0.1:6379> setex test_key 3 test_value
前のredis-cliを観察すると、期限切れの
keytest_key
が受信されていますが、期限切れのvalue 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"
4.springbootでの使用
4.1.Listenerの定義
リスナーを定義し、
__keyevent@0__:expired
イベント、すなわちdb0
の期限切れイベントをモニタします.package com.easygo.listener;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
/**
* @BelongsProject: easygo
* @Description: Redis , redis
*/
public class RedisMessageListener implements MessageListener {
/**
* message:
* @param message
* @param pattern
*/
@Override
public void onMessage(Message message, byte[] pattern) {
byte[] body = message.getBody();// : valueSerializer
byte[] channel = message.getChannel();
System.out.print("onMessage >> " );
System.out.println(String.format("channel: %s, body: %s, bytes: %s"
,new String(channel), new String(body), new String(pattern)));
}
}
4.2.RedisListenerコンフィギュレーションの定義
/**
* @BelongsProject: easygo
* @BelongsPackage: com.easygo.config
* @Author: bruceliu
* @QQ:1241488705
* @CreateTime: 2020-04-08 11:20
* @Description: SpringBoot SpringData Redis
*/
@Configuration
public class RedisConfig {
@Bean
RedisMessageListenerContainer container(@Qualifier("jedisConnectionFactory") JedisConnectionFactory factory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(factory);
container.addMessageListener(new RedisMessageListener(), new PatternTopic("__keyevent@0__:expired"));
return container;
}
}
4.3.キーを追加し、有効期限を設定
/**
* Redis Redis key
*/
@Test
public void testSetValueWithTimeOut() {
//key 10
redisTemplate.opsForValue().set("message", " , ...", 30L, TimeUnit.SECONDS);
System.out.println(" ");
}
4.4.クエリーキーの有効期限
public Long testTimeTTL(){
// key
Long time1 = redisTemplate.getExpire("baike");
// key
Long time2 = redisTemplate.getExpire("baike", TimeUnit.SECONDS);
System.out.println(time2);
return time2;
}